Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1200to1204
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

Zeichen in einem String zählen

Zeichen in einem String zählen
Holger,
Guten Morgen Forum!
Manchmal kommt man beim Programmieren ewig nicht dahin, wo man hin möchte, sondern
muss sich vorher mit ganz anderen Problemen herumschlagen.
Ich habe einen String z.B HERBST;WINTER;SOMMER.
Er kann aber auch nur HERBST;WINTER sein.
Daher möchte ich die Zahl der Semikolons zählen um jedes einzelne Element
des String in einer Variable zu speichern.
Wie läßt sich das am einfachsten umsetzen?

18
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
AW: Zeichen in einem String zählen
11.02.2011 09:46:01
OttoH
Hallo Holger,
es funktioniert z.B. mit folgender Funktion:
Function semikolon(Text)
Dim i As Integer
For i = 1 To Len(Text)
If Mid$(Text, i, 1) = ";" Then
semikolon = semikolon + 1
End If
Next
End Function
Steht dein Text in A1, erfolgt der Aufruf mit =Semikolon(A1)
Gruß OttoH
Und wie in Variablen speichern?
11.02.2011 09:49:49
Holger,
Hallo Otto,
Vielen Dank.
Ich stehe nur vor einem für mich unlösbarem Problem.
Vorher weiß ich ja nicht wieviele Werte ich am Schluss bekomme.
Jeden Wert aus dem String muss ich aber in einer extra Variablen halten,
auf die ich später wieder zugreifen muss.
Im Detail durchlaufe ich später eine Tabelle und prüfe ob der Zellwert einer diese
Werte entspricht.
Speichere ich die Werte in ein Array, woher weiß ich später wo welcher Wert steht
und wieviele es gibt?
Anzeige
AW: Und wie in Variablen speichern?
11.02.2011 09:57:26
ing.grohn
Hallo Holger,
probier doch mal folgendes:

dim K as Integer
dim strText() as String  'Variant
dim mText as String
mText = "Herbst;Winter;Sommer"
strText = Split(mText, ";")
For K = 0 To UBound(strText)
Debug.Print K & " " & strText(K)
Next K

Mit freundlichen Grüßen
Albrecht
AW: Und wie in Variablen speichern?
11.02.2011 10:07:48
Reinhard
Hallo Holger,
der erste Code ist dafür wenn der erste Arrayindex 0 ist oder 1, er funktioniert bei 0 und 1.
Der zweite Code wenn du sicher bist daß der erste Index immer die 0 sein wird.
Sub Trenn()
Dim Satz As String, arrS() As String, S As Integer
Satz = "HERBST;WINTER;SOMMER"
arrS = Split(Satz, ";")
MsgBox "arrS hat " & UBound(arrS) - 1 * (LBound(arrS) = 0) & " Elemente"
For S = LBound(arrS) To UBound(arrS)
MsgBox arrS(S)
Next S
End Sub
Sub Trenn2()
Dim Satz As String, arrS() As String, S As Integer
Satz = "HERBST;WINTER;SOMMER"
arrS = Split(Satz, ";")
MsgBox "arrS hat " & UBound(arrS) + 1 & " Elemente"
For S = 0 To UBound(arrS)
MsgBox arrS(S)
Next S
End Sub

