Microsoft Excel

Herbers Excel/VBA-Archiv

Informationen und Beispiele zum Thema MsgBox
BildScreenshot zu MsgBox MsgBox-Seite mit Beispielarbeitsmappe aufrufen

Komma getrennte Werte aus Zelle in Array einlesen | Herbers Excel-Forum


Betrifft: Komma getrennte Werte aus Zelle in Array einlesen von: Steve
Geschrieben am: 02.02.2010 14:02:20

Guten Tag,

Weiss jemand wie man Komma getrennte Werte aus der selben Zelle in einen Array einlesen kann.

Ich könnte das über die "Text to Column" Funktion erreichen, aber es kommt z.T. vor, dass es mehr Spalten brauchen würde als in Excel XP vorhanden.

Zelle A2 hätte z.B. die Werte "20, 40,200,500,222" (z.T. mit Leerschlag nach Komma z.T. ohne)

Per VBA würden diese Werte in einen Array eingelesen: array(0)=20, array(1)=40, array(2)=200 etc...

Die Anzahl der Zahlen die in den Array eingelesen werden varieren aber.

Perfekt wäre es wenn es auch funktionieren würde, falls anstelle eines Kommas ein Semikolon stehen würde (also z.B. "20, 40;200,400;223")

Da die ganze Spalte A solche komma-getrennten Werte hat in den Zellen hat, müsste ich auch irgendwie identifizieren können zu welcher Zeile der Array gehört.
Ich denke mal nicht dass man einen mehrdimensionalen Array kreieren kann, wenn die Zellen eine unterschiedliche Anzahl komma-getrennter Werte in Spalte A haben.... oder doch?

Vielen Dank im Voraus für die Hilfe.

Beste Grüsse
Steve

  

Betrifft: Die Werte in den Zellen sind ja idR Text,... von: Luc:-?
Geschrieben am: 02.02.2010 14:29:36

...zumindest, wenn sie mehr als ein Komma enthalten, Steve;
Bei nur einem Komma wäre ohnehin Semikolon besser, um das Ganze nicht noch komplizierter zu machen. Ein Feld mit variabler Elementeanzahl erzeugst du aus Text am besten mit vbFkt Split — allerdings kann die nur mit jeweils einem Trennzeichen (Delimiter) umgehen. Du musst also am besten zuvor alle Kommata mit vbFkt Replace durch Semikolons ersetzen. Die Variable für das Feld deklarierst (Dim) du als Variant ohne Dimensionsangabe. Im Ergebnis des Splittings entsteht dann ein Variant, der ein 1dimensionales Feld mit nahezu beliebiger Elementeanzahl beinhaltet. Die Elemente spricht man in diesem Fall wie gewohnt an. Hast du aber eine dimensionierte Variable vom Typ Variant deklariert, kannst du jedem ihrer Elemente einen solchen feld-beinhaltenden Variant zuordnen. Deren Elemente wären dann bspw so anzusprechen...
vVar(0)(0) - vVar(0)(1) - ... - vVar(1)(0) - vVar(1)(1) - ...
Gruß Luc :-?


  

Betrifft: AW: Komma getrennte Werte aus Zelle in Array einlesen von: Reinhard
Geschrieben am: 02.02.2010 14:35:11

Hallo Steve,

ich hab da als Ansatz was gebastelt was zum Ende der Laufzeit noch einen kleinen bug hat, es kommt Index-Fehler weil es "zu weit" läuft.

Sub tt()
Dim ArrA()
Dim Zei As Long, Z As Long, S(), Dummy, N, NN, Anz
Z = Cells(Rows.Count, 1).End(xlUp).Row
For Zei = 1 To Z
   ReDim Preserve S(Zei)
   Dummy = Replace(Replace(Cells(Zei, 1), ";", ","), " ", "")
   S(Zei) = Split(Dummy, ",")
   Anz = IIf(UBound(S(Zei)) > Anz, UBound(S(Zei)), Anz)
Next Zei
ReDim ArrA(Zei, Anz)
For N = 1 To Zei
   For NN = 1 To UBound(S(N))
      ArrA(N, NN) = S(N)(NN - 1)
      MsgBox ArrA(N, NN)
   Next NN
Next N
End Sub

Gruß
Reinhard


  

Betrifft: AW: Komma getrennte Werte aus Zelle in Array einlesen von: Josef Ehrensberger
Geschrieben am: 02.02.2010 14:49:51

Hallo Steve,


das geht z.B. so.



Sub aa()
  Dim vntValues() As Variant, vntTmp As Variant
  Dim lngIndex As Long, strSep As String, strSepAlt As String
  
  strSep = ";" 'Trennzeichen
  strSepAlt = "," 'alternatives Trennzeichen
  
  vntTmp = Range("A1:A3")
  
  Redim vntValues(1 To UBound(vntTmp))
  
  For lngIndex = LBound(vntValues) To UBound(vntValues)
    vntValues(lngIndex) = Split(Replace(vntTmp(lngIndex, 1), strSepAlt, strSep), strSep)
  Next
  
  Debug.Print vntValues(1)(0)
  
End Sub


Gruß Sepp



  

Betrifft: Variante... von: Ramses
Geschrieben am: 02.02.2010 14:49:58

Hallo

Probiers mal so

Option Explicit

Sub Demo_Array()
    'Version XP
    Dim i As Long, tmpF As Long
    Dim strText As String, tmpArr() As Variant
    tmpF = 1
    strText = "1,288,388888888,48,5,6,7888,8,9"
    'strText = Range("a1").Text
    ReDim Preserve tmpArr(1)
    For i = 1 To Len(strText)
        If Mid(strText, i, 1) = "," Then
            tmpArr(UBound(tmpArr)) = Mid(strText, tmpF, i - tmpF)
            tmpF = i + 1
            ReDim Preserve tmpArr(UBound(tmpArr) + 1)
        End If
    Next i
    tmpArr(UBound(tmpArr)) = Mid(strText, tmpF, Len(strText) - (tmpF - 1))
    ReDim Preserve tmpArr(UBound(tmpArr))
    'Inhaltskontrolle
    For i = 0 To UBound(tmpArr)
        Debug.Print tmpArr(i)
    Next i
End Sub



Sub Demo_Array2()
    'Version 2003 und später
    Dim i As Long
    Dim strText As String, tmpArr As Variant
    strText = "1,288,388888888,48,5,6,7888,8,9"
    'strText = Range("A1")
    tmpArr = Split(strText, ",")
    For i = 0 To UBound(tmpArr)
        Debug.Print tmpArr(i)
    Next i
End Sub


Gruss Rainer


  

Betrifft: Und noch eine Variante, die... von: Renee
Geschrieben am: 02.02.2010 15:15:04

gleich der Text-to-Column Funktion das Verteilen in die Spalten wahrnimmt, aber bei mehr Einträgen als vorhandene Spalten, den Rest ins Nirwana schickt:

Sub ZuvielTextInSpalten()
    Dim vArr
    Dim lngRow As Long
    With ActiveSheet
        For lngRow = 2 To .Cells(.Rows.Count, 1).End(xlUp).Row
            vArr = Split(Replace(Replace(.Cells(lngRow, 1), " ", ""), _
                                 ",", ";"), ";")
            If UBound(vArr) > -1 Then _
                .Range(.Cells(lngRow, 1), _
                       .Cells(lngRow, _
                              Application.Min(UBound(vArr) + 1, .Columns.Count))) = vArr
        Next lngRow
    End With
End Sub
GreetZ Renée


  

Betrifft: AW: Komma getrennte Werte aus Zelle in Array einlesen von: Steve
Geschrieben am: 02.02.2010 15:33:51

Vielen Dank Luc, Reinhardt, Josef und Rames

Genial!

Jetzt muss ich nur noch die Zahlen wieder richtig auslesen können in diesem Array.
Da man ja nie genau weiss, wieviele Zahlen in der Zelle waren beim auslesen und es sonst diese "subscript out of range" Fehlermeldung gibt, denke ich könnte man neben her noch die Kommas zählen über die folgende Funktion und weiss somit wieviele Zahlen in der Zelle pro Zeile waren.

=LEN(A1)-LEN(SUBSTITUTE(A1;",";""))

wahrscheinlich kann man es auch so einrichten, dass beim "Subscript out of range" Fehler automatisch auf die nächste Koordinate gesprungen wird. Ich muss das mal ausprobieren.

Danke noch einmal für die super Hilfe.

Gruss
Steve


  

Betrifft: AW: Komma getrennte Werte aus Zelle in Array einlesen von: Renee
Geschrieben am: 02.02.2010 15:59:58

Hi Steve,

Was willst du den noch mit Zählen von Trennzeichen rummachen ??
Nach einem

vArr = Spit(expression, separator)

bekommst du doch mit
iAnzahl = UBound(vArr) +1

die Anzahl Elemente in die Variable iAnzahl.

Überhaupt frage ich mich langsam, was den das Ziel der ganzen Übung ist!

GreetZ Renée


  

Betrifft: AW: Komma getrennte Werte aus Zelle in Array einlesen von: Steve
Geschrieben am: 02.02.2010 16:34:47

Vielen Dank Renee

Stimmt, sorry war wohl etwas zu kompliziert gedacht.

Was ich damit anstelle ist folgendes:

Es geht um Abhängigkeiten. Das heisst es gibt 2 Listen welche über XML ins Excel gelangen. Die eine Liste enthält Angaben zu welchen IDs aus der anderen Liste Abhängigkeiten bestehen. Es wird dann ein Report gebildet, der diese Abhängigkeiten über Gruppierungen etc darstellt und die entsprechenden Links dazu liefert.

Gruss
Steve


Beiträge aus den Excel-Beispielen zum Thema "Komma getrennte Werte aus Zelle in Array einlesen"