VBA: Zeichen in String suchen und auslesen

Hallo Zusammen

Ich habe folgende Sorge:
Es gibt einen String in Form von z.B.
XVals = „Tabelle1!R4C36“,„Tabelle1!R7C36“,„Tabelle1!R12C36“

Ich möchte nun alle Zeilenwerte (Zahl hinter dem „R“) in einen Array schreiben.

Das Array sollte dann so aussehen:
DatenArray = {4,7,12}

Ich habe schon versucht mit den Funktionen InStr(), Mid(), Left() etc. da ich aber kein wirklicher Profi bin, komme ich damit nicht wirklich gut klar.

Danke für eine rasche Hilfe!

Mike

Hallo Mike,

XVals = „Tabelle1!R4C36“,„Tabelle1!R7C36“,„Tabelle1!R12C36“

Ich möchte nun alle Zeilenwerte (Zahl hinter dem „R“) in einen
Array schreiben.

meinst du so:

Sub tt()
Dim XVals, Zei
XVals = „Tabelle1!R4C36“
Zei = Mid(XVals, InStr(XVals, „R“) + 1, InStr(XVals, „C“) - InStr(XVals, „R“) - 1)
MsgBox Zei
End Sub

Das Array sollte dann so aussehen:
DatenArray = {4,7,12}

Das geht nicht, nur die letzte Dimension kannst du variabel gestalten:

Redim DatenArray(4,7,Zei)

Eine aufwändige Möglichkeit wäre noch den Code erst zur laufzeit zu erzeugen, dann ginge es alle Dimensionen erst zur Laufzeit zu dimensionieren. Dies entspräche dann quasi Dim DatenArray(x1,x2,x3)

Gruß
Reinhard

Ich habe schon versucht mit den Funktionen InStr(), Mid(),
Left() etc. da ich aber kein wirklicher Profi bin, komme ich
damit nicht wirklich gut klar.

Danke für eine rasche Hilfe!

Mike

Hallo Reinhard

Danke für die rasche Antwort.

Ich glaube, ich habe das ganze etwas kompliziert beschrieben. Das Array würde ich extra Gross wählen, damit es bestimmt reicht:
–> Dim DatenArray(50) as integer

Ich möchte dann die einzelnen Datenfelder des Array (DatenArray(0) … DatenArray(x)) abfüllen.

Mein String xVals hat jeweils unterschiedlichen Inhalt (ich lesen diesen aus einem Diagramm aus). Machmal besteht dieser aus nur einem Wert (xVals = „Tabelle1!R7C36“). Hier würde mein Array so aussehen: DatenArray(0) = 7
DatenArray(1) = „“
.
.
.
DatenArray(50) = „“

Wenn mein xVals grösser ist z.B. xVals = „Tabelle1!R4C36“,„Tabelle1!R7C36“,„Tabelle1!R12C36“ würde das Array so aussehen:
DatenArray(0) = 4
DatenArray(1) = 7
DatenArray(2) = 12
DatenArray(3) = „“
.
.
.
DatenArray(50) = „“

Wie gesagt, ich habe kein Problem das Array so gross zu machen, dass es sicher reicht. Mein Ziel ist es, die Zeilennummer aus dem xVals heraus zu schälen --> Zeilennummer 4, 7,und 12.

Siehst du hier einen Weg?

Danke für die Unterstützung.
Mike

Wenn mein xVals grösser ist z.B. xVals =
„Tabelle1!R4C36“,„Tabelle1!R7C36“,„Tabelle1!R12C36“ würde das
Array so aussehen:

Hallo Mike,

das geht so nicht.
Kann es sein daß der Ausdruck lautet:

xVals =„Tabelle1!R4C36,Tabelle1!R7C36,Tabelle1!R12C36“

Gruß
Reinhard

Hallo Reinhard

Noch nicht, aber ich glaube mein Wissen würde ausreichen um den Text so zusammen zu stellen, sprich die " zu entfernen.

Würdest du dann eine Chance sehen?

Mike

Hallo Mike,

Noch nicht, aber ich glaube mein Wissen würde ausreichen um
den Text so zusammen zu stellen, sprich die " zu entfernen.

Würdest du dann eine Chance sehen?

aber natürlich, ich nenne mich gelegentlich Bighope :smile:))

Mein problem ist

xVals =„Tabelle1!R4C36“,„Tabelle1!R7C36“,„Tabelle1!R12C36“

wird nicht akzeptiert, wie also liest du da irgendwas aus Diagrammen aus und wie sieht das Ausgelesene genau aus.

Das bißchen Stringaufsplittung kriegt man dann schon hin, ich muß ertsmal exakt wissen wie der String aussieht/aussehen könnte, der vorliegt.

Gruß
Reinhard

Hi Reinhard

Tja, ich hoffe du machst deinem Gelegenheitsnamen alle Ehre.

Also, ich lesen mit foglendem VBA code aus:
xVals = ActiveChart.SeriesCollection(1).Formula

Ich erhalten dann exakt folgendes (Beispiel, kann auch mit anderen Zellen-Werten sein):
xVals = „=SERIES(Ideensammlung!$S$2,{„Ideensammlung!
R4C35“,„Ideensammlung!R6C35“},(Ideensammlung!$AH$4,Ideensammlung!
$AH$6),1(Ideensammlung!$AJ$4,Ideensammlung!$AJ$6))“

Das Ganze ist als String definiert.

Nun, mit einem Code aus dem Internet (von der Microsoft Page) schaffe ich es zu folgendem zu kommen:

xVals = „Ideensammlung!R4C35“,„Ideensammlung!R6C35“}"
(steht so eins zu eins im Überwachungsfenster von VBA)

Der Code von Microsoft ist übrigens der folgende (versehe den aber nicht wirklich):
xVals = Mid(xVals, InStr(InStr(xVals, „,“), xVals, _
Mid(Left(xVals, InStr(xVals, „!“) - 1), 9)))
xVals = Left(xVals, InStr(InStr(xVals, „}“), xVals, „,“) - 1)

Das am Anfang ausgelesene beinhaltet die Bezeichnung der Datenreihe, die Werte der X-Achse, der Y-Achse und die Werte für die Bubblegrösse (ist ein Bubblediagramm).

Ob ich nun die Zeilennummer von den X-Werten (R4C36) oder den Y-Werten ($AH$4) kommt spielt mir keine Rolle.

Und, besteht noch Grund zur Hoffnung?
Gruss
Mike

hallo Mike,

Tja, ich hoffe du machst deinem Gelegenheitsnamen alle Ehre.

schaun wir mal :smile:

Also, ich lesen mit foglendem VBA code aus:
xVals = ActiveChart.SeriesCollection(1).Formula

Ich erhalten dann exakt folgendes (Beispiel, kann auch mit
anderen Zellen-Werten sein):
xVals = "=SERIES(Ideensammlung!$S$2,{"Ideensammlung!

R4C35",„Ideensammlung!R6C35“},(Ideensammlung!$AH$4,Ideensammlung!
$AH$6),1(Ideensammlung!$AJ$4,Ideensammlung!$AJ$6))"

Und was genau brauchst du daraus, alles nach dem „R“ oder auch die anderen „Zeilen“?

Und, besteht noch Grund zur Hoffnung?

Klar, ein altes Vba-Huhn kämpft bis zum Grill :smile:)

Gruß
Reinhard

Grüezi Mike

Also, ich lesen mit foglendem VBA code aus:
xVals = ActiveChart.SeriesCollection(1).Formula

Ich erhalten dann exakt folgendes (Beispiel, kann auch mit
anderen Zellen-Werten sein):
xVals = "=SERIES(Ideensammlung!$S$2,{"Ideensammlung!

R4C35",„Ideensammlung!R6C35“},(Ideensammlung!$AH$4,Ideensammlung!
$AH$6),1(Ideensammlung!$AJ$4,Ideensammlung!$AJ$6))"

Das kann IMO so nicht ganz korrekt sein, der String wird mir hier nach entfernen der Zeilenumbrüche nicht akzepitert.

Verwende bitte die -Tags zur Darstellung hier im Forum, dann werden die Zeilen nicht umgebrochen.


Mit freundlichen Grüssen

Thomas Ramel

  • MVP für MS-Excel -

Die Grill-Saison ist zwar eröffnet, aber ich stehe eher auf Schwein und Rind :wink:

