Supportnet Computer
Planet of Tech

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

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

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

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:

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 Sub


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

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.

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 Sub


Gruß,
CaroS

Antwort 6 von CaroS

Hallo Bienchen_MC,

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 Sub


Gruß,
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

Antwort 8 von CaroS

Danke und ebenfalls einen schönen Abend! CaroS

Ich möchte kostenlos eine Frage an die Mitglieder stellen:


Ähnliche Themen:


Suche in allen vorhandenen Beiträgen: