| | Post: 235 | Registrato il: 03/10/2015
| Città: ALBAREDO PER SAN MARCO | Età: 44 | Utente Junior | 2003 | | OFFLINE |
|
26/04/2020 19:51 | |
Buona Sera Forum. Vi Spiego il codice analizza all'interno del foglio di lavoro.Inserendo i numeri nei Range da (A2 D250000) (F2 D250000)
(K2 N250000) (P2 S250000) (U2 X250000) se messi nel foglio "fascia" potete fare qualsiasi prova con altri numeri non importa quanti ne mettete ;cancellate pure anche i miei,nel foglio Contatore-finale in colonna E la macro trova esattamente quante volte i numeri o range di numeri come li chiamo io da (uno a quattro) quello non è importante sono stati trovati.Ho provato ad inserire 180000 range di numeri nel range sopra indicato per un totale di 900000 (ho riempito tutte 5 le fasce) ma ripeto potete anche non fare come me potete fare quello che volete, il contatore riporta tutto.Dopo aver lanciato la macro e dopo 8 ore non ho avuto una risposta e ho dovuto spegnere il pc. Come da foto a calcolare come esempio 9000 io le chiamo range di numeri la macro ha finito in 3,25 secondi,non mi aspettavo di certo che la macro finisse in 325 secondi come da proporzione per calcolare le 900000 range di numeri ma,sono rimasto deluso perchè di certo non mi aspettavo che in 8 ore la macro non mi rispondesse e per questo ho dovuto spegnere il pc a malincuore.(Non ho usato il pc nel frattempo per fare altro nell'esecuzione di questa,andava solo Excel).Chiedo a tutti voi se è possibile modificare il codice inserendo una pausa dopo 2 ore per vedere se è tutto ok,oppure fermando momentaneamente l'esecuzione con un tasto della tastiera e inoltre volevo chiedervi se una volta in pausa si può salvare il lavoro già fatto e riprenderla magari il giorno dopo.Vi Chiedo inoltre come devo fare per assegnare memoria a excel perchè io cercato varie soluzioni su internet ma non riesco a trovarne una valida.Ho un pc da 8giga.Accetto qualsiasi soluzione e non vi chiedo di provare ad inserire 900000 range di numeri perchè ovvio lo faccio io.A disposizione Gatto di Marmo. |
|
| | Post: 1.313 | Registrato il: 27/06/2011
| Utente Veteran | excel 2007 | | OFFLINE |
|
26/04/2020 22:05 | |
ciao Matteo,
non credo sia quello che cerchi,
ma se il pc/macro non rispondono come ti aspetti, se non ricordo male,
CTRL + PAUSA
annulla l'esecuzione della macro e va in debug.
Per evitare l'"impallamento" del pc, bisognerebbe analizzare il tuo codice, ma chi lo può fare meglio di te che ne conosci la struttura?
L'unico consiglio che mi viene di darti è quello di verificarlo
a blocchi di codice, blocco per blocco funzionante.
ciao
Frank [Modificato da tanimon 26/04/2020 22:06]
Stretta la foglia, larga la via, dite la vostra che ho detto la mia.
Excel 2007 forse anche 2013 ... 2021 ... 365 e future... |
| | Post: 235 | Registrato il: 03/10/2015
| Città: ALBAREDO PER SAN MARCO | Età: 44 | Utente Junior | 2003 | | OFFLINE |
|
27/04/2020 10:43 | |
Buon giorno a tutti, ciao Tanimon , ho lanciato la macro e dopo un'ora
di esecuzione ho cercato di arrestarla con la combinazione di tasti da te suggerita ma non sono riuscito ad entrare nel codice per verificarlo.Si potrebbe modificare il codice inserendo un pausa diciamo dopo un'ora di elaborazione per vedere come questo sta agendo.
Mi è venuta in mente anche un'altra idea , siccome non penso di superare le 900000 che ne dici di lavorare solo sul Range (AD) bisogna
perciò modificare il codice, inserendo perciò un istruzione qualora la macro arriverebbe a controllare il Range AD 1.048.576 avrebbe finito il lavoro.Ciao Matteo |
| | Post: 1.315 | Registrato il: 27/06/2011
| Utente Veteran | excel 2007 | | OFFLINE |
|
27/04/2020 12:49 | |
ciao,
gattodimarmo1980, 27/04/2020 10:43:
ho lanciato la macro e dopo un'ora
di esecuzione ho cercato di arrestarla con la combinazione di tasti da te suggerita ma non sono riuscito ad entrare nel codice per verificarlo.
a me funziona sia la combinazione di tasti che ti ho indicato,
sia il tuo file.
entra nel codice prima di lanciare la macro ed usa dei punti di interruzione dal menu Debug lato VBA mettendone più di uno e prima di dove ritieni che si "impalli", per testarla a blocchi.
Di più non so.
Frank
Stretta la foglia, larga la via, dite la vostra che ho detto la mia.
Excel 2007 forse anche 2013 ... 2021 ... 365 e future... |
| | Post: 236 | Registrato il: 03/10/2015
| Città: ALBAREDO PER SAN MARCO | Età: 44 | Utente Junior | 2003 | | OFFLINE |
|
27/04/2020 14:13 | |
Ciao Taninom ti allego la foto si impalla a Next x.La combinazione tasti è Strg+pause cioè (ctrl+ il tasto sopra F11) della tasiera?Ciao
Matteo Grazie |
| | Post: 2.313 | Registrato il: 21/03/2008
| Città: LOCATE VARESINO | Età: 76 | Utente Veteran | 2007 / 13 | | OFFLINE | |
|
27/04/2020 16:05 | |
ciao
modifica la riga
da cosi
If Cells(x, 10).Value = "" Then Cells(x, 10).EntireRow.Delete
a cosi
If Cells(x, 10).Value = "" Then Rows(x).Delete
sul mio pc portatile ubsoleto corei3 e 8giga ram ho impiegato ( 1 secondo e mezzo ) Ciao da locate
excel 2007 / 13 |
| | Post: 2.734 | Registrato il: 06/04/2013
| Utente Veteran | 2010 | | OFFLINE |
|
27/04/2020 18:05 | |
ciao a tutti
il problema della macro Analizza risiede nel ciclo:
For x = 1 To 21 Step 5For x = 1 To 21 Step 5
e sottostanti sub-cicli.
Questo perchè tale macro sarà stata sviluppata per elaborare poche centinaia di righe ed invece......
Al posto di quella macro, prova ad utilizzare questa stando nel foglio contatore-finale:
Sub Analizza2()
Dim oDic As Object
Set oDic = CreateObject("scripting.dictionary")
Set wk = Worksheets("fascia")
cells.clearcontents
With oDic
For c = 1 To 21 Step 5
ur = wk.Cells(Rows.Count, c).End(xlUp).Row
For r = 2 To ur
For c1 = c To c + 3
If wk.Cells(r, c1) <> "" Then mcomb = mcomb & wk.Cells(r, c1) & " "
Next c1
If mcomb <> "" Then
mcomb = Left(mcomb, Len(mcomb) - 1)
If Not .exists(mcomb) Then
.Add mcomb, 1
Else
oDic(mcomb) = oDic(mcomb) + 1
End If
mcomb = ""
End If
Next r
Next c
End With
arrK = oDic.keys
arrK1 = oDic.items
riga = 1
c = 1
For j = 0 To UBound(arrK)
test = Split(arrK(j), " ")
For I = 0 To UBound(test)
Cells(riga, c) = test(I)
c = c + 1
Next
c = 1
riga = riga + 1
Next
[E1].Resize(UBound(arrK1) + 1) = Application.Transpose(arrK1)
End Sub
Matteo:mancano quase tutte le dichiarazioni delle variabili, queste almeno cerca di mettercele tu😉
saluti
Edit: c'è un errore alla fine, vedo se posso sistemarlo. Comunque il calcolo senza la stampa finale ci impega circa 5-6 minuti con 5 Milioni di numeri....
[Modificato da dodo47 27/04/2020 19:56] Domenico
Win 10 - Excel 2016 |
| | Post: 238 | Registrato il: 03/10/2015
| Città: ALBAREDO PER SAN MARCO | Età: 44 | Utente Junior | 2003 | | OFFLINE |
|
27/04/2020 18:14 | |
Ciao Locate ho modificato la riga e al controllo con dei punti di interruzione mi si blocca ancora vedi foto.
Il codice con poche range di numeri mi funziona anche a me ,ma ripeto devo inserire 900000 non è meglio magari lavorare solo sul range AD.
Io non riesco a modificare il codice.
Ciao grazie Matteo |
| | Post: 239 | Registrato il: 03/10/2015
| Città: ALBAREDO PER SAN MARCO | Età: 44 | Utente Junior | 2003 | | OFFLINE |
|
27/04/2020 20:11 | |
Buona sera Domenico ho risposto prima a Locate perché non ho aggiornato la pagina per circa mezz'ora e non ho visto il tuo post.
Ti ringrazio e ti faccio sapere al più presto |
| | Post: 240 | Registrato il: 03/10/2015
| Città: ALBAREDO PER SAN MARCO | Età: 44 | Utente Junior | 2003 | | OFFLINE |
|
27/04/2020 20:30 | |
Buona sera Domenico con calma studierò come modificare tutte le dichiarazioni delle variabili, appena si potrà uscire di casa mi
iscriverò per fare un corso di Excel, chiedo se gentilmente per ora lo puoi fare tu. Grazie anticipatamente Matteo. |
| | Post: 2.735 | Registrato il: 06/04/2013
| Utente Veteran | 2010 | | OFFLINE |
|
28/04/2020 13:51 | |
matteo...credo proprio che tu ne abbia bisogno....Funziona anche se non fai le dichiarazioni delle variabili, io non ce le metto.
Comunque, ho elaborato ca. 4 milioni di numeri posti nelle 20 colonne del foglio Fascia, ottenendo sul foglio contatore-finale circa 900 mila risultati.
Ci mette più o meno 4 minuti e finchè non finisce (msgBox) ti suggerisco di non lavorare su excel.
Questa la macro
Sub Analizza2()
Dim oDic As Object
t = Time
Application.DisplayAlerts = False
Application.Calculation = xlCalculationManual
Set oDic = CreateObject("scripting.dictionary")
Set wk = Worksheets("fascia")
Worksheets("contatore-finale").Select
Cells.ClearContents
With oDic
For c = 1 To 21 Step 5
ur = wk.Cells(Rows.Count, c).End(xlUp).Row
For r = 2 To ur
For c1 = c To c + 3
If wk.Cells(r, c1) <> "" Then mcomb = mcomb & wk.Cells(r, c1) & " "
Next c1
If mcomb <> "" Then
mcomb = Left(mcomb, Len(mcomb) - 1)
If Not .exists(mcomb) Then
.Add mcomb, 1
Else
oDic(mcomb) = oDic(mcomb) + 1
End If
mcomb = ""
End If
Next r
Next c
End With
If oDic.Count > 1040000 Then
MsgBox "Troppe righe, foglio non capiente"
Exit Sub
End If
Arrk = oDic.keys
arrk1 = oDic.items
For j = 0 To UBound(Arrk)
Cells(j + 1, 1) = Arrk(j)
Cells(j + 1, 6) = arrk1(j)
Next
'[E1].Resize(UBound(arrk1) + 1) = Application.Transpose(arrk1)
Range("A1:A" & UBound(Arrk) + 1).TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=False, _
Semicolon:=False, Comma:=False, Space:=True, Other:=False, FieldInfo _
:=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1)), TrailingMinusNumbers:= _
True
Application.DisplayAlerts = True
Application.Calculation = xlCalculationManual
MsgBox Format(Time - t, "hh:mm:ss")
End Sub
saluti
[Modificato da dodo47 28/04/2020 13:51] Domenico
Win 10 - Excel 2016 |
| | Post: 242 | Registrato il: 03/10/2015
| Città: ALBAREDO PER SAN MARCO | Età: 44 | Utente Junior | 2003 | | OFFLINE |
|
28/04/2020 15:37 | |
Ciao Domenico ti ringrazio un'ennesima volta non mi andava perchè non
mettevo la macro in un modulo ma direttamente nel foglio, per quanto riguarda le dichiarazioni delle variabili ho letto molto ieri sera ma io non apprendo finchè non ho un esempio, farò i corsi sicuramente perché Vba per me è diventata una passione. Saluti e grazie ancora complimenti. |
| | Post: 2.738 | Registrato il: 06/04/2013
| Utente Veteran | 2010 | | OFFLINE |
|
28/04/2020 17:45 | |
Matteo...è dal 2015 che dici così....
Correggi la penultima riga:
Application.Calculation = xlCalculationManual
deve essere:
Application.Calculation =xlCalculationAutomatic
saluti
Domenico
Win 10 - Excel 2016 |
| | Post: 244 | Registrato il: 03/10/2015
| Città: ALBAREDO PER SAN MARCO | Età: 44 | Utente Junior | 2003 | | OFFLINE |
|
28/04/2020 18:07 | |
Esecuzione codice pausa Analizza Cinquine Buona sera Forum e un saluto particolare a Dodo47. Avendo a disposizione tantissimo tempo sto cancellando file inutili e utili che mi fanno passare in modo abbastanza tranquillo i pomeriggi e le serate, inoltre sto imparando ad usare in modo utente di base lo sottolineo (VBA) con grande impegno ma con pochi risultati e mi sono trovato con un file identico a questo della discussione. L'unica cosa è che la macro analizza in essa contenuta non ha le stesse istruzioni della macro precedente ha uguale solo il nome. La differenza è che c'è
un numero in più da ricercare prima erano 4 ora sono 5.Ho provato
stamattina ad inserire le 900000 righe di numeri (5) in un altro pc
e dopo 6 ore di esecuzione della macro lo spento se no mi sa che bruciavo il disco fisso. Se qualcuno a voglia di vederlo,
buona serata Matteo. |
| | Post: 245 | Registrato il: 03/10/2015
| Città: ALBAREDO PER SAN MARCO | Età: 44 | Utente Junior | 2003 | | OFFLINE |
|
28/04/2020 18:11 | |
Matteo...è dal 2015 che dici così....
E verò Domenico ma stavolta li faccio veramente cosa succede
se lascio Application.Calculation =xlCalculationManual ?
[Modificato da gattodimarmo1980 28/04/2020 18:12] |
| | Post: 2.739 | Registrato il: 06/04/2013
| Utente Veteran | 2010 | | OFFLINE |
|
29/04/2020 12:33 | |
Io non so che cosa c'è nel tuo foglio oltre quello che hai messo nel tuo esempio.
Pertanto, poichè in excel qualsiasi cosa scrivi le formule vengono tutte ricalcolate ogni volta che modifichi/scrivi in una cella, ho messo all'inizio:
Application.Calculation =xlCalculationManual
Questo blocca momentaneamente il calcolo di tutte le celle.
Ovviamente alla fine questo "blocco" va rimosso con:
Application.Calculation =xlCalculationAutomatic
-----------------------------------------------------------------
Scordati di elaborare 900.000 righe composte ciascuna da cinque blocchi di cinque righe ciascuna, sono 22,5 milioni di numeri
saluti
Domenico
Win 10 - Excel 2016 |
| | Post: 247 | Registrato il: 03/10/2015
| Città: ALBAREDO PER SAN MARCO | Età: 44 | Utente Junior | 2003 | | OFFLINE |
|
29/04/2020 17:06 | |
Buona giornata Dodo47, volevo precisare che il foglio allegato al
post 14 con macro allegata fa lo stesso lavoro della macro del post11 quella che mi hai sistemato ed è funzionante anche questa con un numero limitato di righe.L'unica differenza sta che in questa macro
io posso inserire un numero in più da 4 a 5.Per esempio se io prima
inserivo 90 89 88 87 in una riga, ora nel foglio allegato posso inserire 90 89 88 87 86 vedi quindi chè c'e un numero in più da ricercare l'unica cosa e che ho notato che le due macro lavorano
con istruzioni differenti. La fascia del contatore perciò dei due fogli sono differenti ma quando mi scrivi
"Scordati di elaborare 900.000 righe composte ciascuna da cinque blocchi di cinque righe ciascuna, sono 22,5 milioni di numeri "
volevo solo farti vedere delle foto perché sicuramente mi sono spiegato male io. Prima due foto fatte con macro tua Analizza2 e contatore fino a 4 elementi. Seconde due foto fatta con macro di cinque elementi. I risultati sono evidenziati in giallo vedi, sia con 4 numeri o 5 il risultato è 30.Ovviamente il risultato per il
foglio allegato al post 14 è nella colonna "f" al posto della colonna "e". Come vedi io posso solo vedere le quaterne e ho creato
il post 14 perché volevo vedere se riuscivo ad analizzare cinquine con
un numero molto ampio di righe. (Una soluzione sarebbe quella di lasciarmi mettere un numero al posto delle colonne nere)ma dopo andrebbe rifatto il codice.
Allego le foto solo per chiarire. Ho corretto Application.Calculation =xlCalculationAutomatic grazie della spiegazione, ora devo chiederti delle cose perché ho già provato ad inserire dati sensibili.Io posso analizzare le righe fino alla riga 1040000?Grazie e buona giornate
|
| | Post: 2.744 | Registrato il: 06/04/2013
| Utente Veteran | 2010 | | OFFLINE |
|
30/04/2020 16:18 | |
ciao
perchè hai solo 5 gruppi di cinque colonne ciascuno ?? Sono solo 5 ruote ?
saluti
[Modificato da dodo47 30/04/2020 16:26] Domenico
Win 10 - Excel 2016 |
| | Post: 248 | Registrato il: 03/10/2015
| Città: ALBAREDO PER SAN MARCO | Età: 44 | Utente Junior | 2003 | | OFFLINE |
|
30/04/2020 16:58 | |
Buon giorno Domenico.Sono solo 5 ruote .Le ruote non esistono perché dovrei nasconderlo.Il contatore restituisce esattamente il numero di righe in base a quello che ho inserito nelle fasce. Alle domanda perché hai solo 5 gruppi di cinque colonne ciascuno ?? Come vedi nella foto del post1 all'inizio il codice è stato creato per cercare (4) ripeto (4) numeri e ora volevo vederne 5. Volevo chiederti se posso modificare la tua macro oltre alla riga 1040000,Tutto qua. Grazie Matteo |
| | Post: 2.745 | Registrato il: 06/04/2013
| Utente Veteran | 2010 | | OFFLINE |
|
30/04/2020 17:33 | |
Ciao
questo per analizzare 5 numeri. Ti ricordo che i numeri nel foglio fascia partono da riga 2
Per quanto riguarda superare il 1040000 di righe è troppo complesso e non ho tempo.
Nota: ho ottimizzato la macrorispetto a quell'altra.
saluti
Sub Analizza()
Dim oDic As Object
Dim arrOut() As Variant, arrSplit As Variant
t = Time
Application.DisplayAlerts = False
Application.Calculation = xlCalculationManual
Set oDic = CreateObject("scripting.dictionary")
Set wk = Worksheets("fascia")
Worksheets("contatore-finale").Select
Cells.ClearContents
With oDic
For c = 1 To 25 Step 6
ur = wk.Cells(Rows.Count, c).End(xlUp).Row
For r = 2 To ur
For c1 = c To c + 4
If wk.Cells(r, c1) <> "" Then mcomb = mcomb & wk.Cells(r, c1) & " "
Next c1
If mcomb <> "" Then
mcomb = Left(mcomb, Len(mcomb) - 1)
If Not .exists(mcomb) Then
.Add mcomb, 1
Else
oDic(mcomb) = oDic(mcomb) + 1
End If
mcomb = ""
End If
Next r
Next c
End With
If oDic.Count > 1040000 Then
MsgBox "Troppe righe, foglio non capiente"
Exit Sub
End If
arrK = oDic.keys
arrK1 = oDic.items
ReDim arrOut(1 To oDic.Count, 1 To 5)
For I = LBound(arrK) To UBound(arrK)
arrSplit = Split(arrK(I))
For j = LBound(arrSplit) To UBound(arrSplit)
arrOut(I + 1, j + 1) = arrSplit(j)
Next j
j = 0
Next I
Range("A1").Resize(oDic.Count, 5).Value = arrOut
ReDim arrOut(1 To oDic.Count, 1 To 1)
For I = LBound(arrK1) To UBound(arrK1)
arrSplit = Split(arrK1(I))
For j = LBound(arrSplit) To UBound(arrSplit)
arrOut(I + 1, j + 1) = arrSplit(j)
Next j
j = 0
Next I
Range("F1").Resize(oDic.Count, 1).Value = arrOut
Application.DisplayAlerts = True
Application.Calculation = xlCalculationAutomatic
MsgBox Format(Time - t, "hh:mm:ss")
End Sub
Domenico
Win 10 - Excel 2016 |
| | Post: 249 | Registrato il: 03/10/2015
| Città: ALBAREDO PER SAN MARCO | Età: 44 | Utente Junior | 2003 | | OFFLINE |
|
30/04/2020 20:35 | |
Buona sera Dodo47, ho provato solo ora il codice ,una velocità sconvolgente. Ti Ringrazio . Quando avrai tempo di modificare il codice te o qualcun'altro è sempre sottointeso (vedi regolamento del forum)soprattutto per gli utenti nuovi del forum, leggete bene il regolamento,per quanta riguarda il superare le 1040000 righe finalmente questa discussione sarà finita.A presto |
| | Post: 2.748 | Registrato il: 06/04/2013
| Utente Veteran | 2010 | | OFFLINE |
|
01/05/2020 10:09 | |
Matteo
tieni presente che quest'ultima macro la puoi utilizzare sia per 5 numeri che per 4, 3....
Pertanto se 5 numeri tutte le colonne (tranne le nere) saranno piene, se 4 numeri, l'ultima colonna di ciascun blocco sarà vuota, se 3 numeri le ultime due colonne di ciascun saranno vuote etc etc.
Spero di esser stato chiaro.
saluti
Domenico
Win 10 - Excel 2016 |
| | Post: 250 | Registrato il: 03/10/2015
| Città: ALBAREDO PER SAN MARCO | Età: 44 | Utente Junior | 2003 | | OFFLINE |
|
01/05/2020 11:03 | |
Buona giornata Dodo,Sei stato chiarissimo non ci avevo pensato. In
pratica posso inserire righe per un totale di (1040000x5).Giusto ?
Buon 1 maggio a tutti |
| | Post: 2.750 | Registrato il: 06/04/2013
| Utente Veteran | 2010 | | OFFLINE |
|
01/05/2020 11:12 | |
No matteo, non è così semplice.
Tu non puoi sapere all'inizio quante righe usciranno fuori dall'elaborazione, sono queste che non devono superare il limite ed ecco perchè ho messo quel msg box.
Ti faccio un esempio sciocco ma che rende l'idea:
se tu scrivessi la medesima cinquina in ogni fascia e per 1048000 di righe, il risultato sarebbe 1 riga con la cinquina ed affianco il contatore del numero di volte che si ripete. Pertanto 1 riga c'entra nel foglio e mi pare ovvio.
Se invece le righe da stampare DOPO L'ELABORAZIONE sono più di 1048000 non c'entrano.
Spero di aver chiarito.
saluti
[Modificato da dodo47 01/05/2020 11:13] Domenico
Win 10 - Excel 2016 |
| | Post: 251 | Registrato il: 03/10/2015
| Città: ALBAREDO PER SAN MARCO | Età: 44 | Utente Junior | 2003 | | OFFLINE |
|
01/05/2020 12:10 | |
Con l'esempio ora ho capito , grazie del chiarimento ciao Dodo e buona giornata Matteo |
| | Post: 407 | Registrato il: 03/10/2015
| Città: ALBAREDO PER SAN MARCO | Età: 44 | Utente Senior | 2003 | | OFFLINE |
|
16/01/2022 18:59 | |
Buona sera Dodo47 Per quanto riguarda superare il 1040000 di righe è troppo complesso e non ho tempo ho fatto io una stupidata ho modificato If oDic.Count > 1040000 Then in If oDic.Count > 2040000 Then ho inserito 1300000 record nelle fasce da analizzare e ho questo errore la foto allegata sopra; Ti chiedo un altra volta un aiuto a te o ad utenti per trovare un sistema per sapere all'inizio quante righe usciranno fuori dall'elaborazione così poi avrò il calcolo dei record .Sono fermo con dei lavori perchè senza questa macro funzionante solo per 1040000 di righe non posso aprire una nuova discussione sulle permutazioni dopo spiegherò il perchè con calma.A presto un caro saluto Matteo [Modificato da gattodimarmo1980 16/01/2022 19:08] |
|
|