Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1456to1460
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
Inhaltsverzeichnis

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

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

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 :-?

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.

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:-?
:-?

36 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige