Avatar billede snowball Novice
09. september 2004 - 12:38 Der er 16 kommentarer og
1 løsning

VBA: Ignorer at Sub/Function evt. ikke findes

Hej.

Læs evt. http://www.eksperten.dk/spm/537556 for bedre forståelse af hvordan nedenstående hænger sammen.

Kan man lave noget fejlhåndtering sådan så Excel er "ligeglad" med at en Sub eller Function ikke findes? I mit tilfælde har jeg alle mine macroer i en xla fil, og i min Workbook_BeforeSave kalder jeg f.eks. en macro i den xla fil. Men hvis jeg så lukker dokumentet og dermed fjerner referencen til xla dokumentet, og der så er sket ændringer i dokumentet som man svarer ja til at gemme, så kan den jo ikke kalde den funktion fordi xla dokumentet ikke længere er åben.

Har prøvet med både On Error GoTo 0 og On Error Resume Next og sådan, men eftersom det jo ikke er en decideret Error, men en compiler fejl, så har On Error jo ikke nogen effekt.

Nogen forslag?

På forhånd tak.
Avatar billede bak Forsker
09. september 2004 - 13:00 #1
prøv med noget i denne stil
Private Sub Workbook_BeforeClose(Cancel As Boolean)
If ThisWorkbook.Saved = False Then
    ret = MsgBox("Du har ikke gemt. Ønsker du at gemme nu ?", vbYesNo)
    If ret = vbYes Then ThisWorkbook.Save
    'din kode
End If
    ThisWorkbook.Saved = True
End Sub
Avatar billede snowball Novice
09. september 2004 - 13:19 #2
Det hjælper jo ikke på at lige så snart jeg indsætter navnet på en Sub fra min xla fil i 'din kode, at Compiler fejlen så kommer !? Fordi Excel er jo så "smart" lavet så den compiler hele Sub'en inden den udfører den, og når den så når ned til 'din kode hvor jeg har indsat min Sub fra xla filen, så finder den jo ud af at den Sub ikke findes fordi xla filen ikke længere er åben. Det er jo det jeg gerne vil undgå :)
Avatar billede bak Forsker
09. september 2004 - 13:39 #3
aha, så har jeg nok misforstået spm.
Jeg troede at du først ville lukke xla-filen ned på det punkt (din kode)
Avatar billede bak Forsker
09. september 2004 - 13:42 #4
Private Sub Workbook_BeforeClose(Cancel As Boolean)

'her køres din sub fra xla filen

If ThisWorkbook.Saved = False Then
    ret = MsgBox("Du har ikke gemt. Ønsker du at gemme nu ?", vbYesNo)
    If ret = vbYes Then ThisWorkbook.Save
    'her lukkes xla-filen ned
End If
    ThisWorkbook.Saved = True
End Sub
09. september 2004 - 15:04 #5
Det tips du fandt på hans side var præcis det jeg tænkte på.

Men jeg kan se (som bak) at du mente noget andet end jeg havde forstået, og bak's løsning virker jo fint :-)
Avatar billede snowball Novice
09. september 2004 - 15:06 #6
Konkret eksempel:

Hent http://exp.geertsen.dk/537888.zip - filen indeholder en xla og en xls fil. xla filen skal ligge i roden c:\ (med mindre man lige ændrer stien i xls filen).

Opgaven er så som følger:

Ved lukning af xls filen skal Sub'en RemoveMacroReference udføres. Det er der i sig selv ikke nogen problemer i. Problemet er hvis der er sket ændringer i dokumentet og man så lukker dokumentet. Så vil den jo naturligt nok spørge om man vil gemme ændringerne. Svarer man ja til det, så skal Sub'en Test i Workbook_BeforeSave udføres, men eftersom Workbook_BeforeClose bliver kaldt før Workbook_BeforeSave så er referencen til xla filen allerede blevet fjernet, og dermed kan den ikke finde Test Sub'en som jo ligger i xla filen. Under alle omstændigheder så skal RemoveMacroReference udføres sådan så xla filens reference bliver fjernet og xla filen bliver lukket.

Håber I forstår hvad jeg mener.
09. september 2004 - 15:17 #7
Forstået! Løser dette ikke dit problem ?
Kode placeres i ThisWorkbook


Private mbClose As Boolean 'Modul variable som bruges til check af Close

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    mbClose = True
    If ThisWorkbook.Saved Then
        RemoveMacroReference
    End If
End Sub

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    Test
    If mbClose Then
        RemoveMacroReference
    End If
End Sub

Private Sub Workbook_Open()
    AddMacroReference "c:\Macro.xla"
    mbClose = False
End Sub
Avatar billede snowball Novice
09. september 2004 - 15:40 #8
Synes ikke det virker helt ordentlig.

Hvis du lukker xls dokumentet, men ikke selve Excel, bliver xla filen så lukket hos dig?
Avatar billede snowball Novice
09. september 2004 - 15:40 #9
Selvom jeg synes dit eksempel teoretisk set burde virke som jeg gerne vil have det til at virke :)
09. september 2004 - 16:00 #10
ja - der var dog en lille fejl....... ib BeforeClose skal der stå
If Not ThisWorkbook.Saved Then
09. september 2004 - 16:03 #11
Det kan godt være du skal ændre til dette.... prøv ad

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    mbClose = True
    RemoveMacroReference
End Sub
Avatar billede snowball Novice
09. september 2004 - 16:09 #12
Det bør vel ikke være "If Not" !? For hvis xls dokumentet ER gemt, så skal den jo netop fjerne referencen når den lukker eftersom Workbook_BeforeSave jo så ikke burde blive kaldt.

Tror min Excel er lidt mærkelig, for hvis jeg step'er mig igennem f.eks. RemoveMacroReference macroen, så bliver xla filen som regel lukket, men ellers gør den ikke.
09. september 2004 - 21:46 #13
Så er jeg tilbage. Prøv dette her:

Private mbClose As Boolean 'Modul variable som bruges til check af Close

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    If Not ThisWorkbook.Saved Then
        Test
    End If
    mbClose = True
    RemoveMacroReference
End Sub

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    If ThisWorkbook.Saved = False And mbClose = False Then
        Test
    End If
End Sub

Private Sub Workbook_Open()
    AddMacroReference "c:\Macro.xla"
    mbClose = False
End Sub


Her skulle BeforeClose klare kaldet til Test, hvis ikke den er gemt, og når så BeforeSave køres, så så bliver Test ikke kørt igen.
Hvis der bare gemmes, så bliver Test kørt
Avatar billede snowball Novice
10. september 2004 - 12:14 #14
Synes stadig ikke det virker helt perfekt. Har dog efterhånden ikke lyst til at bruge mere tid på det, da jeg så bare må ligge den ene (heldigvis simple) Sub ind i xls dokumentet.

I skal have mange tak for at I ville bruge tid på at hjælpe, og hvis I ligger et svar, så deler jeg pointene imellem jer :)
10. september 2004 - 12:22 #15
hmm
Avatar billede bak Forsker
10. september 2004 - 13:23 #16
points goes to flemming :-)
Avatar billede snowball Novice
10. september 2004 - 13:24 #17
Ok :)
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