Allora, il mio primo dubbio e' che, quando la macro termina rapidamente, possa non aver scritto tutte le formule, risparmiando cosi' un po' di tempo.
Per questo dico:
1) la tua macro scrive un tot di formule nel ciclo For y = xy To Rsdata / For I = 0 To NrTitoliTrading – 1 /Next I /Next y:
-se prima di avviare quel ciclo tutte le celle che saranno oggetto di inserimento di formule vengono cancellate allora, a conclusione della macro, avremo la certezza che tutte le formule sono state compilate (o l'evidenza che un tot non lo siano state).
2) inoltre vorrei essere certo che il ciclo di compilazione delle formule includa sempre anche la ricompilazione dei vari externalLinkXYZ.xml; per questo subito dopo aver cancellato le formule bisogna procedere con un salvataggio del Workbook
Quanto alle formule, vorrei capire meglio quale quantita' di celle e' coinvolta; ora io non ho la minima idea di cosa ci sia nelle variabili (ad esempio) UscitaNomeTitolo, NrDay, LagUscitaNomeTitolo quindi non posso farmi un'idea di quanto pesanti siano le formule e se i loro componenti puntano a externalLink diversi. Quindi mi interessa vedere alcune formule.
Ad esempio, nella tua Sub AggiornaTutto, nella seconda parte c'e' questo loop:
- Codice: Seleziona tutto
'tiro fuori leva trade e risultati
For y = xy To Rsdata
For I = 0 To NrTitoliTrading – 1
'
'altre istruzioni
'
Cells(y, PcSez2Vba + I).FormulaLocal = "=SE(TitForTrading>=" & I + 1 & ";INDICE('" & path2 & NomeFile & ".xlsm'! " & UscitaNomeTitolo & ";NrDay+LagUscitaNomeTitolo-INDICE(PrimaRiga;CONFRONTA(""" & NomeFile & """;TI;0)));"""")"
'
'altre istruzioni
'
Cells(y, PcSez2Vba + NrTitoliTrading + I).FormulaLocal = "=SE(TitForTrading>=" & I + 1 & ";SE(INDICE('" & path2 & NomeFile & ".xlsm'! " & UscitaRend & ";NrDay+LagUscitaRend-INDICE(PrimaRiga;CONFRONTA(""" & NomeFile & """;TI;0)))="""";"""";INDICE('" & path2 & NomeFile & ".xlsm'! " & UscitaCval & ";NrDay+LagUscitaCval-INDICE(PrimaRiga;CONFRONTA(""" & NomeFile & """;TI;0))));"""")"
'
'altre istruzioni
'
Cells(y, PcSez2Vba + NrTitoliTrading * 2 + I).FormulaLocal = "=SE(TitForTrading>=" & I + 1 & ";SE(INDICE('" & path2 & NomeFile & ".xlsm'! " & UscitaLeva & ";NrDay+LagUscitaLeva-INDICE(PrimaRiga;CONFRONTA(""" & NomeFile & """;TI;0)))="""";"""";INDICE('" & path2 & NomeFile & ".xlsm'! " & UscitaLeva & ";NrDay+LagUscitaLeva-INDICE(PrimaRiga;CONFRONTA(""" & NomeFile & """;TI;0))));"""")"
'
'Continua istruzioni
'
Allora metti uno Stop in questa posizione:
- Codice: Seleziona tutto
Ricomincia2:
Next I
If y = xy Then Stop '<<< Stop alla fine del primo ciclo I; vedi testo
Next y
Avvia la macro e quando arriva allo Stop copia e pubblica almeno le prime 3 formule della prima colonna che questo ciclo ha inserito; se vuoi pubblicarne di piu' va benissimo purche' siano in sequenza (in modo da poterle confrontare che le istruzioni che le hanno generate). Aggiungo che potrebbe essere utile avere anche la vista di come cambia in orizzontale la prima formula.
Poi (dallo Stop) completa la macro con F5.
Potrebbe essere utile creare una configurazione ridotta di file (che faccia le stesse cose pero' su un numero ridotto di file o di titoli, in modo da poter esaurire dei cicli di test in 15 minuti invece che 2 ore.
Ti avevo anche suggerito di "misurare" i tempi di esecuzione delle varie fasi; limitandoci alla seconda fase delle modifiche fatte dal vba andrebbe modificato il ciclo come segue:
- Codice: Seleziona tutto
'tiro fuori leva trade e risultati 'INIZIO MODIFICHE PER METRICA
Dim myTim As Single
Debug.Print ">>>>>>", "Y max = " & Rsdata, "I max = " & NrTitoliTrading
For y = xy To Rsdata
Debug.Print "Y = " & y
For I = 0 To NrTitoliTrading - 1
'acquisisco il nome del file
If Cells(y, PcSez2Vba - NrTitoliTrading * 3 + I) = "" Then GoTo Saltacella2
NomeFile = Cells(y, PcSez2Vba - NrTitoliTrading * 3 + I).Value
Debug.Print NomeFile 'NOME FILE, vedi Testo
'formatto le celle e scrivo il nome del file tradato
Cells(y, PcSez2Vba + I).Select
Selection.NumberFormat = "#,##0"
Cells(y, PcSez2Vba + I).FormulaLocal = "=SE(TitForTrading>=" & I + 1 & ";INDICE('" & path2 & NomeFile & ".xlsm'! " & UscitaNomeTitolo & ";NrDay+LagUscitaNomeTitolo-INDICE(PrimaRiga;CONFRONTA(""" & NomeFile & """;TI;0)));"""")"
If y = xy Then Debug.Print Format(Timer - myTim, "0.00"), I
'formatto le celle e scrivo il controvalore
Cells(y, PcSez2Vba + NrTitoliTrading + I).Select
Selection.NumberFormat = "#,##0"
Cells(y, PcSez2Vba + NrTitoliTrading + I).FormulaLocal = "=SE(TitForTrading>=" & I + 1 & ";SE(INDICE('" & path2 & NomeFile & ".xlsm'! " & UscitaRend & ";NrDay+LagUscitaRend-INDICE(PrimaRiga;CONFRONTA(""" & NomeFile & """;TI;0)))="""";"""";INDICE('" & path2 & NomeFile & ".xlsm'! " & UscitaCval & ";NrDay+LagUscitaCval-INDICE(PrimaRiga;CONFRONTA(""" & NomeFile & """;TI;0))));"""")"
If y = xy Then Debug.Print Format(Timer - myTim, "0.00"), I
'formatto le celle e scrivo la leva
Cells(y, PcSez2Vba + NrTitoliTrading * 2 + I).Select
Selection.NumberFormat = "0.00_ ;[Red]-0.00 "
Cells(y, PcSez2Vba + NrTitoliTrading * 2 + I).FormulaLocal = "=SE(TitForTrading>=" & I + 1 & ";SE(INDICE('" & path2 & NomeFile & ".xlsm'! " & UscitaLeva & ";NrDay+LagUscitaLeva-INDICE(PrimaRiga;CONFRONTA(""" & NomeFile & """;TI;0)))="""";"""";INDICE('" & path2 & NomeFile & ".xlsm'! " & UscitaLeva & ";NrDay+LagUscitaLeva-INDICE(PrimaRiga;CONFRONTA(""" & NomeFile & """;TI;0))));"""")"
If y = xy Then Debug.Print Format(Timer - myTim, "0.00"), I
'formatto le celle e scrivo il rendimento
Cells(y, PcSez2Vba + NrTitoliTrading * 3 + I).Select
Selection.NumberFormat = "0.00_ ;[Red]-0.00 "
With Selection.Font
.Color = -10477568
.TintAndShade = 0
End With
Cells(y, PcSez2Vba + NrTitoliTrading * 3 + I).FormulaLocal = "=SE(TitForTrading>=" & I + 1 & ";SE(INDICE('" & path2 & NomeFile & ".xlsm'! " & UscitaRend & ";NrDay+LagUscitaRend-INDICE(PrimaRiga;CONFRONTA(""" & NomeFile & """;TI;0)))="""";"""";INDICE('" & path2 & NomeFile & ".xlsm'! " & UscitaRend & ";NrDay+LagUscitaRend-INDICE(PrimaRiga;CONFRONTA(""" & NomeFile & """;TI;0)))*RC[-" & NrTitoliTrading * 4 & "]/(1/TitForTrading));"""")"
If y = xy Then Debug.Print Format(Timer - myTim, "0.00"), I
'formatto le celle e scrivo il rendimento con capitale levato
Cells(y, PcSez2Vba + NrTitoliTrading * 4 + I).Select
Selection.NumberFormat = "0.00_ ;[Red]-0.00 "
With Selection.Font
.Color = -10477568
.TintAndShade = 0
End With
Cells(y, PcSez2Vba + NrTitoliTrading * 4 + I).FormulaLocal = "=SE(TitForTrading>=" & I + 1 & ";SE(INDICE('" & path2 & NomeFile & ".xlsm'! " & UscitaRendLeva & ";NrDay+LagUscitaRendLeva-INDICE(PrimaRiga;CONFRONTA(""" & NomeFile & """;TI;0)))="""";"""";INDICE('" & path2 & NomeFile & ".xlsm'! " & UscitaRendLeva & ";NrDay+LagUscitaRendLeva-INDICE(PrimaRiga;CONFRONTA(""" & NomeFile & """;TI;0)))*RC[-" & NrTitoliTrading * 5 & "]/(1/TitForTrading));"""")"
If y = xy Then Debug.Print Format(Timer - myTim, "0.00"), I
Ricomincia2:
Next I
Debug.Print Format(Timer - myTim, "0.00"), I, y
If y = xy Then Stop '<<< Stop alla fine del primo ciclo I; vedi testo
Next y
Debug.Print "----": Debug.Print "----"
If y <= Rsdata And I <= NrTitoliTrading Then
Saltacella2: 'FINE MODIFICHE PER METRICA
Spero non sia difficile identificare l'area in cui ho lavorato e che va sostituita col mio codice.
Il risultato e' che verra' scritto nella finestra Immediata del vba il tempo richiesto dall'inizio ad arrivare a quella fase: nel primo ciclo For I = 0 To NrTitoliTrading – 1 / Next I verra' scritto il tempo per ognuna delle N formule scritte (7 * N Colonne); nei cicli successivi si scrivera' solo il tempo complessivo.
Ho anche previsto di registrare il "NomeFile".
Purtroppo io QUESTO codice non sono in grado di testarlo, spero di non aver fatto cappellate...
Cosa si puo' ottenere dall'esame di questi tempi? Non lo so, ma spero che confrontando i tempi di una situazione "normale" con una "anomala" magari si possa accendere un lumicino...
Se decidi di inserire queste misurazioni allora raccogli un paio di situazioni normali e, quando succederera', raccogli la metrica della sessione; se pubblichi poi queste misurazioni vediamo insieme se salta fuori qualcosa.
Da parte mia una serie di simulazioni con link esterni, ripetuta per migliaia di volte, ha prodotto sempre gli stessi risultati, sia su XL2010 che XL2016
Per accedere alla "finestra Immediata" del vba, dal premi Contr-g
Una sessione di misura comincia con Debug.Print ">>>>>", "Y max = " etc etc e termina con due righe di "----"
Non perdere il messaggio di Zer0K (vedi sopra; certo che se avessimo visto le formule la domanda sarebbe stata inutile)
Ciao