Just nu i M3-nätverket
Gå till innehåll

Excel 2007 macro


Alexej32

Rekommendera Poster

Hej!

Jag använder följande makro i en Excel fil som jag vill ha igång varje gång jag öppnar ett Excel ark.

Jag har provat att skapa och spara filen under "C:\Users\<användarnamn>\AppData\Roaming\Microsoft\Excel\XLSTART" som xlsb fil men

makron fungerar inte som det ska.

Makrot körs inte när jag stänger arbetsbladet utan bara när jag avslutar Excel.

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    If MsgBox("Är PDF utskriven?", vbYesNo, "Stänga") = vbNo Then
         Application.ActivePrinter = "Adobe PDF på Ne05:"
    ExecuteExcel4Macro "PRINT(1,,,1,,,,,,,,2,""Adobe PDF på Ne05:"",,TRUE,,FALSE)"

         Cancel = True
    End If
End Sub

Tack på förhand

Länk till kommentar
Dela på andra webbplatser

ja, den där koden körs när boken stängs och boken detta refererar till är den bok som det är skrivet i, dvs din xlsb-fil i XLStart.

 

jag undrar om du inte måste göra på detta viset

1: Skapa en klassmodul i din bok

2: klistra in denna kod

Public WithEvents apApplication As Application


Private Sub apApplication_NewWorkbook(ByVal Wb As Workbook)
   ' MsgBox "Bok skapad!"
End Sub

Private Sub apApplication_WorkbookBeforeClose(ByVal Wb As Workbook, Cancel As Boolean)

End Sub

3: Lägg in din kod i en modul eller direkt i BeforClose i klassen

4: I ThisWorkbook:

Dim myApp As New Klass1

Private Sub Workbook_Open()
    Set myApp.apApplication = Application
End Sub

jag har inte testat fullt ut om det fungerar som du önskar men tror det ska göra det.

Länk till kommentar
Dela på andra webbplatser

tack, det fungerar nu fast jag har en följd fråga.

finns det möjlighet att få koden att köras  bara när jag stänger arbetsbladet ?

koden ser ut så här :

 

Klass1 modulen

Public WithEvents apApplication As Application


Private Sub apApplication_NewWorkbook(ByVal Wb As Workbook)
   ' MsgBox "Bok skapad!"
End Sub

Private Sub apApplication_WorkbookBeforeClose(ByVal Wb As Workbook, Cancel As Boolean)

    If MsgBox("Är PDF utskriven?", vbYesNo, "Stänga") = vbNo Then
         Application.ActivePrinter = "Adobe PDF på Ne05:"
    ExecuteExcel4Macro "PRINT(1,,,1,,,,,,,,2,""Adobe PDF på Ne05:"",,TRUE,,FALSE)"

         Cancel = True
    End If


End Sub

ThisWorkbook

Dim myApp As New Klass1

Private Sub Workbook_Open()
    Set myApp.apApplication = Application
End Sub
Länk till kommentar
Dela på andra webbplatser

Problemet är som du märker att denna kod körs varje gång en arbetsbok stängs och även när Excel stängs och boken i XLstart därmed stängs.

 

Så frågan är om du verkligen vill ha denna funktion här. Vi kan visserligen göra en enkel kontroll med ThisWorkBook-objeket, om boken som stängs är den bok som kör koden gör inget. Kvar är alla andra tillfällen då du inte vill köra denna rutin.

 

Några alternativ finns för att komma runt detta problem:

1: Koden ovan gör en koll mot egenskap i boken som stängs, filnamn, ett existerande bladnamn, ett värde i viss cell exempelvis, och agerar bara om villkor är uppfyllt.

2: Den bok som vill ha denna dialog "registrerar" sig hos koden, dvs vid start av bok sker ett anrop till en initieringsrutin där bokens ID sparas. Detta ID kollas sedan av när en bok stängs, om träff körs koden.

Länk till kommentar
Dela på andra webbplatser

