Registriert seit: 26.09.2015
	
Version(en): 2013
	
 
	
	
		Guten Tag miteinander
Ich habe eine String-Schlaufe, die eigentlich viel zu langsam ist, da bei jedem Durchlauf der String erweitert wird. Ich habe im Internet nach "StringBuilder" gesucht und in der Tat einige Beispiele gefunden, doch es ist trotzdem gescheitert. Kennt jemand eine machbare Lösung für VBA-Excel diesbezüglich?
Gruss und Dank
Stefan1
	
	
	
	
	
 
 
	
	
	
		
	Registriert seit: 12.10.2014
	
Version(en): 365 Insider (64 Bit)
	
 
	
		
		
		01.08.2020, 12:16 
(Dieser Beitrag wurde zuletzt bearbeitet: 01.08.2020, 12:16 von RPP63.)
		
	 
	
		Moin!
Das, was Du bisher hast, ist natürlich geheim?
Inbesondere dürfte die Kenntnis der Aufgabenstellung mögliche Lösungsvorschläge potenzieren …
Fragt sich Ralf
	
	
	
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. 
Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
	
	
 
 
	
	
	
		
	Registriert seit: 21.12.2017
	
Version(en): MS 365 Family (6 User x 5 Geräte für jeden) Insider-Beta
	
 
	
	
		=Worksheetfunction.TextJoin() oder
=Application.TextJoin() (ungetestet)
mit Evaluate und entweder Range oder VBA-Array
	
	
	
	
	
 
 
	
	
	
		
	Registriert seit: 12.10.2014
	
Version(en): 365 Insider (64 Bit)
	
 
	
	
		Oder das gute alte Join()
	
	
	
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. 
Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
	
	
 
 
	
	
	
		
	Registriert seit: 08.05.2014
	
Version(en): Office 2010, Office 365, Office 365 Betakanal
	
 
	
		
		
		01.08.2020, 16:17 
(Dieser Beitrag wurde zuletzt bearbeitet: 01.08.2020, 16:18 von maninweb.)
		
	 
	
		Hallo,
vom Rubberduck-Autor Matthieu Guindon: 
https://github.com/retailcoder/VBA-StringBuilderVerwendet Windows API und läuft somit z.B. nicht auf einem Mac.
Gruß
	
 
	
	
Microsoft Excel Expert · Microsoft Most Valuable Professional (MVP) :: 2011-2019 & 2020-2022 :: 10 Awardshttps://de.excel-translator.de/translator :: Online Excel-Formel-Übersetzer :: Funktionen :: Fehlerwerte :: Argumente :: Tabellenbezeichner
 
	
	
 
 
	
	
	
		
	Registriert seit: 26.09.2015
	
Version(en): 2013
	
 
	
		
		
		02.08.2020, 01:19 
(Dieser Beitrag wurde zuletzt bearbeitet: 02.08.2020, 01:49 von Stefan1.)
		
	 
	
		Also folgende Versionen existieren im Internet:
Code:
Dim MyBuffer() As String
Dim MyCurrentIndex As Long
Dim MyMaxIndex As Long
Private Sub Class_Initialize()
    MyCurrentIndex = 0
    MyMaxIndex = 16
    ReDim MyBuffer(1 To MyMaxIndex)
End Sub
'Appends the given Text to this StringBuilder
Public Sub Append(Text As String)
    MyCurrentIndex = MyCurrentIndex + 1
    If MyCurrentIndex > MyMaxIndex Then
        MyMaxIndex = 2 * MyMaxIndex
        ReDim Preserve MyBuffer(1 To MyMaxIndex)
    End If
    MyBuffer(MyCurrentIndex) = Text
End Sub
'Returns the text in this StringBuilder
'Optional Parameter: Separator (default vbNullString) used in joining components
Public Function ToString(Optional Separator As String = vbNullString) As String
    If MyCurrentIndex > 0 Then
        ReDim Preserve MyBuffer(1 To MyCurrentIndex)
        MyMaxIndex = MyCurrentIndex
        ToString = Join(MyBuffer, Separator)
    End If
End Function
Bei der obigen scheiterte es an "StringBuilder", weil dieser Begriff nicht erkannt wird. Muss ich hier einen 'Verweis' auf ein bestimmtes Programm beachten oder wie soll VBA "StringBuilder" denn erkennen?.
Und dann finde ich folgende Lösung noch interessant, doch wo steht bloss dieses "Dim MyBuffer, Dim MyCurrentIndex usw.'? Im Klassenmodul oder im Modul selbst, doch beides geht nicht:
Code:
Dim MyBuffer() As String
Dim MyCurrentIndex As Long
Dim MyMaxIndex As Long
Private Sub Class_Initialize()
    MyCurrentIndex = 0
    MyMaxIndex = 16
    ReDim MyBuffer(1 To MyMaxIndex)
End Sub
'Appends the given Text to this StringBuilder
Public Sub Append(Text As String)
    MyCurrentIndex = MyCurrentIndex + 1
    If MyCurrentIndex > MyMaxIndex Then
        MyMaxIndex = 2 * MyMaxIndex
        ReDim Preserve MyBuffer(1 To MyMaxIndex)
    End If
    MyBuffer(MyCurrentIndex) = Text
End Sub
'Returns the text in this StringBuilder
'Optional Parameter: Separator (default vbNullString) used in joining components
Public Function ToString(Optional Separator As String = vbNullString) As String
    If MyCurrentIndex > 0 Then
        ReDim Preserve MyBuffer(1 To MyCurrentIndex)
        MyMaxIndex = MyCurrentIndex
        ToString = Join(MyBuffer, Separator)
    End If
End Function
Wie könnte ich das für Excel-VBA lösen?
Beispiele von hier:
https://codereview.stackexchange.com/que...ingbuilderVielen Dank für Eure Unterstützung.
Gruss
Stefan1
	
 
	
	
	
	
 
 
	
	
	
		
	Registriert seit: 17.04.2014
	
Version(en): MS Office 365(32)
	
 
	
	
		Hallo,
 (01.08.2020, 11:59)Stefan1 schrieb:  Ich habe eine String-Schlaufe, die eigentlich viel zu langsam ist, ...
wenn man wüsste, wie die aussieht, wäre vielleicht gezieltere Hilfe möglich. 

Gruß Uwe
	
 
	
	
	
	
 
 
	
	
			00202 
			
				Nicht registrierter Gast
								
				
			
	
	
		
 
	
 
	
	
		Hallo Stefan1, :19:
das ist ja der Code vom 
StringBuilder, den "
maninweb" in #5 schon vorgestellt hat. Den hättest du nur 
importieren müssen.
Wenn du den Code von deiner 
Quelle nimmst, 
muss der 
Code an die richtige 
Stelle (
einmal Klassenmodul, einmal Modul) 
und das 
Klassenmodul muss den richtigen 
Namen haben bzw. der Code muss ein 
klein wenig 
angepasst werden. :21:
[attachment=33316]
Der Test ergibt bei mir bei 30.000 Durchläufen:
The VBA String took: 5,205 seconds
The Stringbuilder took: 0,015 secondsMit anderen Funktionen habe ich es nicht getestet, aber die 
Worksheetfunction.TextJoin() z. B. hat ein 
Limit von 
32.767 Zeichen.
	
 
	
	
	
	
 
 
	
	
	
		
	Registriert seit: 26.09.2015
	
Version(en): 2013
	
 
	
		
		
		03.08.2020, 00:00 
(Dieser Beitrag wurde zuletzt bearbeitet: 03.08.2020, 00:01 von Stefan1.)
		
	 
	
		Guten Tag Case
Guten Tag miteinander
Vielen Dank. Genauso hat es funktioniert. Der Unterschied ist unglaublich, von fast 1 Minute zu 3, 4 Sekunden in meinem Fall. Ich wusste das mit der Benennung des Klassenmoduls als "StringBuilder" nicht und so kam es zu ständigen Fehler. Ich habe dazu gelernt  
  Gruss
Stefan1