Controlul executiei in VBA/Excel

AdrianB1

Membru Senior
Sugar daddy
M-a mancat undeva sa fac un mic script in Excel (sub 1000 de linii de cod) care importa niste fisiere text cu un format ciudat, le curata, apoi face mii de apeluri http POST pentru a mai completa niste date (xml) si apoi arunca totul intr-o baza SQL pentru prelucrari serioase. Problema e urmatoarea: in timpul celor cateva mii sau zeci de mii de apeluri http Excel-ul devine complet inert, nu raspunde la nimic. De asemenea cand pornesti scripturile (l-am spart: unul face importul fisierelor, unul apelurile http, unul copierea in SQL) nu prea stii de la inceput la ce volum sa te astepti, sunt fisiere cu cateva linii si fisiere cu peste 10.000 de linii (si au doar 100kb), asa ca te poti trezi cu computerul mai mult sau mai putin blocat (cel putin Excel-ul e blocat, uneori si alte programe din suita Office mai intepenesc) poate si pentru o ora sau mai mult.

Ce vreau sa fac: atunci cand fac apelurile http sa afisez un progress bar (gen Msgbox) care spune la ce inregistrare e din RowCount() si sa pun si un buton de pauza sau cancel. Nici macar separat nu am idee cum sa o fac fara sa pun un form pe ecran care se actualizeaza la fiecare linie, dar fiind Excel numai de un form nu prea am chef. Exista si alta varianta?
 
Îmi amintesc că am încercat o dată chestia asta cu status bar sau label pe un form - e drept, era Access - și n-a mers. Scriptul acapara toată puterea de calcul disponibilă încât aplicația nu mai făcea refresh la form ca să afișeze schimbarea valorii. Și aici m-am blocat, încercând mai multe metode de a forța refresh-ul fără succes. Iar cu msgbox mori încet, fiindcă oprește toată execuția și atunci s-a terminat cu ideea de unattended processing...

Cu alte cuvinte, n-am soluție dar sunt curios să aflu una.
 
Adrian:

Pentru a creşte viteza de procesare (enorm, de ordinul 100:1), foloseşti codul următor:

Code:
Application.ScreenUpdating = False
cod
.
.
.
cod
Application.ScreenUpdating = True

Pentru a afişa un status, e niţel mai complicat, trebuie să creezi o variabilă de tip string şi în ea să verşi informaţia care vrei să se afişeze. Asta depinde mult de ce faci acolo. un exemplu din care să te inspiri, făcut rapid pe genunchi.

Code:
dim texttoshow as string
dim i as integer

select sheets(1)
application.screenupdating = false
for i = 2 to 9999 step 1
 cells(i,1).value = i
 if mod(i,100) = 0 then
  application.screenupdating = true
  application.statusbar = 'Cells processed: ' & str(i) & ' of ' & str(rowcount())
  application.screenupdating = false
 end if
next i
application.screenupdating = true
msgbox 'DONE!'
application.statusbar = false

Încearcă-l într-un spreadsheet gol.

Ce face scriptul:
- pune valoarea din variabila i în celula din colana 1, rândul i;
- la fiecare 100 de valori, pune un text în statusbar în Excel care îţi spune pe unde se află (incremental)
- când termină, afişează un pop-up şi resetează statusbar-ul la default (altfel rămâne textul acolo până închizi Excel-ul)

Întreruperea temporară a unui script se face cu ctrl+break.

Sorry dacă scriptul nu merge din prima, l-am scris din cap, că n-am Office pe sistemul de acasă :smile:
 
Back
Top