Gruß
Reinhard
Anzeige
Oje Oje ...
11.02.2011 10:13:31
Holger,
Hallo Rudi,
bei beiden Codes weiß ich nicht wie ich später wieder darauf zugreifen kann.
Hier der Code, der später stattfindet. Die beiden Case habe ich manuell gefüllt
aber wie kann ich hier auf die Arrays zugreifen? Ich kapiere das einfach nicht :(
Sub SoWirds
For Each rngCell In rngBrand
If rngCell.Value = strTemp Then
lngTotalUn = lngTotalUn + Cells(rngCell.Row, intSalesCol)
lngTotalAge = lngTotalAge + (Cells(rngCell.Row, intAgeCol) * Cells(rngCell.Row,  _
intSalesCol))
Select Case rngCell.Offset(0, 1).Value
Case strOpenOS1 --> HIER MÜSSEN DIE ARRAY VARIABLEN STEHEN
lngOPENOSUn = lngOPENOSUn + Cells(rngCell.Row, intSalesCol)
lngOPENOSAge = lngOPENOSAge + (Cells(rngCell.Row, intAgeCol) * Cells( _
rngCell.Row, intSalesCol))
Case strOpenOS2 --> HIER MÜSSEN DIE ARRAY VARIABLEN STEHEN
lngOthersUn = lngOthersUn + Cells(rngCell.Row, intSalesCol)
lngOthersAge = lngOthersAge + (Cells(rngCell.Row, intAgeCol) * Cells( _
rngCell.Row, intSalesCol))
End Select
End If
Next rngCell
End Sub

Anzeige
AW: Oje Oje ...
11.02.2011 10:20:51
Rudi
Hallo,
was soll ich damit?
Ich weiß nicht, wie deine Variablen belegt sind und was du erreichen willst.
Bau eine Beispielmappe, lade sie hoch und beschreibe, was du willst.
Gruß
Rudi
AW: Oje Oje ...
11.02.2011 10:30:20
Holger,
Hallo Rdui,
strOPENOS1 ist WINTER, strOPENOS2 ist SOMMER.
Das habe ich im Code vorher so festgelegt.
Aber da ich nicht weiß, ob aus dem String zwei, drei oder vier Werte
ermittelt werden, komme ich nicht so recht weiter.
Dieses grundsätzliche Problem habe ich sehr oft, nicht zu wissen
wie ich auf Arrays später zugreifen kann und wie ich es aufbauen
soll, wenn ich nicht weiß wieviele Werte es geben wird.
Denn wüßte ich das, könnte ich ja einfach diese Anzahl an
Variablen definieren, aber so?
Trotzdem Danke für deine Hilfe.
Gruß
Holger
Anzeige
AW: Oje Oje ...
11.02.2011 10:23:58
Reinhard
Hallo Holger,
benutze bitte immer Option Explicit.
Bezogen auf meinen Beispielcode dann so
Sub SoWirds()
For Each rngCell In rngBrand
If rngCell.Value = strTemp Then
lngTotalUn = lngTotalUn + Cells(rngCell.Row, intSalesCol)
lngTotalAge = lngTotalAge + (Cells(rngCell.Row, intAgeCol) * Cells(rngCell.Row,  _
intSalesCol))
Select Case rngCell.Offset(0, 1).Value
Case arrS(0)
lngOPENOSUn = lngOPENOSUn + Cells(rngCell.Row, intSalesCol)
lngOPENOSAge = lngOPENOSAge + (Cells(rngCell.Row, intAgeCol) * Cells(rngCell.Row,  _
intSalesCol))
Case arrS(1)
lngOthersUn = lngOthersUn + Cells(rngCell.Row, intSalesCol)
lngOthersAge = lngOthersAge + (Cells(rngCell.Row, intAgeCol) * Cells(rngCell.Row,  _
intSalesCol))
End Select
End If
Next rngCell
End Sub

Gruß
Reinhard
Anzeige
Aha .. aber was ist
11.02.2011 10:26:09
Holger,
Hallo Reinhard,
ok, das ist leicht zu verstehen.
Aber was ist wenn es mehr als zwei Werte gibt?
Dann bräuchte ich ja drei Cases?
AW: Aha .. aber was ist
11.02.2011 10:32:49
Reinhard
Hallo Holger,
na und, dann halt drei, wieviele können es denn werden?
Gruß
Reinhard
AW: Aha .. aber was ist
11.02.2011 10:35:52
Holger,
Genau das weiß ich ja vorher nicht.
Der String kann HERBST;WINTER;SOMMER oder HERBST;WINTER oder HERBST;WINTER;SOMMER;FRÜHLING oder oder sein.
Da liegt mein Problem, Je nach Anzahl der Werte des Strings muss ich Variablen definieren.
AW: Aha .. aber was ist
11.02.2011 10:47:23
Reinhard
Hallo Holger,
die Anzahl brauchst du doch gar nicht ganz genau, schau mal hier:
Sub test()
Dim arrS(2)
arrS(0) = "Herbst"
arrS(1) = "Winter"
arrS(2) = "Frühling"
Range("A1").Value = "Frühling"
Select Case Range("A1").Value
Case arrS(0)
MsgBox 0
Case arrS(1)
MsgBox 1
Case arrS(2)
MsgBox 2
Case arrS(3)
MsgBox 3
Case arrS(4)
MsgBox 4
Case arrS(5)
MsgBox 5
Case arrS(6)
MsgBox 7
Case arrS(8)
MsgBox 8
Case arrS(9)
MsgBox 9
Case Else
'Nix
End Select

Gruß
Reinhard
Anzeige
Ok
11.02.2011 10:59:14
Holger,
Hallo reinhard,
in dem Fall wäre es jetzt auf neun Werte beschränkt, richtig?
Das kann ich in diesem Fall jetzt so nehmen, Danke dafür!
Nur was wäre, wenn es z.B bis zu 100 Werte gäbe? Müßte man dann
100 Cases programmieren?
AW: Ok
11.02.2011 11:50:27
Reinhard
Hallo Holger,
gut, man könnte natürlich das ganze Select in eine eigene prozedur und Modul schreiben dann stört es nicht auch wenn da 100 Cases sind.
Die zu erzeugen ist auch einfach, siehe nachstehenden Beispielcode, danach mußte das nur noch aus der tabelle in Vba einfügen.
Das Problem was ich sehe, da sind mir sowieso vielzuviel verschiedene Variablennamen, wenn ich das recht weiß waren da pro CAse mind. zwei verschiedene Variablennamen.
Da könnte man ansetzen und die auch in ein Array packen.
Aber wahrscheinlich gibt es da noch andere Ansätze, da müßte man aber das Gesamte kennen und auch wissen was da noch geplant ist.
Das sprengt aber dann den Rahmen eines Hilfeforums.
Luc hat da etwas interessantes geschrieben, schau mal hier:
https://www.herber.de/forum/messages/1200196.html
Zu helfen aus der Ferne ist sowieso schon schwierig. Wenn dann Codeschnipsel kommen mit Variablen woman gar nicht weiß wie wo die deklariert wurden und was genau im Mment des Codeaufrufes drinsteht, erschwert das kolossal. Fehlendes Option Explicit auch.
Gruß
Reinhard

Option Explicit
Sub ErzeigeSelect()
Dim N As Integer
Cells(1, 1).Value = "Select Case Range(""A1"").Value"
For N = 2 To 202 Step 2
Cells(N, 1) = "   " & "Case arrS(" & N / 2 - 1 & ")"
Cells(N + 1, 1) = "      " & "Msgbox " & N / 2 - 1
Next N
Cells(N, 1) = "   Case Else"
Cells(N + 1, 1) = "      'Nix"
Cells(N + 1, 1) = "End Select"
End Sub

Anzeige
AW: Ok
11.02.2011 14:26:37
Holger,
Hallo reinhard,
Viel lektüre ... aber da muss ich durch auf meinem Weg ;)
Nochmal Vielen Dank!!!!
Holger
Das er dich da mal nicht...
11.02.2011 14:58:57
Luc:-?
…missversteht, Reinhard… ;-)
Gruß Luc :-?
AW: Zeichen in einem String zählen
11.02.2011 10:11:10
Rudi
Hallo,
wenn es um den Thread von gestern geht: Man kann die Unikate auch direkt in ein Array einlesen.
Sub yyy()
Dim x, k
x = myValues(Range(Cells(2, 1), Cells(Rows.Count, 1).End(xlUp)))
For k = LBound(x) To UBound(x)
Debug.Print k, x(k)
Next
End Sub
Function myValues(rng As Range)
Dim oWert As Object, i As Long, Tmp
Set oWert = CreateObject("Scripting.dictionary")
Tmp = rng.Value
For i = 1 To UBound(Tmp)
oWert(Tmp(i, 1)) = 0
Next
myValues = oWert.keys
End Function