Eigentlich suche ich alle Zeilen. Sprich aus dem Beispiel (Ursprungs-String):

xVals = "=SERIES(Ideensammlung!$S$2,{"Ideensammlung!R4C35","Ideensammlung!R6C35"},(Ideensammlung!$AH$4,Ideensammlung!$AH$6),1(Ideensammlung!$AJ$4,Ideensammlung!$AJ$6))


... suche ich den Wert 4 (von R4C35 oder $AH$4 für Zeile 4) und den Wert 6 (von R6C35 oder $AH$6 für Zeile 6).


Aus dem durch MS-Code gekürztem wäre es Analog:
Für...


    
    xVals = "Ideensammlung!R4C35","Ideensammlung!R6C35"}"
    
    suche ich auch die Werte 4 und 6.
    
    Es können aber (analog dem Beispiel) auch mehr als zwei Zeilen sein. Die Datenreihe meines Diagrammes ist machmal auch grösser.
    
    Danke für deine Zeitopferung!
    
    P.s.
    Da ich auch nicht Profi bin mit HTML bin ich nicht sicher, ob ich die 
    
        -tags richtig verwendet habe. Sorry

Eigentlich suche ich alle Zeilen. Sprich aus dem Beispiel
(Ursprungs-String):

xVals =
"=SERIES(Ideensammlung!$S$2,{„Ideensammlung!R4C35“,„Ideensammlung!R6C35“},(Ideensammlung!$AH$4,Ideensammlung!$AH$6),1(Ideensammlung!$AJ$4,Ideensammlung!$AJ$6))

Hallo,

probiere mal dieses:

Sub Zeile()
Dim xVals As String, Pos As Integer, strZei As String, Anz As Integer
Dim N As Integer, Zei() As Integer
xVals = "=SERIES(Ideensammlung!$S$25,{Ideensammlung!R43C35,Ideensammlung!R633C35"
While InStr(Pos + 1, xVals, "!")
 Anz = Anz + 1
 Pos = InStr(Pos + 1, xVals, "!")
 If Mid(xVals, Pos + 1, 1) = "$" Then
 Pos = InStr(Pos + 2, xVals, "$")
 Else
 Pos = Pos + 1
 End If
 strZei = ""
 While InStr("0123456789", Mid(xVals, Pos + 1, 1))
 strZei = strZei & Mid(xVals, Pos + 1, 1)
 Pos = Pos + 1
 Wend
 ReDim Preserve Zei(Anz)
 Zei(Anz) = CInt(strZei)
Wend
For N = 1 To Anz
 MsgBox Zei(N)
Next N
End Sub

Gruß
Reinhard

Hallo,

teste mal:

Sub Zeile()
Dim xVals As String, Pos As Integer, strZei As String, Anz As Integer
Dim N As Integer, Zei() As Integer
xVals = "=SERIES(Ideensammlung!$S$2,{Ideensammlung!R4C35,Ideensammlung!R6C35},"
xVals = xVals & "(Ideensammlung!$AH$4,Ideensammlung!$AH$6),1(Ideensammlung!$AJ$4,Ideensammlung!$AJ$6))"
While InStr(Pos + 1, xVals, "!")
 Anz = Anz + 1
 Pos = InStr(Pos + 1, xVals, "!")
 If Mid(xVals, Pos + 1, 1) = "$" Then
 Pos = InStr(Pos + 2, xVals, "$")
 Else
 Pos = Pos + 1
 End If
 strZei = ""
 While InStr("0123456789", Mid(xVals, Pos + 1, 1))
 strZei = strZei & Mid(xVals, Pos + 1, 1)
 Pos = Pos + 1
 Wend
 ReDim Preserve Zei(Anz)
 Zei(Anz) = CInt(strZei)
Wend
For N = 1 To Anz
 MsgBox Zei(N)
Next N
End Sub

Gruß
Reinhard

Hi Reinhard

Wow, das scheint zu funktionieren. Also wird doch nichts mit Grill-Chicken.
Ich mache mal noch den einen oder anderen Test (so von wegen unterschiedlichem Inhalt des ursprünglichen Strings) aber es sieht absolut so aus, als ob es passt.

Vielen Dank für deine Hilfe, echt Super.

Danke und Gruss
Mike