Clever-Excel-Forum

Normale Version: Maximale Stringlänge in einem Datenfeld ermitteln
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
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.
Hallo,

einfach mit
Debug.Print Application.Max(feld)
Gruß Uwe
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.
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.
Hallo,

(26.03.2018, 12: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
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
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
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.
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