Gruß
Rudi
Anzeige
AW: Zeichen in einem String zählen
11.02.2011 11:12:14
Rudi
Hallo,
meine Vermutung:
du willst Summen nach Frühling, Herbst etc. bilden und dabei einen Status *open* berücksichtigen, oder?
Für den Code: Herbst etc in A, Staus in C, Umsatz in F
Sub xxx1()
Dim arrSum, i
arrSum = SumBrand(1, 3, 6, "*open*")
If IsArray(arrSum) Then
For i = 1 To UBound(arrSum)
Debug.Print arrSum(i, 1), arrSum(i, 2)
Next
End If
End Sub
Function SumBrand(lngColBrand As Long, _
lngColStatus As Long, _
lngColSales As Long, _
strStatus As String)
Dim rngBrand As Range
Dim iOffSetSTATUS As Integer, iOffSetSALES As Integer, i As Integer
Dim rngC As Range, objSum As Object, arrSum(), arrKeys
Set rngBrand = Range(Cells(2, lngColBrand), Cells(Rows.Count, lngColBrand).End(xlUp))
iOffSetSTATUS = lngColStatus - lngColBrand 'Versatz Statusspalte *open*
iOffSetSALES = lngColSales - lngColBrand 'Versatz Umsatzspalte
Set objSum = CreateObject("Scripting.Dictionary")
For Each rngC In rngBrand
If LCase(rngC.Offset(, iOffSetSTATUS)) Like LCase(strStatus) Then
objSum(rngC.Value) = objSum(rngC.Value) + rngC.Offset(, iOffSetSALES) * 1
End If
Next
If objSum.Count > 0 Then
arrKeys = objSum.keys
ReDim arrSum(1 To objSum.Count, 1 To 2)
For i = 0 To UBound(arrKeys)
arrSum(i + 1, 1) = arrKeys(i)
arrSum(i + 1, 2) = objSum(arrKeys(i))
Next
SumBrand = arrSum
End If
End Function

Gruß
Rudi
Anzeige

98 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige