Moderatori: Anthony47, Flash30005
Anthony47 ha scritto:Leggi il messaggio di Flash, sopra.
In linea di massima sono "mortali" le formule a matrice (quelle introdotte con Contr-Maiusc-Enter) che hanno un intervallo di riferimento indefinito; tipo quelle inserite in "Periodo di interesse" cella L3 (che tra l'altro non ho capito): =DEV.ST(SE($F:$F="PRE";$J:$J:$I:$I)) e che ho modificato in =DEV.ST(SE($F1:$F1000="PRE";$J1:$J1000))
Modifiche analoghe alle formule in M3 ed N3.
Queste modifiche non hanno cambiato la dimensione del file ma hanno drasticamente ridotto il tempo di ricalcolo
Altre modifiche con effetti meno evidenti sulle prestazioni:
G3 e sottostanti:
=SE(E:E=".";G2;E:E) --> =SE(E3=".";G2;E3)
L2 e adiacenti:
=MEDIA.SE($F:$F;"PRE";$J:$J) --> =MEDIA.SE($F1:$F1000;"xyz";$J1:$J1000)
In O3
=SE((E($F:$F="PRE";$J3>L$2-1,96*L$3;$J3<L$2+1,96*L$3));$J3) --> =SE((E(F4="PRE";$J4>L$2-1,96*L$3;$J4<L$2+1,96*L$3));$J4)
In S3:
=SE($F:$F="PRE";O:O;SE($F:$F="DURING";P:P;SE($F:$F="POST";Q:Q)))
--> =SE(F3="PRE";O3;SE($F3="DURING";P3;SE($F3="POST";Q3)))
In AH3
=SE(S3=FALSO;"ARTEFATTO";G:G) --> =SE(S3=FALSO;"ARTEFATTO";G3)
Su Foglio DIFFERENZE, ho scritto in A1 "artefatto" e ho modificato tutte le formule
Es D3
=SE('ANALISI PRELIMINARI'!C3="artefatto";"artefatto";'ANALISI PRELIMINARI'!C3-'ANALISI PRELIMINARI'!$B3)
--> =SE('ANALISI PRELIMINARI'!C3=$A$1;$A$1;'ANALISI PRELIMINARI'!C3-'ANALISI PRELIMINARI'!$B3)
NB: nelle formule dove ho sostituito es F:F con F1:F1000, se 1000 e' insufficiente si puo' mettere 10mila, o 100mila, e sara' sempre meglio che la colonna intera.
La maggior parte di spazio deriva dai dati contenuti nelle celle; sul foglio DIFFERENZE ci sono 450mila formule, molto semplici per la verita', ma il foglio alla fine occupa circa 4.6 mbyte dei 7.8 Mmbyte totali del file.
Il foglio "DIFFERENZE (sost con falso)" mi pare che contenga gli stessi 450mila valori, come valori e non come formula, e occupa circa 1.9 mbyte (mi sarei aspettato il doppio, a 8 byte/cella); e' evidente che non ha senso mantenere sia un foglio che l' altro, ma e' probabile che non si possa eliminare quello con le formule e in questo caso quello e' il foglio dove l' uso di una macro per calcolare quel tabellone (al posto delle formule) puo' risultare piu' conveniente, in termini di dimensione del file (ma se i dati cambiano in modo dinamico nel foglio "ANALISI PRELIMINARI" i risultati su "DIFFERENZE" rimangono disallineati fino alla riesecuzione della macro).
A parte questi interventi e queste considerazioni non ho capito il lavoro che complessivamente stai facendo, quindi non mi son fatta un'idea di come rendere il tutto piu' snello.
Ciao
Anthony47 ha scritto:Il file l'ho manipolato troppo perche' possa garantire che sia ancora simile a quello da te pubblicato; quindi devi apportare in proprio le modifiche partendo dal tuo file.
Mi e' venuto all'occhio che il foglio che occupa piu' spazio e' "DIFFERENZE", quello con le formule; mentre l' equivalente con i soli dati occupa molto meno. Le formule fanno riferimento al foglio "ANALISI PRELIMINARI", che e' quello popolato dalla macro Trasponi3 che avevamo sviluppato in precedenza.
Quindi e' relativamente facile accodare una seconda macro alla Trasponi3 per calcolare tutto il contenuto del foglio "DIFFERENZE", in modo che occupi meno spazio.
Vorrei sapere se questo ragionamento ti torna, e se Si
-mi confermi che in "DIFFERENZE" vanno calcolate tante celle quante ne sono presenti in "ANALISI PRELIMINARI"?
-mi confermi che i FALSO che sono presenti in "DIFFERENZE (sost con falso)"sono la semplice sostituzione degli errori #DIV/0!?
Ciao
Sub Differenze()
Dim AP As Worksheet, DIF As Worksheet, myAPB, DiffArr()
Dim WArr, LastA1 As Long, LastC1 As Long, LB1 As Long, LB2 As Long
'
Set AP = Sheets("ANALISI PRELIMINARI")
Set DIF = Sheets("DIFFERENZE")
LastA1 = AP.Cells(Rows.Count, 1).End(xlUp).Row
AP.Select
LastC1 = AP.Range(Range("A2"), Range("A" & LastA1)).Resize(, Columns.Count - 10).Find(What:="*", After:=Range("A2"), _
SearchOrder:=xlByColumns, _
SearchDirection:=xlPrevious).Column
'
WArr = AP.Range(Range("A3"), Range("A" & LastA1)).Resize(, LastC1).Value
LB1 = LBound(WArr, 1): LB2 = LBound(WArr, 2)
DIF.Range("D3").Resize(LastA1 - 2, 5000).ClearContents
ReDim DiffArr(1 To (LastA1 - 2), 1 To LastC1)
yartef = DIF.Range("A1").Value
For i = LB1 To UBound(WArr, 1)
myAPB = WArr(i, 2)
For j = LB2 + 2 To UBound(WArr, 2)
If IsError(myAPB) Or IsError(WArr(i, j)) Then
DiffArr(i, j) = False
Else
If WArr(i, j) = yartef Then
DiffArr(i, j) = yartef
Else
DiffArr(i, j) = WArr(i, j) - myAPB
End If
End If
Next j
Next i
DIF.Select
Columns("D:E").Insert Shift:=xlToRight
DIF.Range("D3").Resize(UBound(DiffArr, 1), UBound(DiffArr, 2)).Value = DiffArr
Columns("D:E").Delete Shift:=xlToLeft
End Sub
Torna a Applicazioni Office Windows
File batch per copiare file selezionato da menu contestuale Autore: valle1975 |
Forum: Programmazione Risposte: 3 |
copia di dati da un file chiuso e elaborazione Autore: luca62 |
Forum: Applicazioni Office Windows Risposte: 2 |
Macro per aprire file salvato su sharepoint Onedrive Autore: marcopont |
Forum: Applicazioni Office Windows Risposte: 2 |
Creare un file Excel con fogli visibili in base all'accesso Autore: JanVathek |
Forum: Applicazioni Office Windows Risposte: 28 |
Visitano il forum: Nessuno e 46 ospiti