Condividi:        

non calocoli da excel ma da vb

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

non calocoli da excel ma da vb

Postdi piter123 » 05/04/08 15:48

Salve, stò creando in excel una cartella che effettua dei calcoli anche complessi e poi riporta i risultati su un foglio excel e su un grafico.
Il foglio deve gestire una mole impressionante di calcoli a matrice nonchè di dde esterne appesantendo in maniera eccessiva il foglio. (su alcuni pc fà fatica a girare)
Mi domandavo se invece di fargli fare tutti questi calcoli nelle celle gliele facessi fare da una o più subroutine, il tutto si alleggerirebbe?
Stò facendo delle prove creando delle sub routine e richiamandole all'interno di un ciclo DO UNTIL LOOP all'interno del
Private Sub Worksheet_SelectionChange(ByVal Target As Range).
Utilizzo all'interno del ciclo la funzione doevents per potermi spostare nel foglio e inserire dei dati anche manualmente.
La cartella in excel però è composta da più fogli i quali dati interagiscono fra di loro.
Ora ho notato che sebbene attivi il ciclo DO UNTIL LOOP su tutti i fogli (all'interno dei rispettivi Private Sub Worksheet_SelectionChange) i dati che interagiscono fra loro dei vari foglio vengono aggiornato solo se seleziono il foglio dove essi vengono calcolati e se seleziono e conferno una qualsiasi cella. In sostanza non vengono effettuati automaticamente. Come posso risolvere.

Inoltre secondo voi è corretto utilizzare un sistema del genere (il fatto di essere un ciclo DO until sepre attivo utilizza parecchie risorse del pc) oppure sarebbe meglio un sistema del tipo ogni tot secondi faccio partire le subroutine che effettuano tutti i calcoli di cui necessito ?

Grazie
piter123
Utente Senior
 
Post: 190
Iscritto il: 07/11/07 18:31

Sponsor
 

Re: non calocoli da excel ma da vb

Postdi Anthony47 » 05/04/08 23:45

Non credo che in vba si possa ottenere una velocita' di calcolo superiore a quanto ottenuto con le funzioni native, essendo il vb meno performante del c++ (credo sia questo il linguaggio nativo).
E se usi macro su evento (es Worksheet_SelectionChange) raccomando di bloccare il riconoscimento degli eventi a inizio routine (con Application.EnableEvents = False) e riabilitarli solo alla fine (con Application.EnableEvents = True), facendo attenzione ai possibili punti di uscita. Dico questo senza pero' aver capito bene come il Do until /Loop si innesta nella macro di Worksheet_SelectionChange e su quali condizioni esci dal loop.
Se non hai bisogno di aggiornamenti realtime potresti pensare di disabilitare il calcolo automatico e settarlo in manuale, e periodicamente eseguire i calcoli con una macro che si rischedula ogni xx secondi /minuti e che contenga semplicemente Calculate; come chiedevi nell' ultima domanda.
Per i dati che non si aggiornano l' ipotesi che faccio e' che hai gia' implementato il calcolo Manuale e all' interno delle macro usi ActiveSheet.Calculate invece che il Calculate (ricalcolo globale).
Se hai ancora macchine con excel2000 ci sarebbero altre cose su cui stare attenti.

Non so che uso puoi fare di questi punti, eventualmente approfondiamo le cose che ti sembrano adatte al tuo caso.
Ciao.
Avatar utente
Anthony47
Moderatore
 
Post: 19222
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: non calocoli da excel ma da vb

Postdi piter123 » 07/04/08 10:39

Penso che mi orienterò su un ciclo do until o forse, (stò provando) su un evento workbook_change che sente il cambiamento di una dde ole. Intanto grazie.
piter123
Utente Senior
 
Post: 190
Iscritto il: 07/11/07 18:31

Re: non calocoli da excel ma da vb

Postdi piter123 » 10/04/08 13:16

Alla fine ho optato per ontime a 1 secondo che attiva la macro e fà tutti i calcoli in vb.

la macro che fà i calcoli in vb genera un codice di ricerca sul foglio 1. (ne genera circa un centinaio)
Uno alla volta questi codici di ricerca cercano sul foglio 2 in una colonna il loro valore e quindi una volta trovato prendono la cella sulla riga affianco e la copiano sul foglio 1.
Tutta questa macro si attiva ogni secondo.
Succede che sul foglio 1 mi si presenti uno sfarfallio dovuto al fatto che i dati vengono copiati dal foglio 2 al foglio 1 uno alla volta tramite ciclo for next.

FOR I = 1 TO 100
'POI CI SONO I CALCOLI PER COSTRUIRE LA VARIABILE CRDDEC

CRDDEC = "P" & MESE & ANNO & STRIKE
RIGHETOT = Sheets("FOGLIO2").Range("AT22").End(xlDown).Row - 21 'EFFETTUA RICERCA DDE CON COD CRDDEC
For Z = 1 To RIGHETOT
If CRDDEC = Sheets("FOGLIO2").Cells(Z + 21, 46) Then
DDESCAD = Sheets("FOGLIO2").Cells(21 + Z, 47)
DDEBS = Sheets("FOGLIO2").Cells(21 + Z, 51)
GoTo FINERICERCADDEBOOK1PUT
End If
Next Z
FINERICERCADDEBOOK1PUT:
Sheets("FOGLIO1").Cells(I + 4, 102) = CRDDEC 'SCRIVE SU PORT. GRECHE IL CODICE RICERCA DDE
Sheets("FOGLIO1").Cells(I + 4, 103) = DDESCAD 'SCRIVE SU PORT. GRECHE LA DATA SCADENZA OPZIONE
Sheets("FOGLIO1")).Cells(I + 4, 104) = DDEBS 'SCRIVE SU PORT. GRECHE SE ATTIVO PRICE BS

