Utilizzare stringbuilder su VBA



  • Speed ? (stringbuilder)
    di Paolo (utente non iscritto) data: 29/06/2009

    Vorrei utilizzare string builder in vba, come posso fare? premetto che ho giò caricato la libreria mscorlib.dll

    devo compiere miliardi di concatenamenti fra stringhe... sono ore che giro in internet e non ho capito come si utilizza "stringbuilder"

    "leggevo che la funzione concat(str1,str2), è molto più veloce di stringbuilder, ma in internet ne parlano pochissimo, ho perso le speranze su quest'ultima"

    ho provato ad incollare del codice vb.net / vb6 in vba, ho cercato di modificarlo, ma nulla da fare..... aiuto... - grazie -sono certo che troverai la soluzione -


  • Speed &
    di Paolo (utente non iscritto) data: 30/06/2009

    Http://community.visual-basic.it/alessandro/archive/2007/01/03/18360.aspx

    ho trovato questo sito web, forse potrebbe esserti utile

    ma perchè non mi risponde nessuno ???



  • di Apoben64 (utente non iscritto) data: 30/06/2009

    Ciao paolo,
    non essere impaziente per ricevere delle risposte, anche perchè penso che tu non possa utilizzare tale metodo nel vba di excel .

    comunque continuiamo la ricerca.

    luca



  • di Apoben64 (utente non iscritto) data: 30/06/2009

    Qui trovi il metodo che stai cercando e come puoi usarlo .

    www://msdn.microsoft.com/it-it/library/tcz1y0c1.aspx



  • String
    di Paolo (utente non iscritto) data: 30/06/2009

    Sono pagine che ho sfogliato decine di volte, potresti scrivermi il codice?, che funzioni in vba??? "scusami se chiedo troppo", vorrei velocizzare il seguente codice:

    ho letto in internet che posso velocizzare il concatenamento di stringhe grazie all'utilizzo di stringbuilder, e volevo quindi applicarlo al codice sottostante... la funzione qui sotto la dovrei eseguire per ore ed ore di elaboarazione, mi servirebbe velocizzarla al massimo...

    ti ringrazio anticipatamente
     
    Public Function Replacez(a As String, c As String) As String
    On Error Resume Next
    Dim d As Long
    d = InStr(a, z)
    Replacez = Left$(a, d - 1) & c & Right$(a, Len(a) - d)
    End Function
    


  • String
    di Paolo (utente non iscritto) data: 30/06/2009

    Sono pagine che ho sfogliato decine di volte, potresti scrivermi il codice?, che funzioni in vba??? "scusami se chiedo troppo", vorrei velocizzare il seguente codice:

    ho letto in internet che posso velocizzare il concatenamento di stringhe grazie all'utilizzo di stringbuilder, e volevo quindi applicarlo al codice sottostante... la funzione qui sotto la dovrei eseguire per ore ed ore di elaboarazione, mi servirebbe velocizzarla al massimo...

    ti ringrazio anticipatamente
     
    Public Function Replacez(a As String, c As String) As String
    On Error Resume Next
    Dim d As Long
    d = InStr(a, z)
    Replacez = Left$(a, d - 1) & c & Right$(a, Len(a) - d)
    End Function
    



  • di R (utente non iscritto) data: 30/06/2009

    Non puoi usare la classe del net stringbuilder mettiti l'anima in pace ... spiega piuttosto cosa devi fare, dove sono le stringhe che devi concatenare e dove vuoi sia messo il risultato del concatenamento.
    saluti
    r





  • Spiego
    di Paolo (utente non iscritto) data: 30/06/2009

    Volevo velocizzare la funzione che ho scritto di seguito. speravo si potesse fare con string.builder, ma pazienza... comunque grazie.... scusami per l'insistenza....

    esempio:
    a = "paozlo":b = "paolo"
    c = replacez(a,b)

    c restituirà "paopaololo"

    devo ripetere per migliaia di volte questa funzione, dove le variabili "a" e "b" cambiano in continuazione. la funzione che ho scritto di seguito è ottimizzata? oppure si può ottimizzare ulteriolmente?

    ti ringrazio anticipatamente. grazie ancora....
     
    Public Function Replacez(a As String, c As String) As String
    On Error Resume Next
    Dim d As Long
    d = InStr(a, "z")
    Replacez = Left$(a, d - 1) & c & Right$(a, Len(a) - d)
    End Function



  • di R (utente non iscritto) data: 01/07/2009

    Direi che è il massimo che puoi raggiungere ... ho provato anche con replace delle regular expressions ed è ciò che si avvicina di più rimanendo comunque decisamente più lento
    saluti
    r

    sotto riporto il test avendo cura di aggiungere i riferimenti citati
     
    Option Explicit
    Dim re As RegExp
    'riferimenti a Microsoft VBScript Regular Expressions 5.5
    
    Public Function Replacez(a As String, c As String) As String
    On Error Resume Next
    Dim d As Long
    d = InStr(a, "z")
    Replacez = Left$(a, d - 1) & c & Right$(a, Len(a) - d)
    End Function
    
    Function replaceZ_2(a As String, b As String) As String
    replaceZ_2 = VBA.Replace(a, "z", b)
    End Function
    
    Function replaceZ_3(a As String, b As String) As String
    replaceZ_3 = re.Replace(a, b)
    End Function
    
    Function replaceZ_4(a As String, b As String) As String
    replaceZ_4 = Join(Split(a, "z"), b)
    End Function
    
    
    Sub test()
    Dim start As Double
    Dim i As Long
    Dim s As String
    start = Timer
    
    For i = 1 To 1000000
        s = Replacez("paozlo", "paolo")
    Next i
    Debug.Print Timer - start '1,79712500000005
    
    start = Timer
    
    For i = 1 To 1000000
        s = replaceZ_2("paozlo", "paolo")
    Next i
    Debug.Print Timer - start '3,42199999999957
    
    start = Timer
    Set re = New RegExp
    re.Pattern = "z"
    
    For i = 1 To 1000000
        s = replaceZ_3("paozlo", "paolo")
    Next i
    Debug.Print Timer - start '2,62476171875005
    
    start = Timer
    
    For i = 1 To 1000000
        s = replaceZ_4("paozlo", "paolo")
    Next i
    Debug.Print s
    Debug.Print Timer - start '5,13989843750005
    
    End Sub
    
    





  • Speed
    di Paolo (utente non iscritto) data: 01/07/2009

    Ti ringrazio,
    potresti vedere se è possibile ottimizzare ulteriolmente questa funzione?, praticamente restituisce il fattoriale di un numero solo e solamente se la variabile "a" è un numero intero. la variabile errr di tipo boolean è importantissima, all'interno di altro codice mi dice se la funzione ha avuto esito positivo o negativo. anche questa funzione si ripete per ore ed ore di calcolo, mi servirebbe ottimizzarla al massimo.
    ti ringrazio ancora,
     
    Public Function Factt(a As String) As Double 'Fattoriale di a
    On Error Resume Next
    If Errr Then
    If (Int(a) - a) = 0 And a >= 0 Then
     Dim g As Long
     Factt = 1: For g = 2 To a: Factt = Factt * g: Next g: Errr = True: Exit Function
    Else
     Errr = False: Exit Function
    End If: End If
    End Function
    



  • di R (utente non iscritto) data: 01/07/2009

    Bisognerebbe capire bene la procedura, spesso conta più l'algoritmo che le funzioni in se ... comunque qualcosa puoi risicare caricando un vettore a inizio procedura che contiene i fattoriali ... forse potresti risicare ancora quando verifichi se a (string) è un intero ... ma anche in questo caso dovresti utilizzare una regular expression dichiarata pubblica ... c'è poi quella variabile boolean errr che ... non so cosa ti serva ... e anche per questo che ti dico: lavora sull'algoritmo!
    saluti
    r

    sotto una procedura di test in cui simulo il discorso del vettore fattoriale caricato a inizio procedura e confronto i tempi ...
     
    Option Explicit
    Dim Fattoriale(170) As Double
    Dim errr As Boolean
    
    Sub Carica_d()
    Dim i  As Long
    Fattoriale(0) = 0
    Fattoriale(1) = 1
    For i = 2 To 170
        Fattoriale(i) = Fattoriale(i - 1) * i
    Next
    End Sub
    
    Function Factt_2(a As String) As Double 'Fattoriale di a
    On Error Resume Next
    If errr Then
        If (Int(a) - a) = 0 And a >= 0 Then
            Factt_2 = Fattoriale(a)
            errr = True
            Exit Function
        Else
            errr = False
            Exit Function
        End If
    End If
    End Function
    
    Sub test()
    Dim start As Double
    Dim i As Long, a As Long
    Dim d As Double
    
    start = Timer
    For a = 1 To 100000
        For i = 3 To 170
            d = Factt(CStr(i))
        Next
    Next
    
    Debug.Print Timer - start
    
    start = Timer
    'chiamo il caricamento del vettore fattoriale
    Carica_d
    
    For a = 1 To 100000
        For i = 3 To 170
            d = Factt_2(CStr(i))
        Next
    Next
    
    Debug.Print Timer - start
            
    End Sub
    
    Public Function Factt(a As String) As Double 'Fattoriale di a
    On Error Resume Next
    If errr Then
        If (Int(a) - a) = 0 And a >= 0 Then
            Dim g As Long
            Factt = 1
            For g = 2 To a
               Factt = Factt * g
            Next g
            errr = True
            Exit Function
        Else
            errr = False
            Exit Function
        End If
    End If
    End Function






  • di R (utente non iscritto) data: 01/07/2009

    Avevo dimenticato di cancellare un po' di cose inutili ...
     
    Function Factt_2(a As String) As Double 'Fattoriale di a
    On Error Resume Next
    If errr Then
        If (Int(a) - a) = 0 And a >= 0 Then
            Factt_2 = Fattoriale(a)
        Else
            errr = False
        End If
    End If
    End Function
    






  • di R (utente non iscritto) data: 01/07/2009

    Accipicchia! volevo dire ...
     
    Function Factt_2(a As String) As Double 'Fattoriale di a
    On Error Resume Next
    If errr Then
        If (Int(a) - a) = 0 And a >= 0 Then
            Factt_2 = Fattoriale(a)
            errr = True
        Else
            errr = False
        End If
    End If
    End Function