1. This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn More.

Controlul executiei in VBA/Excel

Discussion in 'Ajutor: Software și sisteme de operare' started by AdrianB1, Nov 29, 2012.

  1. AdrianB1

    AdrianB1 Membru Senior

    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?
     
  2. puterfixer

    puterfixer Administrator

    Î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.
     
  3. war4peace

    war4peace Membru Senior

    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:
     
  4. war4peace

    war4peace Membru Senior

    Fidbec? Anyone? :smile: