convertire codici in testo



  • convertire codici in testo
    di scherman data: 09/11/2017 10:12:11

    Buongiorno,
    oggi vi chiedo consiglio per ottimizzare una macro già funzionante. Vorrei eliminare un ciclo for che ovviamente appesantisce il processo.

    Situazione iniziale:
    ho un file che nella colonna C ha diversi valori di testo, celle vuote e altre celle, così valorizzate "TESTO VARIABILE (ABCD0120170220171234)
    Ciò che la mia macro fa è percorrere tutte le celle della colonna C, quando trova queste celle converte quel codice così "TESTO VARIABILE GEN17 - FEB17"
    in pratica trova la parentesi, elimina "(ABCD" e "1234), ovviamente ABCD e 1234 sono esempi, quello che resta trasforma 012017 in GEN17 e 022017 in FEB17. se ad esempio trovasse 012017012017 mette una sola volta GEN17.

    Mi chiedevo se fosse possibile fare tutto con dei replace... 

    edit : innanzitutto pensandoci il ciclo while per trovare la "(" è proprio inutile, potrei cavarmela con un Instr...  
     
     Dim da, a, gara
        Dim inizio
        Dim fine
        Dim i, j, n
      ' cerco inizio del codice di interesse cioè il primo carattere dopo (ABCD
         startgara = InStr(cella, "(") + 5
        'i = 1
       ' Do While i < 100
       ' n = Mid(cella, i, 1)
       ' i = i + 1
       ' If n = "(" Then
       ' startgara = i + 4
       ' Exit Do
       ' End If
            
       ' Loop
        i = 1
        'costruisco la prima data in formato 01/01/2017
        inizio = "01/" & Mid(cella, startgara, 2) & "/" & Mid(cella, startgara + 2, 4)
    
        'costruisco la seconda data in formato 01/01/2017
        fine = "01/" & Mid(cella, startgara + 6, 2) & "/" & Mid(cella, startgara + 8, 4)
    
        If inizio = fine Then
        
        gara = Left(cella, startgara - 6) & tc & " " & UCase(Format(fine, "MMMyy"))
        cella.Value = gara
        Else
        gara = Left(cella, startgara - 6) & tc & " " & UCase(Format(inizio, "MMMyy")) & " - " & UCase(Format(fine, "MMMyy"))
    
        cella.Value = gara
        End If
        
      End If
      
    Next



  • di Zer0Kelvin data: 09/11/2017 10:51:55

    Salve.
    Con replace puoi solo sostituire un testo fisso con un altro; non penso sia utile nel tuo caso.
    Quello che puoi fare per migliorare la velocità di esecuzione è:
    -dichiarare il tipo delle variabili che usi (altrimenti VBA crea variabili Variant che appesantiscono, anche se di poco, il programma)
    -usare InStr al posto del Do While per trovare il testo che ti interessa
    -disabilitare ScreenUpdating e Calculation ad inizio macro e riabilitarli alla fine
    -la variabile gara è superflua
    .


  • grazie
    di scherman data: 09/11/2017 10:58:29

    ok grazie procedo col dichiarare il tipo di variabile e disattivare calculation.
    pensavo di creare due array
    da 01 a 12
    da Gen a Dic per fare la conversione con replace. che dici?



  • di Zer0Kelvin data: 09/11/2017 11:36:05

    Si potrebbe fare, usando Replace, non Range.Replace, solo se le posizioni delle sottostringhe da sostituire sono fisse, e dovresti elaborare le celle una alla volta.

    Ma quante celle devi elaborare?




  • di scherman data: 09/11/2017 11:54:55

    da 6k a 10k circa.

    ho alleggerito molto in un'altra sezione della macro dove inserivo circa 600 righe in un foglio con copia e incolla, una alla volta, quindi ciclo for e via dicendo.
    tolto tutto e messo

    Cells(3, 1).EntireRow.Copy
    Rows(Cells(3, 1).Row & ":" & Cells(3, 1).Row + lastrow - 5).Insert

    ora non si blocca più e ci metto una manciata di secondi. aggiustavo la pagliuzza quando più in basso avevo una trave da sistemare.

    grazie mille



  • di Zer0Kelvin data: 09/11/2017 12:45:41

    Bene, quindi hai risolto?



  • di scherman data: 09/11/2017 12:50:43

    YES. GRAZIE.