Aktuell kann es Probleme bei der Anmeldung mit dem Chrome oder Edge Browser geben. Ihr müsstet in die Einstellungen des Browsers gehen und Cache, Cookies und sofern vorhanden, gespeicherte Passwörter vom CEF löschen oder alternativ auf einen anderen Browser ausweichen. Ursache sind vermutlich kürzliche Browserupdates. x

Maximale Stringlänge in einem Datenfeld ermitteln
#1
Hallo,

ich muss  bei meinen Datenfeldern immer wieder die jeweilige Stringlänge der einzelnen Werte berechnen.

Dazu habe ich mir folgenden Code ausgedacht: 
'i = Indexwerte des Datenfeldes  feld und a = Variable, in der die jeweilige Stringlänge berechnet wird.

For i = LBound(feld) To UBound(feld)
If Len(feld(i)) > a Then a = Len(feld(i))
Next

'Maximale Feldlänge:

debug.print Len(a)

Statt mit einer Schleife, gibt es eine Funktion, die so etwas macht?
Oder bekommt man so etwas irgendwie noch besser hin?

Auch wenn's nur ein kleines Codestück ist, wäre ich an einer optimalen Lösung
doch sehr interessiert.
Top
#2
Hallo,

einfach mit
Debug.Print Application.Max(feld)
Gruß Uwe
Top
#3
Auch Hallo,

ich habe das ein wenig anders verstanden als Uwe. IMHO will der TE die Stringlänge in einem Array begrenzen. In meinen Beispiel habe ich es auf 3 Zeichen beschränkt.

Code:
Sub prcX()
   Dim strFeld(1 To 100) As String * 3
   Dim lngC As Long
  
   For lngC = 1 To 100
      strFeld(lngC) = "H" & lngC * 10
      Debug.Print strFeld(lngC)
   Next lngC
End Sub

Viel Sinn macht der Code nicht aber was solls.
Gruß Stefan
Win 10 / Office 2016
Top
#4
Hallo,

ich glaub Uwe hat das schon richtig verstanden.

Dim Feld As Variant
Feld = Array("Ann ", "Barry", "John", "Stephen Brown", "Wilfred")

Debug.Print Application.Max(Feld)
Debug.Print Application.WorksheetFunction.Max(Feld)

Doch leider funktioniert es nicht. Was mache ich falsch?

Die längste Stringlänge wäre oben "Stephen Brown".

Debug.Print Len("Stephen Brown")  mit 13 Zeichen.

Und last but not least wofür ich das brauche. Ich will damit die optimale Breite eines Controlelementes auf meiner Userform berechnen,
welche mit den Werten aus dem Feld gefüllt wird.
Top
#5
Hallo,

(26.03.2018, 13:45)Codespiker schrieb: Debug.Print Application.Max(Feld)
Debug.Print Application.WorksheetFunction.Max(Feld)

Doch leider funktioniert es nicht. Was mache ich falsch?

ja, das geht so nicht, ich hatte mich da verguckt.  Blush

Gruß Uwe
Top
#6
Hallo Codespiker,

Zitat:Statt mit einer Schleife, gibt es eine Funktion, die so etwas macht?
Oder bekommt man so etwas irgendwie noch besser hin?
Wenn man davon ausgeht, dass man das Feld hat (diese Datenstruktur also als gegeben voraussetzt), ist die Schleife in meinen Augen das Optimum an Geschwindigkeit. Mir fällt nichts besseres ein.

Auch für ein Array mit 30 Millionen Strings benötigt deine Schleife bei mir noch weit unter einer halben Sekunde.

Auch eine andere Datenstruktur kann das IMHO nicht wirklich beschleunigen (doch manch anderer ist da vielleicht kreativer als ich).

Grüße, Ulrich
Top
#7
Hallöchen,

bis zu einer begrenzten Zeichenzahl und Nutzung zweier Zellen würde in Anlehnung an Steffel's Code auch so was gehen:

Code:
Sub prcX()
'   Dim strFeld(1 To 100) As String * 3
   Dim strFeld(1 To 100) As Variant
   Dim lngC As Long
   For lngC = 1 To 100
      strFeld(lngC) = "H" & lngC * 10
'      Debug.Print strFeld(lngC)
   Next lngC
   Cells(1, 1) = Join(strFeld, " ")
   Cells(1, 2).FormulaArray = _
        "=MAX(FIND(""#"",SUBSTITUTE(RC[-1]&REPT("" "",999),"" "",""#"",ROW(R:R[998])))-FIND(""#"",SUBSTITUTE("" ""&RC[-1]&REPT("" "",999),"" "",""#"",ROW(R:R[998]))))"
   MsgBox Cells(1, 2)
   Cells(1, 1).Clear
   Cells(1, 2).Clear
End Sub
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Top
#8
Hallo,

Deine Variante mit Uwes Vorschlag kombiniert ginge so:


Code:
Sub test()
 Dim Feld As Variant
 Dim iMax As Integer, i As Long
 Feld = Array("Ann ", "Barry", "John", "Stephen Brown", "Wilfred")
 For i = LBound(Feld) To UBound(Feld)
   iMax = Application.Max(iMax, Len(Feld(i)))
 Next i
 Debug.Print iMax
End Sub

So entfällt die If Abfrage.
Gruß Atilla
Top
#9
Hallo,

wenn die Daten in der Tabelle stünden ginge auch folgendes:


Code:
Sub test2()
  Dim iMax As Integer
  ActiveWorkbook.Names.Add Name:="a_ati", RefersTo:="=" & Sheets("Tabelle2").Range("B1:B1000").Address
  iMax = [Max(Len(a_ati))]
  ActiveWorkbook.Names("a_ati").Delete
  Debug.Print iMax
End Sub
oder wenn man den Bezug direkt eingeben kann:

Code:
Sub test3()
 Dim iMax As Integer
 iMax = [Max(Len(Tabelle2!B1:B1000))]
 Debug.Print iMax
End Sub
Gruß Atilla
Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste