Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
964to968
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
964to968
964to968
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Warum werden Leerzellen eliminiert?

Warum werden Leerzellen eliminiert?
27.03.2008 18:10:00
Peter
Guten Abend
Nach genau vorgegebenen Kriterien eliminiere ich Leerzeichen in verschiedenen Spalten.
Nicht klar ist mir, weshalb diese auch in Spalte B eliminiert werden. In dieser Spalte ist der längste String über 40 Zeichen, und der müsste doch mit
lngLang abgefangen werden?
Wo mache ich wohl den Überlegungsfehler?
Gruss, Peter
Sub Leerzeilen()
Dim i As Integer, lngR As Long, strSp As String
Dim rng As Range
Dim lngLang As Long
'Bei jeder identifizierten Spalte werden die Leerzeichen entfernt.
With Application.WorksheetFunction
'Zeilen 1 bis 30 werden überprüft, kann bei Bedarf erweitert werden, jedoch nicht über 52, da ab Spalte 53 (BA)
'fixe Einträge generiert werden
For i = 1 To 30
lngR = Cells(Rows.Count, i).End(xlUp).Row 'der zu überprüfende Range innerhalb der Spalte i wird festgelegt
strSp = SpalteTxt_ausNum(i) 'mit Hilfe der Funktion wird ermittelt, welche(r) Spaltenbuchstabe die aktuelle Spalte hat
lngLang = Laengste(Sheets("CW").Range(Cells(1, i), Cells(lngR, i)))
If .CountIf(Sheets("CW").Columns(i), "*.*") > 0 Or .CountIf(Sheets("CW").Columns(i), "*-*") > 0 And _
.Max(Sheets("CW").Columns(i)) lngLang 'hier wird überprüft, ob der Bereich die vorne beschriebenen 3 Bedingungen
'kumulativ erfüllt
Set rng = Range(Cells(1, i), Cells(lngR, i)) 'wenn die Bedingungen kumulativ erfüllt werden, werden im aktuellen Bereich alle
'Leerzeichen eliminiert
If Not rng Is Nothing Then rng.Replace What:=" ", Replacement:="", LookAt:=xlPart
End If
Next
End With
End Sub


Function SpalteTxt_ausNum(iNr As Integer) 'diese Funktion ermittelt den Buchstaben der Spalte i
SpalteTxt_ausNum = Left(Cells(1, iNr).Address(0, 0), 1 - (iNr > 26) - (iNr > 702))
End Function



Public Function Laengste(Bereich As Range) As Long
Dim Zelle As Range
For Each Zelle In Bereich
If Len(Zelle) > Laengste Then Laengste = Len(Zelle)
Next Zelle
End Function


6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Warum werden Leerzellen eliminiert?
27.03.2008 19:37:00
Tino
Hallo,
könntest du eine lauffähige Tabelle laden, mit der man experimentieren kann?
Gruß
Tino

AW: Warum werden Leerzellen eliminiert?
27.03.2008 19:58:00
Erich
Hi Peter,
schau dir das mal an:

Sub Leerzeilen2()
Dim i As Integer, lngR As Long, strSp As String
Dim rng As Range
Dim lngLang As Long
Dim wsCW As Worksheet
'Bei jeder identifizierten Spalte werden die Leerzeichen entfernt.
Set wsCW = Sheets("CW")
With Application.WorksheetFunction
'Zeilen 1 bis 30 werden überprüft, kann bei Bedarf erweitert werden,
'  jedoch nicht über 52, da ab Spalte 53 (BA) fixe Einträge generiert werden
For i = 1 To 3 '0
'der zu überprüfende Range innerhalb der Spalte i wird festgelegt
lngR = wsCW.Cells(wsCW.Rows.Count, i).End(xlUp).Row
'mit Hilfe der Funktion wird ermittelt,
'  welche(r) Spaltenbuchstabe die aktuelle Spalte hat
strSp = SpalteTxt_ausNum(i)
lngLang = Laengste(wsCW.Range(wsCW.Cells(1, i), wsCW.Cells(lngR, i)))
If (.CountIf(wsCW.Columns(i), "*.*") > 0 Or _
.CountIf(wsCW.Columns(i), "*-*") > 0) And _
.Max(wsCW.Columns(i))  26) - (iNr > 702))
End Function
Public Function Laengste(Bereich As Range) As Long
Laengste = Evaluate("=Max(Len(" & Bereich.Address & "))")
End Function
Sub tst()
MsgBox True Or True And False    ' deine Version
MsgBox True Or (True And False)  ' entspricht dem hier
MsgBox (True Or True) And False  ' Wolltest du das hier?
End Sub

Kann es sein, dass du die beiden "OR"-Bedingungen zusammen in eine Klammer stellen musst?
Aufgefallen ist mir noch:
Zum Teil verwendest du "Sheets("CW")....", an einigen Stellen aber nicht.
Ist CW das aktive Blatt? Dann könntest du das Sheets("CW"). weglassen.
Wenn das nicht sicher ist, sollte es überall stehen. ("With" ist ja leider schon verbraucht.)
Sheets("CW").Range(Cells(1, i), Cells(lngR, i))
gibt einen Fehler, wenn CW nicht das aktive Blatt ist, denn z. B. Cells(1, i) bezieht sich nur auf das aktive Blatt.
Es müsste dann heißen:
Range(Sheets("CW").Cells(1, i), Sheets("CW").Cells(lngR, i))
oder
Sheets("CW").Range(Sheets("CW").Cells(1, i), Sheets("CW").Cells(lngR, i))
Stattdessen habe ich oben die Variable wkCW verwendet.
Für die Fkt. Laengste habe ich einen Alternativvorschlag gemacht.
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort

Anzeige
AW: Warum werden Leerzellen eliminiert?
27.03.2008 23:25:00
Peter
Hallo Erich
Vielen Dank für deine ausführliche Rückmeldung. Es ist tatsächlich so, dass ich die beiden oder Bedingungen zusammen in eine Klammer stellen muss.
Zudem habe ich den Code nun so umgesetzt, dass nicht zwingend das Sheet "CW" aktiv sein muss.
Das klappt nun bis auf eine Ausnahme:
Wenn ich die Funktion "laengste"
aufrufe, stoppt mir der Code bei der Funktion

Public Function Laengste(Bereich As Range) As Long
Laengste = Evaluate("=Max(Len(" & Bereich.Address & "))")
End Function


und bringt die Meldung:
Typen unverträglich
Wie muss ich den Bereich und wohl auch die das Sheet CW übergeben, dass die Funktion ausgewertet kann?
Vielen Dank für deine Hilfe!
Peter

Anzeige
AW: Warum werden Leerzellen eliminiert?
28.03.2008 08:31:00
Erich
Hi Peter,
sorry, da habe ich selbst nicht beherzigt, was ich geschrieben habe:
"Bereich.Address" in der Funktion "Laengste" bezieht sich auf das aktuelle Blatt,
nicht auf das Blatt, zu dem der Bereich gehört.
Zwei Möglichkeiten sehe ich:

Public Function Laengste(Bereich As Range) As Long
Laengste = Evaluate("=Max(Len(" & Bereich.Address(external:=True) & "))")
End Function
'oder
Public Function Laengste2(Bereich As Range) As Long
Laengste2 = Evaluate("=Max(Len('" & Bereich.Parent.Name & "'!" & Bereich.Address & "))")
End Function

In der ersten Variante werden durch "external=True" Mappen- und Blattname einbezogen,
in der zweiten Variante liefert "Bereich.Parent.Name" den Namen des Blattes, zu dem Bereich gehört.
Aufgerufen wird die Funktion unverändert mit


lngLang = Laengste(wsCW.Range(wsCW.Cells(1, i), wsCW.Cells(lngR, i)))
'oder
lngLang = Laengste(Range(wsCW.Cells(1, i), wsCW.Cells(lngR, i)))

Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort

Anzeige
AW: Warum werden Leerzellen eliminiert?
28.03.2008 10:19:00
Peter
Guten Tag Erich
Vielen Dank für die Rückmeldung. Ich habe beide Varianten ausgetestet und es funktioniert einwandfrei. Nun habe ich auch viel betreffend Syntax gelernt. Darf ich dir zur Abrundung nochmals eine Frage stellen? Meine ursprüngliche Version funktioniert, wenn ich sie wie folgt aufrufe - egal, ob cw die aktive Tabelle ist oder nicht. Weshalb muss ich hier den Bereich nicht näher spezifizieren (mit parent oder external)?
Danke, Peter
lngLang = Laengste4(wsCW.Range(wsCW.Cells(1, i), wsCW.Cells(lngR, i)))

Public Function Laengste4(Bereich As Range) As Long
Dim Zelle As Range
For Each Zelle In Bereich
If Len(Zelle) > Laengste4 Then Laengste4 = Len(Zelle)
Next Zelle
End Function


Anzeige
AW: Warum werden Leerzellen eliminiert?
28.03.2008 11:51:04
Erich
Hallo Peter,
freut mich darüber, dass es funzt - und noch mehr über deine Frage.
Das Problem tritt bei den beiden neuen Laengste-Versionen dadurch auf,
dass Bereich.Address die Adresse normalerweise ohne Blatt- und Mappennamen zurückgibt,
also einfach so etwas wie "A2:B4". Wenn man dann damit arbeitet, geschieht das auf dem aktuellen Blatt.
Das ist genau so wie bei Formeln:
=A1+B2 addiert zwei Zellen des Blatts, auf dem die Formel steht.
=Tabelle2!A1+Tabelle2!B2 addiert zwei Zellen des von Tabelle2, egal, in welchem Blatt die Formel steht.
"external" ergänzt die Adresse um Mappen- und Blattnamen,
mit "Bereich.Parent.Name" wird er gesondert ermittelt und vor die Einfach-Adresse gestellt.
Beides dient dazu, die MAX(LEN(...))-Arrayformel auf dem Blatt auszuführen, zu dem Bereich gehört.
In Laengste4() arbeitest du nicht mit "Address". Bearbeitet werden alle Zellen des übergebenen Bereichs,
und der gehört nun mal zu einem bestimmten Blatt.
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige