Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Split-Funktion in VBA

Forumthread: Split-Funktion in VBA

Split-Funktion in VBA
15.11.2015 22:37:43
Emre
Hallo,
habe vermutlich ein einfach zu lösendes Problem. Ich habe eine Text-Datei die zu Excel importiert wird (per VBA, mit einem Button). In dieser Datei befinden sich Tausende Werte die nebeneinander geschrieben sind, diese werden in Excel untereinander aufgelistet. Das alles funktionierte bisher auch sehr gut aber letztens habe ich bei einer Datei festgestellt, dass das Tool einen Fehler ausgab. Nach langer Sucherei fand ich den Fehler.
Das Trennzeichen, mit dem ich die nebenstehenden Werte trenne und in Excel untereinander aufliste, ist ein Leerzeichen Komma Leerzeichen ( , ). Einer dieser Werte hat genau diese Folge in seiner Beschreibung stehen, daher der Fehler. Jetzt wollte ich den Teil im Code so umbauen das es passt. Die Werte haben folgenden Aufbau: 12345: Beispielwert , 4567: Beispielwert 1 .....
Was jetzt als Trennung passt wäre: " , Zahl:"
Der Teil im Code ist der hier:
vntArrayWerte = Split(strText, " , ")
Wie kann ich den Bereich so umändern, das es passt?
Gruß
kesici

Anzeige

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Es wäre sicher sinnvoller, das 'Pferd anders-...
16.11.2015 04:30:32
Luc:-?
…herum aufzuzäumen', kesici,
also die PseudoTrenner zu beseitigen, denn Split fktioniert nur mit einem eindeutigen Trenner. Allerdings könnte es einfacher sein, die echten Trenner festzustellen und zu ersetzen, wenn ggf auch etwas zeitaufwendiger, zB so:
Do While deinText Like "* , #*"  'für primär pos=0
pos = Instr(pos + 1, deinText, " , ")
If CBool(pos) Then
If IsNumeric(Mid(deinText, pos + 4, 1)) Then _
deinText = Left(deinText, pos - 1) & Chr(0) & _
Mid(deinText, pos + 4)
Else: Exit Do
End If
Loop
splitText = Split(deinText, Chr(0))
Morrn, Luc :-?

Anzeige
AW: Es wäre sicher sinnvoller, das 'Pferd anders-...
16.11.2015 21:09:07
Emre
Hallo Luc,
danke für die Antwort, doch es wollte nicht klappen. Ich vermute mal, weil es noch viele andere Bedingungen im Code gibt. Daher kam immer ne Fehlermeldung, habe auch verschiedene Varianten ausprobiert aber ging leider auch nicht.
Gibt es vielleicht eine einfachere Lösung?
Gruß
Emre

Anzeige
Möglich, aber dafür müsste man die relevanten ...
17.11.2015 03:23:37
Luc:-?
…Teile deines PgmCodes kennen, Emre;
einfacher wäre es evtl, (manuell) per Suchen und ggf Ersetzen alle " , "-Stellen „abzuklappern“ und das vor Komma sinnlose 1.Leerzeichen zu entfernen.
Morrn, Luc :-?
Besser informiert mit …

Anzeige
AW: Möglich, aber dafür müsste man die relevanten ...
17.11.2015 13:42:39
Emre
Also ich weiß nicht ob es dann so hilfreich wäre, wenn das 1. Leerzeichen entfernt wird, weil das meiner Sicht nach die einzige Zeichenfolge ist, die zur Trennung der Werte genommen werden kann. Oder man könnte ein Leerzeichen Komma 4-5-stellige Zahl Doppelpunkt ( , #####:) zur Trennung nehmen, das wäre wahrscheinlich noch eindeutiger.
Das ist der Bereich, eigentlich auch fast der ganze Code. Was ich noch erwähnen sollte ist, dass dieser Code die in der Textdatei nebenstehenden Werte trennt und in Excel untereinander auflistet und dann noch weitere Werte die danach folgen und die untereinander aufgelistet sind, mit zu Excel übernimmt.

If .Show Then
intFileNumber = FreeFile
Open .SelectedItems(1) For Binary As #intFileNumber
strText = Space(LOF(intFileNumber))
Get #intFileNumber, 1, strText
Close #intFileNumber
vntArrayWerte = Split(strText, " , ")      ' zuerst Komma, dann Leerzeichen
lngPos = InStr(vntArrayWerte(0), "Werte:")
If lngPos  0 Then
strAnfang = Mid(vntArrayWerte(0), 1, lngPos + 6)
vntArrayWerte(0) = Mid(vntArrayWerte(0), lngPos + 6)
ThisWorkbook.Worksheets("txt.File").Cells(1, 1).Value = strAnfang
End If
strText = vntArrayWerte(UBound(vntArrayWerte))
ReDim Preserve vntArrayWerte(UBound(vntArrayWerte) - 1)
ThisWorkbook.Worksheets("txt.File").Cells(1, 1).Resize( _
UBound(vntArrayWerte) + 1) = Application.Transpose(vntArrayWerte)
lngPos = UBound(vntArrayWerte) + 2
Erase vntArrayWerte
vntArrayWerte = Split(strText, vbCrLf)
For lngFN = 0 To UBound(vntArrayWerte)
If Mid(vntArrayWerte(lngFN), 1, 1)  "=" Then
ThisWorkbook.Worksheets("txt.File").Cells(lngPos + lngFN, 1).Value = _
vntArrayWerte(lngFN)
Else
ThisWorkbook.Worksheets("txt.File").Cells(lngPos + lngFN, 1).Value = "'" & _
vntArrayWerte(lngFN)
End If
Next
End If

Anzeige
Das hast du falsch verstanden, ...
17.11.2015 14:12:59
Luc:-?
…Emre;
das Leerzeichen muss nur dort entfernt wdn, wo es offensichtlich falsch ist, weil es keine Trennstelle ist. Auf eine echte Trennstelle soll doch immer eine Zahl folgen?!
Evtl hättest du ja auch eine ungewöhnlichere ZeichenKombi als Trennzeichen wählen können, falls das nicht nur ein vorgegebener Text ist (hatte das anders verstanden!), in dem nach möglichen Trennstellen gesucht wird. Auf jeden Fall ist der so nicht eindeutig und man muss entweder das Eine oder Andere ersetzen.
Was deinen Code betrifft, habe ich dafür frühestens heute Abend Zeit.
Luc :-?

Anzeige
AW: Das hast du falsch verstanden, ...
17.11.2015 14:43:54
Emre
Ahso ja, so würde es natürlich auch gehen. Nur ist es so, dass diese Werte, ständig aus einem Portal heruntergeladen werden und immer wieder solche Tippfehler auftauchen können. Ich könnte die Fehler durch Suchen eventuell finden aber das ganze werden auch andere Leute nutzen und ich denke nicht, dass die sich dann die Mühe machen und nach dem Fehler suchen.
Zu der Zeichenkombi, ich habe auch öfters versucht diese Kombi mit ( , ####:) zu nutzen, kam aber immer wieder eine Fehlermeldung. Ich warte gerne, wäre für jede Hilfe dankbar.
Gruß
Emre

Anzeige
Nur mal kurz zwischendurch, ...
17.11.2015 16:02:38
Luc:-?
…Emre;
" , ####:" fktioniert nur mit VglsOperator Like und dann auch nur in dieser Form "* , ####:*" und für den Text insgesamt. Sagt also nur aus, ob solche echten Trenner überhaupt im Text enthalten sind, aber nicht, wo genau.
Luc :-?

AW: Nur mal kurz zwischendurch, ...
17.11.2015 17:10:38
Emre
Jetzt wird mir auch klar, warum es bei mir nicht geklappt hatte. Ich hatte das mal irgendwo gelesen und ausprobiert, daher die Idee.

Anzeige
Auf der Basis deines PgmCodes habe ich dir, ...
18.11.2015 02:49:13
Luc:-?
…Emre,
mal ein Bsp dafür geschrieben, wie ich mir das vorstelle. Die irrelevanten Teile msst du dann natürlich durch deine Organisation ersetzen:
Sub TrennTest()
Const txIntro$ = "Werte:", txHTrenn$ = " , ", txVTrenn$ = vbCrLf
Dim lngPos As Long, strAnfang$, strText$, vntArrayWerte
strText = ActiveWindow.RangeSelection
Do While strText Like "*" & txHTrenn & "#*"      'primär lngPos=0
lngPos = InStr(lngPos + 1, strText, txHTrenn)
If CBool(lngPos) Then
If IsNumeric(Mid(strText, lngPos + 4, 1)) Then _
strText = Left(strText, lngPos - 1) & Chr(0) & _
Mid(strText, lngPos + 3)
Else: Exit Do
End If
Loop
vntArrayWerte = Split(strText, Chr(0))
lngPos = InStr(vntArrayWerte(0), txIntro)
If CBool(lngPos) Then
strAnfang = Mid(vntArrayWerte(0), 1, lngPos - 1 + Len(txIntro))
vntArrayWerte(0) = LTrim(Mid(vntArrayWerte(0), lngPos + Len(txIntro)))
End If
strText = vntArrayWerte(UBound(vntArrayWerte))
ReDim Preserve vntArrayWerte(UBound(vntArrayWerte) - 1)
For lngPos = 0 To UBound(vntArrayWerte)         'nur als Test
vntArrayWerte(lngPos) = _
Replace(vntArrayWerte(lngPos), txHTrenn, LTrim(txHTrenn))
If MsgBox(vntArrayWerte(lngPos), vbInformation + vbOKCancel, _
strAnfang & " horText " & lngPos + 1) = vbCancel Then Exit For
Next lngPos
vntArrayWerte = Empty: vntArrayWerte = Split(strText, txVTrenn)
For lngPos = 0 To UBound(vntArrayWerte)         'nur als Test
vntArrayWerte(lngPos) = _
Replace(vntArrayWerte(lngPos), txHTrenn, LTrim(txHTrenn))
If MsgBox(vntArrayWerte(lngPos), vbInformation + vbOKCancel, _
strAnfang & " verText " & lngPos + 1) = vbCancel Then Exit For
Next lngPos
End Sub
Mit folgd TestText hat das wie erwartet fktioniert:
Alfa-Werte: 12345: BspWert0 , 4567: BspWert1 , 25999: BspWert2 , 1188: Bsp , Wert3 , 33123: BspWert4 , 1234: BspWert5 , 56789: BspWert6 , 999: BspWert7 , 8888: Bsp , Wert8 , 77777: BspWert9 , 9901: BspWert10
9902: BspWert11
9903: BspWert12
9904: BspWert13
9905: BspWert14

Morrn, Luc :-?

Anzeige
AW: Auf der Basis deines PgmCodes habe ich dir, ...
18.11.2015 17:20:26
Emre
Hallo Luc,
nach langem herumprobieren hab ichs dann doch geschafft und dein Code an anpassen können. Und es hat funktioniert :)
Die Kommas machen keine Probleme mehr. Ein großes Dankeschön an dich, war ne riesen Hilfe
Gruß
Emre

Na, denn iss ja jut unn alleedicht! ;-) Gruß owT
19.11.2015 05:06:50
Luc:-?
:-?
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige

Infobox / Tutorial

Einsatz der Split-Funktion in VBA für Excel


Schritt-für-Schritt-Anleitung

  1. Öffne dein Excel-Dokument und gehe zum Visual Basic for Applications (VBA) Editor (ALT + F11).

  2. Erstelle ein neues Modul: Klicke mit der rechten Maustaste auf "VBAProject (DeinWorkbook)" und wähle Einfügen > Modul.

  3. Füge den folgenden VBA-Code ein, um die Split-Funktion zu verwenden:

    Sub BeispielSplit()
       Dim strText As String
       Dim vntArrayWerte As Variant
       strText = "12345: Beispielwert , 4567: Beispielwert 1"
       vntArrayWerte = Split(strText, " , ") ' Hier wird das Trennzeichen definiert
    
       ' Ausgabe der Werte in die Excel-Tabelle
       Dim i As Long
       For i = LBound(vntArrayWerte) To UBound(vntArrayWerte)
           ThisWorkbook.Worksheets("Sheet1").Cells(i + 1, 1).Value = vntArrayWerte(i)
       Next i
    End Sub
  4. Passe das Trennzeichen an: Wenn deine Werte andere Trennzeichen verwenden, ändere den Code entsprechend. Zum Beispiel:

    vntArrayWerte = Split(strText, " , Zahl:")
  5. Führe den Code aus: Gehe zurück zu Excel und führe das Makro aus (ALT + F8, wähle BeispielSplit und klicke auf Ausführen).


Häufige Fehler und Lösungen

  • Fehler: "Typ nicht übereinstimmend": Stelle sicher, dass der Datentyp von strText korrekt ist und die Split-Funktion mit einem gültigen Trennzeichen verwendet wird.

  • Fehler: Leere Zellen in der Ausgabe: Überprüfe, ob das Trennzeichen im Text tatsächlich vorhanden ist. Wenn nicht, wird das Array leer oder nicht wie erwartet ausgegeben.

  • Fehler bei der Verwendung mehrerer Trennzeichen: Wenn du mehrere Trennzeichen hast, nutze eine Schleife, um die Trennzeichen nacheinander zu ersetzen, bevor du Split anwendest.


Alternative Methoden

  • Verwendung von Replace: Du kannst die Replace-Funktion verwenden, um unerwünschte Leerzeichen oder andere Trennzeichen zu entfernen, bevor du die Split-Funktion anwendest. Beispiel:

    strText = Replace(strText, " , ", ",")
    vntArrayWerte = Split(strText, ",")
  • Regex für komplexe Trennzeichen: Verwende Regular Expressions (Regex) für komplexere Anforderungen, z.B. um Trennzeichen mit Mustern zu definieren.


Praktische Beispiele

  • Beispiel für den Umgang mit Zeilenumbrüchen:

    Dim vntArrayZeilen As Variant
    strText = "Wert1" & vbCrLf & "Wert2" & vbCrLf & "Wert3"
    vntArrayZeilen = Split(strText, vbCrLf)
  • Ein Beispiel für das Splitten mit mehreren Trennzeichen:

    Dim strText As String
    strText = "12345: Beispielwert , 4567: Beispielwert 1 , 8901: Beispielwert 2"
    strText = Replace(strText, " , ", Chr(0))
    Dim vntArrayWerte As Variant
    vntArrayWerte = Split(strText, Chr(0))

Tipps für Profis

  • Verwende Option Explicit: Immer am Anfang deiner Module, um sicherzustellen, dass alle Variablen deklariert sind.
  • Nutze die Debug.Print Funktion: Zum Testen und Debuggen deiner Variablen und Ausgaben.
  • Schreibe Funktionen: Um deinen Code modularer und wiederverwendbarer zu gestalten.

FAQ: Häufige Fragen

1. Was ist die Split-Funktion in VBA?
Die Split-Funktion in VBA trennt einen String in ein Array basierend auf einem definierten Trennzeichen.

2. Wie kann ich mehrere Trennzeichen verwenden?
Du kannst die Replace-Funktion nutzen, um unerwünschte Trennzeichen in ein einheitliches Zeichen zu ändern, bevor du Split anwendest.

3. Funktioniert die Split-Funktion auch in Access VBA?
Ja, die Split-Funktion ist auch in Access VBA verfügbar und funktioniert ähnlich wie in Excel VBA.

4. Wie gehe ich mit Zeilenumbrüchen um?
Verwende vbCrLf als Trennzeichen, um Zeilenumbrüche in einem String zu splitten.

5. Kann ich die Split-Funktion anpassen?
Ja, du kannst das Trennzeichen einfach anpassen, um deinen spezifischen Anforderungen gerecht zu werden.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige