preprečitev ponovnega zagona makra

Pomoč pri izdelavi makrov
Odgovori
matjaz
Prispevkov: 32
Pridružen: So Jan 27, 2007 11:19 pm

preprečitev ponovnega zagona makra

Odgovor Napisal/-a matjaz »

pozdravljeni

Imam težavo z makrojem,ki sem ga ustvaril in nisem predvidel možnih
komplikacij.
in sicer: ko imam nek delovni zvezek že odprt z makrojem pokličem nek drug delovni zvezek,ga ta odpre in vanj prekopira določene podatke iz prvega zvezka,nekaj preračuna,presoltira... in tako naprej.
Se,pravi,ko je makro zaključil, samo še shranim,in zadeva je končana.
Toda,nazadnje se je zgodilo,da mi je sodelavka potem,ko je makro opravil svoje delo,le tega še enkrat sprožila in nastal je pravi kaos,poleg tega je pa še vse skupaj hranila.torej ,vsi podatki so se uničili,da ne govorim,kaj se je zgodilo s tabelami.
Torej ,kako se obvarovati pred ponovnim zagonom makra,v kolikor je ta že opravil delo pri odprtih zvezkih in pod kateri dogodek potem to kodo pripeti.
Za odgovor se najlepše zahvaljujem.
lp
admin
Site Admin
Prispevkov: 3692
Pridružen: Sr Jul 20, 2005 10:06 pm

Odgovor Napisal/-a admin »

:) Si boste morali pa pomagati sami, saj samo vi veste, pod kakšnimi pogoji se makro lahko izvede in pod kakšnimi ne.

Če se makro npr. ne sme izvesti 2x na dan, si je potrebno v neko datoteko zapisati, da se je makro izvedel in pred zagonom je potrebno prebrati omenjeno datoteko ter preveriti ali se je makro že izvedel ali ne.

Če se makro ne sme izvesti več kot 1x ko je datoteka odprta (če jo zaprete in ponovno odprete se spet lahko izvede...) potem je stvar še lažja. Samo postavite globalno spremenljivko, da se makro izvedel.
lp,
Matjaž Prtenjak
Administrator
matjaz
Prispevkov: 32
Pridružen: So Jan 27, 2007 11:19 pm

Odgovor Napisal/-a matjaz »

pozdravljen Matjaž
napisali ste:

Koda: Izberi vse

Če se makro ne sme izvesti več kot 1x ko je datoteka odprta (če jo zaprete in ponovno odprete se spet lahko izvede...) potem je stvar še lažja. Samo postavite globalno spremenljivko, da se makro izvedel.
ja,Matjaž,točno to bi rabil,enostavno imam premalo znanja,da bi lahko nadaljeval.
poskušal sem nekako takole:ko se nek list aktivira mi v celico zapiše
številko ena,in v kolikor je v tej celici številka ena potem se makro naj nebi izvajal.ko pa sem zvezek zaprl sem to 1 "brisal v beforeclose",vendar se vseskupaj ne obnese.
imate vi morda bolj enostaven predlog?
za odgovor se zahvaljujem
lp
Stenly
Prispevkov: 223
Pridružen: Sr Jul 27, 2005 11:29 pm

Odgovor Napisal/-a Stenly »

Da ne boste preveč komplicirali naredite še eno preverjanje za zagon makra in odločitev prepustite izvajalcu:

Koda: Izberi vse

Sub Makro1()
'
   If MsgBox("Ali naj izvedem makro?", vbYesNo + vbCritical + vbDefaultButton2, "Izbira...") <> vbYes Then
    MsgBox "Moj makro se ne izvaja."
    Exit Sub
   End If
   
   MsgBox "Moj makro se izvaja."

End Sub
Drugič pa skušajte ločiti podatke in obdelavo podatkov.

Lp
matjaz
Prispevkov: 32
Pridružen: So Jan 27, 2007 11:19 pm

Odgovor Napisal/-a matjaz »

pozdravljen Stenly
hvala za kodo.ta koda sicer preverja tudi prvi zagon ,kar bi lahko zanemarili,če bi znali.no stvar je v tem,da ko so
zvezki že odprti in je makro že opravil delo,potem ga nikakor ne smem
več pognati(štala),naredi mi...ojoj.....Šele,ko zvezek zaprem in ponovno odprem,lahko sprožim makro(toda samo enkrat).
Če povem še enkrat,ko makro prvič odpiram se mi lahko sproži brez opozorila,
če pa ga hoče kdo še večkrat (ko je zvezek seveda odprt),potem pa naj
me opozori,oziroma naj mi ne dovoli ponovnega zagona.
ali je to rešljivo?
za pomoč se zahvaljujem
lp
admin
Site Admin
Prispevkov: 3692
Pridružen: Sr Jul 20, 2005 10:06 pm

Odgovor Napisal/-a admin »

V vašem primru potrebujete samo globalno spremenljivko in to je to:

Koda: Izberi vse

Global MakroSeJeZeIzvedel As Boolean

Sub MojMakro()
    If (MakroSeJeZeIzvedel) Then
        MsgBox "Makra ni dovoljeno zaganjati več kot 1x!"
        Exit Sub
    End If
    
    MakroSeJeZeIzvedel = True
    
    ' ostala koda vašega makra
End Sub
PS: Koda deluje pravilno, ker VBA zagotovo (!) inicializira vse globalne spremenljivke in v primeru boolean vrednosti jih inicializirana false.
lp,
Matjaž Prtenjak
Administrator
matjaz
Prispevkov: 32
Pridružen: So Jan 27, 2007 11:19 pm

Odgovor Napisal/-a matjaz »

pozdravljen Matjaž

Ves čas sem bil prepričan,da poznate odgovor na moje vprašanje,ampak
ste se motili,če ste mislili,da bom zmogel sam.trudil sem se več dni,toda te kode nebi "pogruntal".
je točno to kar sem želel.
hvala
lp
Odgovori