'POI CI SONO ALTRE RIGHE CHE RESTITUISCONO UN MESSAGGIO SE NON E' STATO TROVATO IL CRDDEC
NEXT I

Ho provato a mettere in testa alla macro Application.ScreenUpdating = False e in fondo Application.ScreenUpdating = true, ma questo non fà altro che peggiorare le cose generando uno sfarfallio di tutto il foglio 1 che è molto fastidioso alla vista, esiste un comando in grado di eliminarlo ?

Grazie
piter123
Utente Senior
 
Post: 190
Iscritto il: 07/11/07 18:31

Re: non calocoli da excel ma da vb

Postdi Anthony47 » 10/04/08 15:06

Le istruzioni Application.ScreenUpdating = False/true sono giuste, se le metti all' inizio e alla fine della macro la visualizzazione dovrebbe essere stabile.
Ritengo pero' che tutto il ciclo possa impiegare piu' di 1 secondo, non so che succede se lo schedule e' piu' veloce del tempo a disposizione. Io comunque schedulerei molto meno frequentemente; fai anche attenzione a come e quando rischeduli e descheduli la macro, perche' potresti trovarti con schedulazioni a frequenza sempre crescente.

Uno alla volta questi codici di ricerca cercano sul foglio 2 in una colonna il loro valore e quindi una volta trovato prendono la cella sulla riga affianco e la copiano sul foglio 1

Ma perche' preferisci fare in vba quello che potresti fare con 2 Cerca.vert seguiti da poche istruzioni vba? ad esempio:
Codice: Seleziona tutto
Sheets("Foglio1").Range("B2").Value = CRDDEC       'occupa B2:B4 su Foglio1
'In C2 e D2 ci sono Cerca.Vert(B2;Foglio2!AT21:AV1000;2;0) e ..;3;0)
Range("B2:D2").Copy
Sheets("Foglio1").Cells(I + 4, 102).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
   :=False, Transpose:=False
Next I


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


Torna a Applicazioni Office Windows


Topic correlati a "non calocoli da excel ma da vb":


Chi c’è in linea

Visitano il forum: Nessuno e 53 ospiti