Avatar billede folj Forsker
27. maj 2014 - 11:04 Der er 6 kommentarer og
1 løsning

Rækkevidde af public variabler og procedurer i VBA

Jeg trænger vist til at lære lidt om rækkevidde for variabler og procedurer i min VBA-programmering...

Jeg har lidt problemer med en variabel der skal arbejde globalt (i projektmappen) når jeg afvikler nogle VBA-procedurer.

Jeg arbejder med en kode der laver en AutoCloce hvis filen henligger ubrugt i eksempelvis 15 minutter.

Jeg afvikler noget kode i ved hændelsen, Workbook_BeforeClose, som jeg gerne vil variere afhængigt af om det er et normalt luk som brugeren foretager, eller om der er tale om et automatiseret luk (som jeg kalder AutoClose).

For at gøre det optimalt vil jeg gerne have en global variabel (CloseWithAutoClose as boolean) kørende, der kan fortælle automatiseringen at der er tale om AutoClose, så jeg kan variere koden, afhængig af om det er brugeren selv der lukker eller det er min AutoClose,  der afvikles.
Jeg har selv forsøgt, men det driller mig lidt, måske er der nogle begrænsninger i det som jeg ikke har lært fra bunden.

I min ThisWorkbook-kode ligger der bl.a:

Private Sub Workbook_BeforeClose(Cancel As Boolean)

' er der ikke noget galt - det vil jo afvikles ved hver Workbook_BeforeClose
'If CloseWithAutoClose = True Then
  DisplayAlerts = False '<--- vis ikke advarsler ****************
  ThisWorkbook.Saved = True '<--- bild Excel ind at der er gemt ****************
  DisplayAlerts = True '<--- vis advarsler igen****************
'End If

End Sub

Sub SetVar3False() 'procedure bliver kaldt fra Workbook_Open - sætter variabel til False
  CloseWithAutoClose = False  ' vi sætter CloseWithAutoClose-variablen til False som default-værdi når filen åbner
End Sub

' når jeg afvikler min AutoClose-kode, så er en af de første linier et kald til denne procedure der sætter variabel til True
Public Sub SetVar3True()
  CloseWithAutoClose = True  ' sætter CloseWithAutoClose-variablen til True
End Sub


hvad er så mit problem?
Min AutoClose-kode liggere i et separat modul, altså ikke i ThisWorkbook-koden.
Når jeg forsøger at kalde min procedure (SetVar3True) fra dette AutoCloce-modul, så fejler kodeafvikleren og siger "Sub or Function not defined"
Det er uanset om min procedure hedder

Public Sub SetVar3True()

eller bare

Sub SetVar3True()

det er også uanset om kaldet AutoCloce-modulet hedder SetVar3True, eller det hedder Call SetVar3True.

Når jeg forsøger at kalde min procedure (SetVar3True) fra dette AutoCloce-modul, så fejler kodeafvikleren og siger "Sub or Function not defined"

1. Hvordan sætter jeg den globale variabel når jeg vil afvikle min AutoClose-kode fra et andet modul end ThisWorkbook.
Jeg troede at jeg bare kunne kalde mun sub-procedure der ligger i ThisWorkbook, men
2. er der en begrænsning i excel, der gør at jeg ikke kan kalde en sub-procedure nede fra et modul og opad til ThisWorkbook?
Avatar billede kabbak Professor
27. maj 2014 - 12:05 #1
Har du lavet den global, uden for procedure, altså i toppen af et modul

Global CloseWithAutoClose As Boolean
Avatar billede folj Forsker
27. maj 2014 - 12:26 #2
Ja. det glemte jeg nok at skrive, men jeg kender ikke helt begrænsningerne omkring det der defineres som "toppen af modulet".

Jeg synes også at have erfaret at det skal være ThisWorkbook-koden jeg skal skrive det i -  er det en betingelse?

Her kommer lige et udklip af de øverste linier i min ThisWorkbook-kode.

Public MailAllreadySent As Boolean ' variabel skal gøre det muligt at forhindre at der spørges flere gange om der skal sendes mail flere gange, når excel spørger igen og igen, om man vil gemme.
Public BackUpSave As Boolean ' variabel skal gøre det muligt at kende forskel på om laves alm. Save, eller der laves SaveCopyAs i forb. med daglig BackUp
Public CloseWithAutoClose As Boolean  ' variabel skal gøre det muligt at kende forskel på om laves alm. Save, eller der laves SaveCopyAs i forb. med daglig BackUp
Sub SetVar1()
  MailAllreadySent = False ' sætter MailAllreadySent-variablen til False som default-værdi når filen åbner
End Sub
Sub SetVar2False()
  BackUpSave = False  ' sætter BackUpSave-variablen til False som default-værdi når filen åbner
End Sub
Sub SetVar2True()
  BackUpSave = True    ' sætter BackUpSave-variablen til True
End Sub
Sub SetVar3False()
  CloseWithAutoClose = False  ' sætter CloseWithAutoClose-variablen til False som default-værdi når filen åbner
End Sub
Public Sub SetVar3True()
  CloseWithAutoClose = True  ' sætter CloseWithAutoClose-variablen til True
End Sub
Avatar billede kabbak Professor
27. maj 2014 - 15:31 #3
Vi taler lige om moduler

Arkmodul:
Kode i et arkmodul, virker kun i arket, koden kan ikke selecte i andre ark.
Den kan heller ikke se makroer i andre ark.

ThisWorkbook modulet:

Her kan kode virke overalt i projektmappen, men kan ikke ses fra andre projektmapper.
Hvis noget er Global, virker det kun i denne mappe.

Et VBA Kodemodul:

Et modul man laver ved at vælge "Insert module" i menuen.

Kode heri virker overalt, alle projektmapper, som åbnes, kan se det.
Noget som sættes Global, er global for alle projektmapper.
Avatar billede folj Forsker
28. maj 2014 - 07:50 #4
Tak for dit svar med en god præcisering af hvad der rækker hvor langt.
Jeg overvejer lige om det også er dækkende omkring variablernes rækkevidde.

Kan du også besvare mit konkrete problem med at kalde sub-proceduren SetVar3True() som ligger i ThisWorkbook-modulet.
Jeg kalder det fra et VBA Kodemodul, og excel svarer "Sub or Function not defined", og det gør den uanset om jeg kalder den med koden:
SetVar3True
eller med
Call SetVar3True
Avatar billede folj Forsker
28. maj 2014 - 07:53 #5
@kabbak: Du kan allerede nu godt smide et svar. for der er nogle points til dig.
Avatar billede kabbak Professor
28. maj 2014 - 09:15 #6
kald din makro med

Call ThisWorkbook.SetVar3True
Avatar billede folj Forsker
02. juni 2014 - 12:09 #7
Undskyld jeg har været væk nogle dage.
men nu er det arbejdsdag igen, og jeg har lige testet "Call ThisWorkbook.SetVar3True", og det gjorde forskellen...
Så det var altså ikke rækkevidden der var problemet, men mit kald af Sub-proceduren.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Excel kurser for alle niveauer og behov – find det kursus, der passer til dig

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester