Condividi:        

Velocizzare Macro Per Riempire Di Numeri 18 Tabelle

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

Velocizzare Macro Per Riempire Di Numeri 18 Tabelle

Postdi ikwae » 03/06/21 23:35

Ciao a tutti… ho realizzato un ciclo di macro per riempire delle tabelle e dopo qualche istante sono riempiete
le 18 tabelle e catalogare tutte le stringhe. Dovrei essere felice e contento? NO! Questo ciclo NON lavora sotto
le 3.000 stringhe e, di conseguenza, non posso avere le ripetizioni delle prime 20/30 estrazioni di ogni anno.

Quindi ho realizzato una macro “Sveltina” con il solo compito di riempire le tabelle con numeri e poi
interviene il potente ciclo che completa il tutto.

Quindi chiedo aiuto a tutto il Forum, se possibile, velocizzare questa mia macro “Sveltina” che è
estremamente semplice da realizzare ma molto difficile da descrivere comunque ci provo.

Ogni stringa, in colonna B, ha una sua cella personale è univoca in una delle 18 tabelle.
Per trovare la cella di appartenenza si deve “pulire” la stringa dal concorso e anno
(NA_Gr2_C-01-007tern(20) Napoli)portando così la stringa al valore di “radice”.

Questa radice viene confrontata con stringhe radice di riferimento e, trovata la stinga radice di riferimento,
si legge la cella a sx (stessa riga).
Trovata la cella di appartenenza si aggiunge/scrive +1 in cella (la cella identifica automaticamente la tabella).

E’ incasinata lo so ma descrivo ogni passo che la macro dovrebbe fare.
1a) Si deve scorrere la colonna B del foglio “Gruppi” che ci sono tutte le stringhe da catalogare.
2b) Prendere in esame la 1à stringa in B2 che è la <NA_Gr2_C-01 - 002 tern Torino>
3c) si taglia la prima parte <NA_Gr2_C-01> che è standard per tutte le stringe.
4d) si separa la ruota finale <Torino> partendo da Dx verso Sx fino al primo spazio così si evita l’interferenza dell’anno.
5e) si concatenano le due parti per il confronto <NA_Gr2_C-01 Torino>
6f) si confronta con le stringe radice del foglio “Riferimenti” range F2:F2179 (nell’esempio la F95)
7g) trovato il confronto si legge la cella a Sx (colonna E) della cella F95 e si memorizza (nell’esempio la cella K7)
8h) con la cella memorizzata (K7) si passa al foglio “Tab18” e si scrive/aggiunge 1 in K7
9i) riparte il giro con la 2à stringa di B3 del foglio “Gruppi”, ecc.

In allegato un file con tre fogli;
Un foglio “Gruppi” dove ci sono le stringhe da catalogare.
Un foglio “Riferimenti” dove sono presenti le stringhe “radice” con la rispettiva cella a Sx
Un foglio “Tab18” dove si devono scrivere i punteggi di ogni stringa.

Aggiungo che sul foglio “Tab18” è presente una bandiera che cliccandoci sopra va in esecuzione
ma mia macro “Sveltina”. Sembra che sia veloce ma non è così perché deve fare tre giri dei tre
gruppi (Gr2 Gr1 Gr0) e con 3.000 stringhe. Adesso ha solo un gruppo (Gr2) e poco più di mille stringhe.

Ringraziando anticipatamente tutti coloro che mi possono aiutare 73 ikwae

http://www.filedropper.com/7riempire18tabellerete
Codice: Seleziona tutto
Sub a7_Sveltina_Per_Rete_Tab18()
 Dim UCella As String
 Dim radice As String
 Dim RuFinAnno As String
 Dim CL As Range
 Dim CL1 As Range

 
  Sheets("Gruppi").Select
  UCella = Range("B2").End(xlDown).Address
      For Each CL In Range("B2:" & UCella)
   
'"PULISCE" LA STRINGA PARTE INIZIALE
   corpo = Mid(CL, 1, 11)  'Prende La Parte Dx [BA_Gr2_C-01]
   
   
'"PULISCE" LA STRINGA PARTE FINALE
   pos = InStrRev(CL, " ")        'Da Dx Verso Sx Fino Al Primo Spazio
    strlen = Len(CL)                  'Per Prendere Tutte Le Ruote
   RuFinAnno = Right(CL, strlen - pos)     'Con Anno E Senza Anno                                                               
                                        'BA_Gr2_C-01 - 001 terno '(20) Milano '
                                        'BA_Gr2_C-01 - 001 terno 'Milano        '
                                                                   

'SI CONCATENA PER IL CONFRONTO
   radice = corpo & " " & RuFinAnno

'SETTA DOVE CONFRONTARE
   Set zona = Worksheets("Riferimenti").Range("F2:F2179")
      For Each CL1 In zona
     
'TROVATA LA STRINGA DI CONFRONTO
   If CL1.Value = radice Then Else GoTo 10
   
'Scrive/Aggiunge, In Tabella, Nella Cella Riportata A Sx Di CL1
  Sheets("Tab18").Range(CL1.Offset(0, -1)).Value = _
  Sheets("Tab18").Range(CL1.Offset(0, -1)).Value + 1

10
Next
Next
End Sub
Excel 2007
Avatar utente
ikwae
Utente Senior
 
Post: 309
Iscritto il: 27/12/17 23:14

Sponsor
 

Re: Velocizzare Macro Per Riempire Di Numeri 18 Tabelle

Postdi Anthony47 » 04/06/21 11:55

Un primo miglioramento (riduce i tempi circa a 1 terzo) si ottiene gia' sostituendo il ciclo
Codice: Seleziona tutto
'    For Each CL1 In zona
        'TROVATA LA STRINGA DI CONFRONTO
'        If CL1.Value = radice Then Else GoTo 10
    'Scrive/Aggiunge, In Tabella, Nella Cella Riportata A Sx Di CL1
'        Sheets("Tab18").Range(CL1.Offset(0, -1)).Value = _
'        Sheets("Tab18").Range(CL1.Offset(0, -1)).Value + 1
10
'    Next

Con
Codice: Seleziona tutto
    mymatch = Application.Match(radice, zona, False)
    Dest = zona.Cells(mymatch, 1).Offset(0, -1).Value
    Sheets("Tab18").Range(Dest).Value = _
      Sheets("Tab18").Range(Dest).Value + 1


Ma tutte le volte che il vba deve leggere o scrivere il contenuto di una cella se ne vanno milli e millisecondi; quindi un vero miglioramento si ottiene solo limitando questi accessi.
Ad esempio con questa variante:
Codice: Seleziona tutto
Sub a7_Sveltina_Per_Rete_Tab18_V2()
 
 Dim UCella As String
 Dim radice As String
 Dim RuFinAnno As String
 Dim CL As Range
 Dim CL1 As Range
Dim wArr, mArr, t18Arr
'
myTim = Timer
'Si copia Tab18
t18Arr = Sheets("Tab18").Range("A1").CurrentRegion.Value
Sheets("Gruppi").Select
UCella = Range("B2").End(xlDown).Address
'SETTA DOVE CONFRONTARE (estesa)
Set zona = Worksheets("Riferimenti").Range("E2:F2179")      'estesa
wArr = zona.Value
mArr = (Application.WorksheetFunction.Index(wArr, 0, 2))    'per la ricerca per "radice"
'Loop sui dati:
For Each CL In Range("B2:" & UCella)
    '"PULISCE" LA STRINGA PARTE INIZIALE
    corpo = Mid(CL, 1, 11)  'Prende La Parte Dx [BA_Gr2_C-01]
    '"PULISCE" LA STRINGA PARTE FINALE
    pos = InStrRev(CL, " ")             'Da Dx Verso Sx Fino Al Primo Spazio
    strlen = Len(CL)                    'Per Prendere Tutte Le Ruote
    RuFinAnno = Right(CL, strlen - pos) 'Con Anno E Senza Anno
    'SI CONCATENA PER IL CONFRONTO
    radice = corpo & " " & RuFinAnno
    'Si cerca la corrispondenza:
    mymatch = Application.Match(radice, mArr, False)
    Dest = wArr(mymatch, 1)
    'Incrementa la tabella:1
    t18Arr(Range(Dest).Row, Range(Dest).Column) = t18Arr(Range(Dest).Row, Range(Dest).Column) + 1
Next
'Si scrive la nuova tabella:
Sheets("Tab18").Range("A1").Resize(UBound(t18Arr), UBound(t18Arr, 2)).Value = t18Arr
MsgBox (Format(Timer - myTim, "0.00"))
Exit Sub
a7_Inserisci_Somma_AU45_Tab18
End Sub


Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19436
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Velocizzare Macro Per Riempire Di Numeri 18 Tabelle

Postdi ikwae » 04/06/21 15:01

Gentilissimo Anthony sempre gentile a rispondermi… Un ottimo lavoro entrambe, sia il “ritocco” di sostituire il ciclo sia la tua macro Sub…_V2, sono velocissime, istantanee meravigliose.

Sono contento e potrei chiudere il post ma c’è una piccolissima richiesta di variazione che ti vorrei chiedere se aggiungo una sola stringa (oppure altre stringhe) ad esempio l[NA_Gr2_C-01 - 007 tern Genova] con un altro tipo di gruppo 1 o 0
diventa [NA_Gr1_C-01 - 007 tern Genova] va in errore evidenziando la scritta in giallo su [Dest = wArr(myMatch, 1)].

Se riesci a modificarne con un semplice IF tipo [“se le stringhe lette in colonna B del foglio “Gruppi” non sono presenti nella matrice dei “Riferimenti” ignorale e passa alla prossima stringa”].

Ripeto se è semplice da fare e che non sia da rifare tutto sarei felice se aggiungi il rigo di codice per la modifica richiesta altrimenti se si devi stravolgere il tutto lascia perdere che va benissimo come le hai realizzate.
Ringraziandoti mille e mille volte per la tua disponibilità e gentilezza cordialmente ikwae
Excel 2007
Avatar utente
ikwae
Utente Senior
 
Post: 309
Iscritto il: 27/12/17 23:14

Re: Velocizzare Macro Per Riempire Di Numeri 18 Tabelle

Postdi Anthony47 » 04/06/21 18:58

Sono contento e potrei chiudere il post ma c’è una piccolissima richiesta di variazione che ti vorrei chiedere se aggiungo una sola stringa (oppure altre stringhe) ad esempio l[NA_Gr2_C-01 - 007 tern Genova] con un altro tipo di gruppo 1 o 0
diventa [NA_Gr1_C-01 - 007 tern Genova] va in errore evidenziando la scritta in giallo su [Dest = wArr(myMatch, 1)].


In ambedue le proposte fatte, inserire questo If /End If in questa posizione:
Codice: Seleziona tutto
'...
    mymatch = Application.Match(radice, zona, False)
    If Not IsError(mymatch) Then
        Dest = xx.yy.zz
        'istruzione per fare +1
    End If
'....


Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19436
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Velocizzare Macro Per Riempire Di Numeri 18 Tabelle

Postdi ikwae » 04/06/21 22:27

Gentilissimo Anthony… :D e non aggiungo altro!... Tuttavia preciso che la macro con la sola modifica del
ciclo è istantanea (il tasto del mouse non arriva a fine corsa che la macro ha già finito di scrivere tutte le
18 tabelle (3.251 stringhe)) mentre la macro Sub…_V2 si nota che impiega qualche centesimo (dico centesimo) di secondo in più.

Come dico sempre sono molto contrario a chiedere di modificare le macro già compilate e tento di
mantenere fermamente questa mia indicazione.
Il motivo della richiesta di modifica è stato che mentre collaudavo le velocissime prime macro, ho
notato che con una piccola modifica, potevo risparmiare l’esecuzione di ben 4 macro
(oltre il tempo di selezione delle macro) e, specialmente con la macro del solo ciclo, la posso usare nelle
mie ricerche di altre tabelle e quindi con un po' di :oops: ho fatto la richiesta.
Quindi è arrivata la gradita e apprezzata ultima modifica (If /End If ).
E’ stato fatto un bel passo avanti grazie di cuore per il tuo aiuto e la tua cortese e apprezzabile disponibilità. cordialmente ikwae

*******************
Mentre costruivo le tabelle ruota su tutte (BAsuTutte, CAsuTutte, ecc.) e in particolare la ruota VEsuTutte ho scoperto che quando le 5ne della ruota di VE creano un terno sulla stessa ruota di VE accade che l’estrazione successiva la 5na nr.18, sempre della ruota di VE, crea un terno sulla ruota di BA. Dopo 28 estrazioni le 5ne della ruota di VE creano un terno sulla stessa ruota VE e il concorso successivo la 5na nr.18, della ruota di VE crea un terno sulla ruota di BA… e siamo a due!!
Se il detto è “non c’è due senza il tre” sono in “allerta” ad aspettare il terno sulla ruota di VE e subito dopo giocare la 5na nr.18, della ruota di VE, sulla ruota di BA puntando il minimo consentito ossia un euro…
Si punta un euro perché come certezza che l’evento accada è paragonabile all’evento di giocare i numeri 12345 sulla ruota della Parrocchia.
Quindi ho i numeri e la ruota contemporaneamente ma niente di entusiasmante è solo un hobby!
Excel 2007
Avatar utente
ikwae
Utente Senior
 
Post: 309
Iscritto il: 27/12/17 23:14


Torna a Applicazioni Office Windows


Topic correlati a "Velocizzare Macro Per Riempire Di Numeri 18 Tabelle":


Chi c’è in linea

Visitano il forum: Nessuno e 18 ospiti