Registriert seit: 19.02.2016
Version(en): 2013
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.
Registriert seit: 17.04.2014
Version(en): MS Office 365(32)
Hallo,
einfach mit Debug.Print Application.Max(feld) Gruß Uwe
Registriert seit: 11.04.2014
Version(en): Office 2007
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
Registriert seit: 19.02.2016
Version(en): 2013
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.
Registriert seit: 17.04.2014
Version(en): MS Office 365(32)
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.
Gruß Uwe
Registriert seit: 02.08.2014
Version(en): 2016
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
Registriert seit: 10.04.2014
Version(en): 97-2019 (32) + 365 (64)
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)
Registriert seit: 14.04.2014
Version(en): 2003, 2007
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
Registriert seit: 14.04.2014
Version(en): 2003, 2007
29.03.2018, 16:24
(Dieser Beitrag wurde zuletzt bearbeitet: 29.03.2018, 16:24 von atilla.)
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
|