egentligen ja vill ha funktionen bara när jag jobbar med en specifikt bok så alternativ 1 skulle fungera bra om koden körs mot blad namn men bladnamnet kan vara antigen Pos10 eller Pos20. 

om jag har förstått så alternativ 2 skulle inte fungera med redan skapade/sparade filer eller ?

Länk till kommentar
Dela på andra webbplatser

Om du bara vill ha det men bok, varför inte ha koden i bara den boken? Att lägga den i Xlstart innebär ju bara problem samt att koden/funktionen inte följer med om du distribuerar boken till andra användare!

 

Men om du nu vill ha det i Xlstart kanske

On Error Resume Next
Dim ws As WorkSheet
Set ws = wb.Sheets("Pos10")
Set ws = wb.Sheets("Pos20")
If ws is Nothing then 
  'do nothing
Else
  'do something
End If

borde fungera.

Länk till kommentar
Dela på andra webbplatser

hmm får inte det  att fungera, men jag kan ha missuppfattat vart koden ska in...

 

anledningen att jag vill ha det i xlstart är att det ska fungera med befintliga filer som jag öppnar för redigering vid olika tillfällen. Alla dessa innehåller en blad som heter Pos10 eller Pos20.

Länk till kommentar
Dela på andra webbplatser

Du ska lägga det i

Private Sub apApplication_WorkbookBeforeClose(ByVal Wb As Workbook, Cancel As Boolean)

End Sub

där du har argumentet Wb, den bok som ska stängas.

Länk till kommentar
Dela på andra webbplatser

Jag får inte koden att fungera som det ska men troligen det är ngt. jag gör fel... :mellow:

Public WithEvents apApplication As Application


Private Sub apApplication_NewWorkbook(ByVal Wb As Workbook)
   ' MsgBox "Bok skapad!"
End Sub

Private Sub apApplication_WorkbookBeforeClose(ByVal Wb As Workbook, Cancel As Boolean)

On Error Resume Next
Dim ws As Worksheet
Set ws = Wb.Sheets("Pos10")
Set ws = Wb.Sheets("Pos20")
If ws Is Nothing Then
  'do nothing
Else

End If

    If MsgBox("Är PDF utskriven?", vbYesNo, "Stänga") = vbNo Then
  
              Application.ActivePrinter = "Adobe PDF på Ne05:"
    ExecuteExcel4Macro "PRINT(1,,,1,,,,,,,,2,""Adobe PDF på Ne05:"",,TRUE,,FALSE)"

         Cancel = True
    End If



End Sub

 

Länk till kommentar
Dela på andra webbplatser

Okej, testat det hela fullt ut. Ska medge att jag inte gjorde det förut.

 

Bifogar bok även.

Koden:

i ThisWorkbook

Dim ap As clAtClose
Private Sub Workbook_Open()
    Set ap = New clAtClose
    Set ap.apApplication = Application
    'Debug.Print "AppVBA started"
End Sub

I klassmodul, som jag döpt till clAtClose

Public WithEvents apApplication As Application


Private Sub apApplication_WorkbookBeforeClose(ByVal Wb As Workbook, Cancel As Boolean)
    '    Debug.Print "A workobbok is closing"
    On Error Resume Next
    Dim ws As Worksheet
    Set ws = Wb.Sheets("Pos10")
    Set ws = Wb.Sheets("Pos20")
    If ws Is Nothing Then
        'do nothing
    Else
      If MsgBox("Är PDF utskriven?", vbYesNo, "Stänga") = vbNo Then
        
          Application.ActivePrinter = "Adobe PDF på Ne05:"
              ExecuteExcel4Macro "PRINT(1,,,1,,,,,,,,2,""Adobe PDF på Ne05:"",,TRUE,,FALSE)"
        '  Debug.Print "Print"
          Cancel = True
      End If
    
    End If
End Sub

och spara i  XLstart.

Eller spara som en AddIn så laddas den helt i bakgrunden.

 

Vill du testa kod, lägg in som jag gjort, rader med  Debug.Print så kan du se om raden exekverats i direktförnstret.

 

 

AppVBA.zip

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...