Supportnet / Forum / Tabellenkalkulation
AutoFilter für bestimmte Zeichen
Frage
[b]Guten morgen![/b]
habe ein kleines problem und komme irgendwie nich weiter.
hoffe, dass mir irgendjemand helfen kann/will?!
habe ein vorgefertigtes makro und muss es jetzt bearbeiten.
hab leider nur absolut keine ahnung von vba und noch nie etwas damit zu tun gehabt! :(
Meine frage: wie bekomme ich es hin mein makro zu stoppen, wenn er eine zelle findet die ein "return"-zeichen beinhaltet?
mein makro soll eine tabelle automatisch in csv speichern und bei "return"-zeichen macht er leider nich das was ich will...
wäre nett, wenn mir jemand helfen könnte!
danke,
marie
Antwort 1 von CaroS
Hallo Bienchen_MC,
Du müsstest wahrscheinlich nach dem Zeichen vbCr oder vbLf oder nach dem Doppelzeichen vbCrLf suchen. Die drei eben genannten Dinger sind global gültige VBA-Konstanten, hinter denen sich die Zeichen mit dem ASCII-Code 13, 10 bzw. 13 und 10 verbergen. In den meisten Fällen sorgen schon die beiden einzelnen Zeichen für einen "Zeilenumbruch", in DOS und DOS-ähnlichen Systemen werden aber häufig beide Zeichen nacheinander verwendet, um einen "Zeilenumbruch" darzustellen. Siehe auch VBA-Hilfe zum Thema "Verschiedene Konstanten".
Allerdings halte ich es für ein nicht sehr aussichtsreiches Vorhaben, dass jemand, der noch nie etwas mit VBA zu tun hatte, mit einer solchen Aufgabe beginnt. Das kann leicht zu allem möglichen führen, nur nicht zu einem schnellen Ergebnis.
Trotzdem alles Gute dabei!
CaroS
Du müsstest wahrscheinlich nach dem Zeichen vbCr oder vbLf oder nach dem Doppelzeichen vbCrLf suchen. Die drei eben genannten Dinger sind global gültige VBA-Konstanten, hinter denen sich die Zeichen mit dem ASCII-Code 13, 10 bzw. 13 und 10 verbergen. In den meisten Fällen sorgen schon die beiden einzelnen Zeichen für einen "Zeilenumbruch", in DOS und DOS-ähnlichen Systemen werden aber häufig beide Zeichen nacheinander verwendet, um einen "Zeilenumbruch" darzustellen. Siehe auch VBA-Hilfe zum Thema "Verschiedene Konstanten".
Allerdings halte ich es für ein nicht sehr aussichtsreiches Vorhaben, dass jemand, der noch nie etwas mit VBA zu tun hatte, mit einer solchen Aufgabe beginnt. Das kann leicht zu allem möglichen führen, nur nicht zu einem schnellen Ergebnis.
Trotzdem alles Gute dabei!
CaroS
Antwort 2 von Bienchen_MC
Hallo CaroS,
Danke schön schon einaml für deinen Tip!
Werde mich da schon irgendwie durchbeißen :)
konnte mir leider meine aufgabe nich aussuchen...
hab generell auch nur wenig programmierkenntnisse aber hoffe es klappt trotzem irgendwie!
lg marie
Danke schön schon einaml für deinen Tip!
Werde mich da schon irgendwie durchbeißen :)
konnte mir leider meine aufgabe nich aussuchen...
hab generell auch nur wenig programmierkenntnisse aber hoffe es klappt trotzem irgendwie!
lg marie
Antwort 3 von CaroS
Hallo Bienchen_MC,
wenn das Makro und er Auftraggeber nichts dagegen haben, kannst Du das Makro (und vielleicht auch ein paar Beispieldaten?) ja mal hierher kopieren, damit man sich eine genauere Vorstellung machen kann, was da überhaupt abläuft.
Denn eigentlich braucht man kein Makro, um Excel-Daten als csv-Daten abzuspeichern, das macht das Speichern unter mit der richtigen Einstellung des Dateityps von ganz allein. Wenn es dafür trotzdem bereits ein Makro gibt, das aber die Problematik "Zeilenschaltung" nicht berücksichtigt, muss das ja einen Grund haben.
Andererseits, was soll denn grundsätzlich getan werden, wenn in der einen oder anderen Zelle nun eine "Zeilenschaltung" vorkommt? Wie willst Du damit umgehen? Erst das Makro über alle zu exportierenden Zellen drüberlaufen lassen, dabei sämtliche "Zeilenschaltung" löschen, dann alle "Zeilenschaltung" wieder herstellen? Oder gelöscht lassen? Wie kommen denn die Zeilenschaltungen überhaupt in die Excel-Tabelle(n) hinein und welchen Zweck haben sie dort?
(Ich weiß über Alt + Eingabe und Format -- Zellen... -- Ausrichtung -- Zeilenumbruch so halbwegs bescheid, aber welche Rolle spielt das alles für Euch? Oder sind das alles nur ungewollte Zufälle?)
Falls Du eine Datei veröffentlichen willst, kannst Du http://www.netupload.de/ nehmen.
Gruß,
CaroS
wenn das Makro und er Auftraggeber nichts dagegen haben, kannst Du das Makro (und vielleicht auch ein paar Beispieldaten?) ja mal hierher kopieren, damit man sich eine genauere Vorstellung machen kann, was da überhaupt abläuft.
Denn eigentlich braucht man kein Makro, um Excel-Daten als csv-Daten abzuspeichern, das macht das Speichern unter mit der richtigen Einstellung des Dateityps von ganz allein. Wenn es dafür trotzdem bereits ein Makro gibt, das aber die Problematik "Zeilenschaltung" nicht berücksichtigt, muss das ja einen Grund haben.
Andererseits, was soll denn grundsätzlich getan werden, wenn in der einen oder anderen Zelle nun eine "Zeilenschaltung" vorkommt? Wie willst Du damit umgehen? Erst das Makro über alle zu exportierenden Zellen drüberlaufen lassen, dabei sämtliche "Zeilenschaltung" löschen, dann alle "Zeilenschaltung" wieder herstellen? Oder gelöscht lassen? Wie kommen denn die Zeilenschaltungen überhaupt in die Excel-Tabelle(n) hinein und welchen Zweck haben sie dort?
(Ich weiß über Alt + Eingabe und Format -- Zellen... -- Ausrichtung -- Zeilenumbruch so halbwegs bescheid, aber welche Rolle spielt das alles für Euch? Oder sind das alles nur ungewollte Zufälle?)
Falls Du eine Datei veröffentlichen willst, kannst Du http://www.netupload.de/ nehmen.
Gruß,
CaroS
Antwort 4 von Bienchen_KA
mein problem ist es, dass ich mit der normalen ´speichern unter...´-funktion keine csv datei erstellen kann, die als trennzeichen kommas verwendet.
und genau diese brauch ich für das dokument zur weiterverarbeitung...
das ist der code, den ich bis jetzt habe:
wegen dem zeilenumbruch habe ich mir eigentlich nur gedacht dass er vielleicht vorher prüft, ob ein zeilenumbruch vorkommt und dann gegebenenfalls eine Fehlermeldung und abbruch bringt.
war mir auch gar nicht sicher, ob ich das mit einer autofilter funktion hinbekomme, aber habe leider keine andere möglichkeit gefunden!
lg, marie
und genau diese brauch ich für das dokument zur weiterverarbeitung...
das ist der code, den ich bis jetzt habe:
Public Sub Write_Csv()
Dim outputline As String
F = FreeFile(0)
fname = InputBox("Enter the filename with Path:", "Please Enter Output File Name:")
MsgBox "File Selected is: " & fname
If fname <> False Then
Open fname For Output As #F
Set Rng = ActiveCell.CurrentRegion
Debug.Print Rng.Address
FCol = Rng.Columns(1).Column
LCol = Rng.Columns(Rng.Columns.Count).Column
Frow = Rng.Rows(1).Row
Lrow = Rng.Rows(Rng.Rows.Count).Row
For i = Frow To Lrow
outputline = ""
For j = FCol To LCol
If j <> LCol Then
outputline = outputline & Cells(i, j) & ","
Else
outputline = outputline & Cells(i, j)
End If
Next j
´vbCrLf
Print #F, outputline
Next i
Close #F
End If
MsgBox "Done"
End Subwegen dem zeilenumbruch habe ich mir eigentlich nur gedacht dass er vielleicht vorher prüft, ob ein zeilenumbruch vorkommt und dann gegebenenfalls eine Fehlermeldung und abbruch bringt.
war mir auch gar nicht sicher, ob ich das mit einer autofilter funktion hinbekomme, aber habe leider keine andere möglichkeit gefunden!
lg, marie
Antwort 5 von CaroS
Hallo Bienchen_MC,
da kamen bei mir gerade mehrere Sachen dazwischen, deshalb hat es etwas gedauert. Wenn innerhalb einer Zelle ein Zeilenschaltungs-Zeichen vorkommt, wird es einfach nicht in die csv-Datei übernommen. Das Makro bricht nicht ab, sondern zeigt eine Meldung an. Wenn Du die Meldung nicht haben möchtest, kannst du die beiden Zeilen (siehe Makrocode) weglassen. Ansonsten läuft das Makro genau so wie vorher, bis auf die fett geschriebenen Erweiterungen wurde nichts weiter verändert.
Du müsstes jetzt mal testen, ob die Laufzeit des Makros noch in Ordnung ist. Je größer die Datenmenge, die da exportiert wird, um so eher merkt man, dass jedes einzelne Zeichen "angefasst" und kontrolliert wird, bevor es in die Datei kommt. Mit ein paar mehr Programmzeilen könnte man das auch noch ein bisschen schneller programmieren.
Gruß,
CaroS
da kamen bei mir gerade mehrere Sachen dazwischen, deshalb hat es etwas gedauert. Wenn innerhalb einer Zelle ein Zeilenschaltungs-Zeichen vorkommt, wird es einfach nicht in die csv-Datei übernommen. Das Makro bricht nicht ab, sondern zeigt eine Meldung an. Wenn Du die Meldung nicht haben möchtest, kannst du die beiden Zeilen (siehe Makrocode) weglassen. Ansonsten läuft das Makro genau so wie vorher, bis auf die fett geschriebenen Erweiterungen wurde nichts weiter verändert.
Du müsstes jetzt mal testen, ob die Laufzeit des Makros noch in Ordnung ist. Je größer die Datenmenge, die da exportiert wird, um so eher merkt man, dass jedes einzelne Zeichen "angefasst" und kontrolliert wird, bevor es in die Datei kommt. Mit ein paar mehr Programmzeilen könnte man das auch noch ein bisschen schneller programmieren.
Public Sub Write_Csv()
Dim outputline As String, Zelle_i_j As String, z As String, k As Integer
F = FreeFile(0)
fname = InputBox("Enter the filename with Path:", "Please Enter Output File Name:")
MsgBox "File Selected is: " & fname
If fname <> False Then
Open fname For Output As #F
Set Rng = ActiveCell.CurrentRegion
Debug.Print Rng.Address
FCol = Rng.Columns(1).Column
LCol = Rng.Columns(Rng.Columns.Count).Column
Frow = Rng.Rows(1).Row
Lrow = Rng.Rows(Rng.Rows.Count).Row
For i = Frow To Lrow
outputline = ""
For j = FCol To LCol
Zelle_i_j = ""
For k = 1 To Len(Cells(i, j))
z = Mid(Cells(i, j), k, 1)
If Asc(z) <> 13 And Asc(z) <> 10 Then
Zelle_i_j = Zelle_i_j & z
Rem Die nächsten beiden Code-Zeilen: Else und Msgbox ... können weggelassen werden.
Else
MsgBox "Eine Zeilenschaltung wurde nicht exportiert.", , "Zelle " & Cells(i, j).Address
End If
Next k
If j <> LCol Then
outputline = outputline & Zelle_i_j & ","
Else
outputline = outputline & Zelle_i_j
End If
Next j
Rem vbCrLf
Print #F, outputline
Next i
Close #F
End If
MsgBox "Done"
End SubGruß,
CaroS
Antwort 6 von CaroS
Hallo Bienchen_MC,
die schnellere Variante sieht so aus:
Gruß,
CaroS
die schnellere Variante sieht so aus:
Public Sub Write_Csv_2()
Dim outputline As String, Ohne_Chr10 As String, Zelle_i_j As String, start As Long, pos As Long
F = FreeFile(0)
fname = InputBox("Enter the filename with Path:", "Please Enter Output File Name:")
MsgBox "File Selected is: " & fname
If fname <> False Then
Open fname For Output As #F
Set Rng = ActiveCell.CurrentRegion
Debug.Print Rng.Address
FCol = Rng.Columns(1).Column
LCol = Rng.Columns(Rng.Columns.Count).Column
Frow = Rng.Rows(1).Row
Lrow = Rng.Rows(Rng.Rows.Count).Row
For i = Frow To Lrow
outputline = ""
For j = FCol To LCol
pos = InStr(1, Cells(i, j), Chr(10))
If pos = 0 Then
Ohne_Chr10 = Cells(i, j)
Else
Ohne_Chr10 = ""
start = 1
Do While pos > 0
Rem Die Msgbox-Zeile kann weggelassen werden.
MsgBox "Eine Zeilenschaltung wurde nicht exportiert.", , "Zelle " & Cells(i, j).Address
If pos > start Then Ohne_Chr10 = Ohne_Chr10 & Mid(Cells(i, j), start, pos - start)
start = pos + 1
pos = InStr(start, Cells(i, j), Chr(10))
Loop
Ohne_Chr10 = Ohne_Chr10 & Mid(Cells(i, j), start, Len(Cells(i, j)) - start + 1)
End If
pos = InStr(1, Ohne_Chr10, Chr(13))
If pos = 0 Then
Zelle_i_j = Ohne_Chr10
Else
Zelle_i_j = ""
start = 1
Do While pos > 0
Rem Die Msgbox-Zeile kann weggelassen werden.
MsgBox "Eine Zeilenschaltung wurde nicht exportiert.", , "Zelle " & Cells(i, j).Address
If pos > start Then Zelle_i_j = Zelle_i_j & Mid(Ohne_Chr10, start, pos - start)
start = pos + 1
pos = InStr(start, Ohne_Chr10, Chr(13))
Loop
Zelle_i_j = Zelle_i_j & Mid(Ohne_Chr10, start, Len(Ohne_Chr10) - start + 1)
End If
If j <> LCol Then
outputline = outputline & Zelle_i_j & ","
Else
outputline = outputline & Zelle_i_j
End If
Next j
Rem vbCrLf
Print #F, outputline
Next i
Close #F
End If
MsgBox "Done"
End SubGruß,
CaroS
Antwort 7 von Bienchen_MC
Hallo CaroS,
habe gerade deinen code ausprobiert! klappt ja echt super!!
vielen vielen dank, dass du mir so geduldig geholfen hast :)
hätte nicht gedacht, dass ich in solchen foren so viele hilfsbereite menschen finde!
lg und schönen abend noch!
marie
habe gerade deinen code ausprobiert! klappt ja echt super!!
vielen vielen dank, dass du mir so geduldig geholfen hast :)
hätte nicht gedacht, dass ich in solchen foren so viele hilfsbereite menschen finde!
lg und schönen abend noch!
marie
Antwort 8 von CaroS
Danke und ebenfalls einen schönen Abend! CaroS

