Office: Makros beim Öffnen/Schließen der Datei ausführen

Helfe beim Thema Makros beim Öffnen/Schließen der Datei ausführen in Microsoft Excel Hilfe um das Problem gemeinsam zu lösen; Hallo, ich möchte beim Öffnen / Schließen einer Excel Datei ein Makro ausführen. Den grundsätzlichen Vba-Code habe ich bereits in anderen... Dieses Thema im Forum "Microsoft Excel Hilfe" wurde erstellt von joscha_h, 7. Mai 2012.

  1. joscha_h Erfahrener User

    Makros beim Öffnen/Schließen der Datei ausführen


    Hallo,

    ich möchte beim Öffnen / Schließen einer Excel Datei ein Makro ausführen.

    Den grundsätzlichen Vba-Code habe ich bereits in anderen Beiträgen gefunden nur hapert es noch an der Ausführung bzw. an der Verknüpfung mit dem eigentlichen Makro.

    Also mein (eigentliches) Makro sieht momentan wie folgt aus:

    Sub Datenbank()
    '
    'Dim lngLetzte As Long
    lngLetzte = 8 + Range("f9:f240").SpecialCells(xlCellTypeConstants).Count
    Range("a9:r" & lngLetzte).Copy
    Workbooks.Open Filename:= _
    "C:\Datenbank.xls", UpdateLinks:=3
    With Worksheets("Datenbank")
    lngLetzte = IIf(IsEmpty(.Cells(.Rows.Count, 1)), .Cells(.Rows.Count, 1).End(xlUp).Row, .Rows.Count) + 1
    .Range("A" & lngLetzte).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False

    ActiveWorkbook.Save
    ActiveWorkbook.Close

    End With

    '
    End Sub


    Diese Makro möchte ich beim Schließen der Datei ausführen lassen:

    Das Makro müsste wie folgt aussehen:

    Private Sub Workbook_BeforeClose(Cancel As Boolean)


    Ich schaffe es jetzt nicht. Die beiden Teile zu einem funktionierenden ganzen zu verarbeiten. Kann das bitte jemand für mich übernehmen? Sind das zwei getrennte MAkros oder ein Gesamtmakro? Wie ist der Dateiname für das Makro zu vergeben?


    Allgemein würde mich noch interessieren was der Unterschied zwischen einem Private Sub und einem "normalen" Sub ist und wie ein Makro aussehen muss, das beim Öffnen automatisch aktiviert wird.

    Danke für eure Unterstützung.

    Viele Grüße

    Joscha
     
    joscha_h, 7. Mai 2012
    #1
  2. Beverly
    Beverly Erfahrener User
    Hi Joscha,

    schreibe den gesamten eigentlichen Code in das Workbook_BeforeClose Ereignis.
    Andere Möglichkeit: das Makro Sub Datenbank() in einem allgemeinen Modul und in die Sub Workbook_BeforeClose die Codezeile Datenbank - dann wird dieses Makro beim Schließen gestartet.

    Um einen Code auszuführen beim Öffnen der Arbeitsmappe, musst du ihn in das Workbook_Open Ereignis schreiben oder ein Makro (eine Sub) in ein allgemeines Modul und in das Open-Ereignis die Aufrufzeile mit dem Namen des Makros.

    Eine Private Sub kann nicht über "Makros starten" aufgerufen werden im Gegensatz zu einer "normalen" Sub.

    Bis später,
    Karin
     
    Beverly, 7. Mai 2012
    #2
  3. fette Elfe Erfahrener User
    Hallo Joscha,

    zuerst eine Bitte:
    Poste Code nicht im normalen Text, so ist er kaum lesbar.
    Über dem Eingabefeld für Posts und Antworten findest Du eine "#".
    Damit kann man Code so darstellen wie bei mir weiter unten.


    Ich glaube das ist Geschmacksache, und hängt von verschiedenen Dingen ab, unter anderem der Komplexität.
    Prinzipiell kann man wohl beides machen.

    Da Du eine bestehende Prozedur hast, würde ich sie einfach nur vor dem Schließen aufrufen:
    Code:
    Option Explicit
    
    Private Sub Workbook_BeforeClose(Cancel As Boolean)
        
        Call Datenbank
        
    End Sub

    Ich bin mir nicht ganz sicher was Du jetzt wo mit "Dateiname für das Makro" meinst.
    Meinst Du die fehlende Referenzierung nach dem öffnen der 2. Mappe?
    Code:
    With Workbooks("Datenbank.xls").Worksheets("Datenbank")

    Das "normale" Sub ist zu 50% Faulheit, da es eigentlich ein "Public Sub" ist.
    Das "Public" kann man weglassen, ich schreibe es immer dabei. So entsteht keine Unklarheit, und sollte doch einmal der Fall eintreten das man es doch nicht weglassen darf/kann/sollte, so steht es ja bereits da. ;O)

    Ansonsten wie die Namen sagen:
    Public = öffentlich > diese Prozedur kann von jeder Prozedur aus aufgerufen werden, egal in welchem Modul sie sich befindet
    Private = privat > diese Prozedur kann nur von Ereignissen aufgerufen werden


    Prinzipiell sollte es fehlerfrei und lauffähig sein, und es sollte entweder in der Ereignisprozedur "Private Sub Workbook_Open()" stehen oder von dort aufgerufen werden.


    Jetzt noch etwas zu Deinem Code:
    Code:
    [I]lngLetzte = 8 + Range(".....
       Range("....[/I]
    Auf welche "Range" beziehst Du Dich da? Wo befindet sie sich?
    Komplett ohne Referenzierung halte ich immer für gefährlich, da Excel in dem Fall immer die gerade aktive Mappe, und darin dann das gerade aktive Blatt nimmt.
    Und das kann etwas ganz anderes sein als Du im Sinn hattest.

    Wenn sich die "Range", die Du kopieren willst, in der gleichen Mappe wie Dein Makro befindet, könntest Du z.Bsp. so referenzieren:
    Code:
    ThisWorkbook.Worksheets("Blattname").Range("....
    Oder Du packst es auch in eine "With-Anweisung" wie bei Deiner Zielmappe.

    Dein Code könnte also so aussehen:
    Code:
    Option Explicit
    
    Public Sub Datenbank()
        
    Dim lngLetzte As Long
        
        With ThisWorkbook.Worksheets("Blattname")
            
            lngLetzte = 8 + .Range("F9:F240").SpecialCells(xlCellTypeConstants).Count
            .Range("A9:R" & lngLetzte).Copy
            
        End With
        
        Workbooks.Open Filename:="C:\Datenbank.xls", UpdateLinks:=3
        
        With Workbooks("Datenbank.xls").Worksheets("Datenbank")
            
            lngLetzte = IIf(IsEmpty(.Cells(.Rows.Count, 1)), .Cells(.Rows.Count, 1).End(xlUp).Row, .Rows.Count) + 1
            .Range("A" & lngLetzte).PasteSpecial Paste:=xlPasteValues, _
                Operation:=xlNone, SkipBlanks:=False, Transpose:=False
            
        End With
        
        ActiveWorkbook.Save
        ActiveWorkbook.Close
        
    End Sub
    (Und dabei nie den Punkt vor dem "Range" vergessen... so wie ich gerade)


    Wobei ich prinzipiell zuerst die 2. Mappe öffnen würde, dabei natürlich prüfen ob sie bereits geöffnet ist oder unter dem angegebenen Pfad überhaupt zu finden ist, denn sonst fährt Dein Makro gepflegt vor die Wand.
    Aber das wäre zuviel auf einmal... das kommt später. ;O)


    Ich hoffe geholfen zu haben.
     
    Zuletzt bearbeitet: 7. Mai 2012
    fette Elfe, 7. Mai 2012
    #3
  4. Beverly
    Beverly Erfahrener User

    Makros beim Öffnen/Schließen der Datei ausführen

    Hi Achim,

    um eine Prozedur aus einer anderen heraus anzurufen, muss man sie nicht mittels "Call" starten, es reicht der Prozedurname. Hier mal ein Auszug aus der VBA-Hilfe:

    Bis später,
    Karin
     
    Beverly, 7. Mai 2012
    #4
  5. fette Elfe Erfahrener User
    Hi Karin,

    danke für den Hinweis.
    Das "Call" optional ist war mir bekannt.
    Ich finde es nur übersichtlicher, deshalb benutze ich es im allgemeinen.

    Das mit dem Rückgabewert der verworfen wird war mir so noch nicht klar, ich wusste nur das es aus irgendeinem Grund nicht funktioniert.
    So wird mir nun einiges klarer.
    Danke dafür.
     
    fette Elfe, 7. Mai 2012
    #5
  6. joscha_h Erfahrener User
    Hallo,

    erst einmal Entschuldigung, dass ich mich erst jetzt melde. Ich war verreist.

    Danke für euren Antworten. Leider bekomme ich die Sachen noch nicht zum Laufen.

    Wenn ich die beiden Sachen kombiniere, sieht das bei mir wie folgt aus:

    Code:
    Option Explicit
    
    Private Sub Workbook_BeforeClose(Cancel As Boolean)
        
        Call Datenbank
        
    End Sub
    
    
    Sub Datenbank()
    '
    ' Datenbank Macro
    ' Macro recorded 12.04.2012 by jhein
    
    'Dim lngLetzte As Long
       lngLetzte = 8 + Range("f9:f240").SpecialCells(xlCellTypeConstants).Count
       Range("a9:r" & lngLetzte).Copy
       Workbooks.Open Filename:= _
    "I:\Accounting\Broker_accounting\Projekt Broker Accounting\Datenbank.xls", UpdateLinks:=3
       With Worksheets("Datenbank")
          lngLetzte = IIf(IsEmpty(.Cells(.Rows.Count, 1)), .Cells(.Rows.Count, 1).End(xlUp).Row, .Rows.Count) + 1
          .Range("A" & lngLetzte).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
             :=False, Transpose:=False
             
    ActiveWorkbook.Save
    ActiveWorkbook.Close
    
    End With
    
    '
    End Sub
    

    Beim Schließen der Datei kommt jedoch die Meldung

    Der andere Weg mit den zwei getrennten Makros/Dateien ist mir nicht klar. Das heißt ich lege ein zweites Workbook an, indem nur die VBA-Codes abgelegt werden? Wie muss der Code dann aussehen?

    Vielen Dank auch für die sonstigen Hinweise.

    Vielen Dank für eure Geduld und Unterstützung.


    Viele Grüße

    Joscha
     
    joscha_h, 15. Mai 2012
    #6
  7. fette Elfe Erfahrener User
    Hallo Joscha,

    bei solchen Fragen ist es immer hilfreich auch mitzuteilen, in welcher Zeile vom Code dieser Fehler auftritt.
    Diese sollte dann gelb hinterlegt sein.
    Dafür musst Du, wenn die Fehlermeldung auftaucht, die Maus von "Beenden" lassen und statt dessen auf "Debuggen" klicken. So öffnet sich der Makroeditor und Du siehst wo es klemmt.


    Bei mir kommt diese Meldung nicht.
    Dafür kommt bei mir eine andere, nämlich
    "Laufzeitfehler '9': Index außerhalb des gültigen Bereichs"
    Und angemeckert wird folgende Zeile:
    Code:
    With Worksheets("Datenbank")
    Und das liegt daran, dass Du nicht ordentlich referenzierst, so wie ich es weiter oben erklärt habe.
    Denn in meiner Testdatei gibt es kein "Worksheets("Datenbank")".
    Das gibt es bei mir nur in der Zieldatei.
    Da aber die Referenzierung auf die Arbeitsmappe fehlt, kann Excel ja nicht wissen das ich die andere meine...






    Ich kann Deiner Frage jetzt nicht so ganz folgen, aber Du brauchst keine Datei extra nur für Makros.
    Wenn ich Dich richtig verstanden habe, so hast Du eine Exceldatei mit der Du arbeitest.
    In dieser Datei befinden sich die Daten die Du kopieren willst, und es befindet sich das Makro.
    Nennen wir die Datei "Quelle".

    Dann hast Du noch eine Datei die Du öffnen willst wenn "Quelle" geschlossen wird, und es sollen auch Daten aus "Quelle" in diese zweite Datei kopiert werden.
    Nennen wir diese Datei "Ziel".

    Da hast Du doch Deine 2 Dateien: "Quelle" und "Ziel"


    Oder habe ich da etwas kolossal falsch verstanden?
     
    fette Elfe, 15. Mai 2012
    #7
Thema:

Makros beim Öffnen/Schließen der Datei ausführen

Die Seite wird geladen...
  1. Makros beim Öffnen/Schließen der Datei ausführen - Similar Threads - Makros Öffnen Schließen

  2. Wahrscheinlich nicht neu - Makros exportieren

    in Microsoft Word Hilfe
    Wahrscheinlich nicht neu - Makros exportieren: Hallo zusammen, dies ist mein erster Thread... Also, ich habe zwei Rechner in meinem Wlan Netzwerk verbunden, damit ich an derselben Software arbeiten kann (ein Rechner Hauptrechner, einer...
  3. Seit Win 11 Zugriffsprobleme bei Excel über Makros

    in Microsoft Excel Hilfe
    Seit Win 11 Zugriffsprobleme bei Excel über Makros: Guten Tag! Ich habe vor einer Woche mein Windows 10 auf Windows 11 geupgraded, und seitdem habe ich extreme Schwierigkeiten mit meinem Excel. Mit Windows 10 funktionierte alles so, wie es sollte,...
  4. Automatisches Ausführen eines Makros beim Öffnen einer Arbeitsmappe

    in Microsoft Excel Tutorials
    Automatisches Ausführen eines Makros beim Öffnen einer Arbeitsmappe: Automatisches Ausführen eines Makros beim Öffnen einer Arbeitsmappe Excel für Microsoft 365 Excel für Microsoft 365 für Mac Excel 2019 Excel 2016 Excel 2019 für...
  5. Aufzeichnen eines Makros zum Öffnen bestimmter Arbeitsmappen beim Start von Excel

    in Microsoft Excel Tutorials
    Aufzeichnen eines Makros zum Öffnen bestimmter Arbeitsmappen beim Start von Excel: Aufzeichnen eines Makros zum Öffnen bestimmter Arbeitsmappen beim Start von Excel Excel 2013 Mehr... Weniger...
  6. Excel mit Makros und leerer Arbeitsmappe öffnen

    in Microsoft Excel Hilfe
    Excel mit Makros und leerer Arbeitsmappe öffnen: Hallo zusammen, ich hab irgendwie vergessen wie das geht bzw. wie ich das ausgeschaltet habe: Ich möchte, dass Excel beim Start ohne Datei eine leere Arbeitsmappe öffnet. Wenn ich mein Excel...
  7. Datei öffnen aber Makros deaktivieren

    in Microsoft Excel Hilfe
    Datei öffnen aber Makros deaktivieren: Hallo, gibt es eine Möglichkeit Excel-Dateien über VBA zu öffnen ohne dass Makros in dieser Datei ausgeführt werden? Ich möchte Werte aus diesen Dateien importieren aber diese Dateien haben ein...
  8. Erstellen eines Makros, das beim Öffnen einer Datenbank ausgeführt wird

    in Microsoft Access Tutorials
    Erstellen eines Makros, das beim Öffnen einer Datenbank ausgeführt wird: Erstellen eines Makros, das beim Öffnen einer Datenbank ausgeführt wird Access für Microsoft 365 Access 2019 Access 2016 Access 2013 Access 2010 Access...
  1. Diese Seite verwendet Cookies, um Inhalte zu personalisieren, diese deiner Erfahrung anzupassen und dich nach der Registrierung angemeldet zu halten.
    Auf dieser Website werden Cookies für die Zugriffsanalyse und Anzeigenmessung verwendet.
    Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden