Excel VBA - Makro automatisch ausführen lassen
#1
Hallo Zusammen,

ich habe selber ein kleines Makro gebastelt, welches automatisch ausgeführt werden soll, wenn ich das Tabellenblatt "Haushaltbuch" aktiviere.

Ich bekomme es aber nicht hin :(

Ich hoffe ihr könnt mir helfen :)

Gerne darf der Code auch optimiert werden. Ich bin noch VBA Anfänger.

Hier der Code:

Code:
[align=left]Sub Daten_aktualisieren()[/align]

' Daten_aktualisieren Makro

    Sheets("Haushaltbuch").Select
    Range("B4").Select
    Range(Selection, Selection.End(xlToRight)).Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.Delete Shift:=xlUp
    Range("B4").Select
    Sheets("Einnahmen").Select
    Range("B3").Select
    Range(Selection, Selection.End(xlDown)).Select
    Range(Selection, Selection.End(xlToRight)).Select
    Selection.Copy
    Sheets("Haushaltbuch").Select
    ActiveSheet.Paste
    Cells([b65536].End(xlUp).Row + 1, 2).Activate
    Sheets("Einnahmen").Select
    Application.CutCopyMode = False
    Range("A1").Select
    Sheets("fixe Ausgaben").Select
    Range("B3").Select
    Range(Selection, Selection.End(xlDown)).Select
    Range(Selection, Selection.End(xlToRight)).Select
    Selection.Copy
    Sheets("Haushaltbuch").Select
    ActiveSheet.Paste
    Cells([b65536].End(xlUp).Row + 1, 2).Activate
    Sheets("fixe Ausgaben").Select
    Range("A1").Select
    Application.CutCopyMode = False
    Sheets("variable Ausgaben").Select
    Range("B3").Select
    Range(Selection, Selection.End(xlDown)).Select
    Range(Selection, Selection.End(xlToRight)).Select
    Selection.Copy
    Sheets("Haushaltbuch").Select
    ActiveSheet.Paste
    Sheets("variable Ausgaben").Select
    Range("A1").Select
    Application.CutCopyMode = False
    Sheets("Haushaltbuch").Select
       
    'Formatierung und Formel'
   
    Range("O4").Select
    ActiveCell.FormulaR1C1 = "=IF(SUM(RC[-12]:RC[-1])=0,"""",SUM(RC[-12]:RC[-1]))"
    Selection.AutoFill Destination:=Range("O4:O500")
    Range("O4:O41").Select
    Range("O4").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.Style = "Currency"
    Selection.Font.Bold = True
    Columns("B:O").Select
    Columns("B:O").EntireColumn.AutoFit
   
    Range("A1").Select
   
End Sub



Danke euch im vorraus!
Antworten Top
#2
Hallo Westmaster81,

Du gehst im VBA-Editor auf dein Tabellenblatt "Haushaltbuch", dort wählst Du über dem Codefenster im linken Dropdown "Worksheet" und dann im rechten "Activate".
Damit erhältst Du einen Codeschnipsel:

Code:
Private Sub Worksheet_Activate()

End Sub

Jetzt nimmst Du deinen Code ohne erste und letzte Zeile und kopierst ihn da rein. Das war's.

Du kannst in diesen beiden Dropdowns alle mögliche Events finden, mit denen Du deine Makros automatisieren kannst. Jenachdem, ob du ein Tabellenblatt oder "DieseArbeitsmappe" anwählst, stehen dir im rechten Dropdown verschiedene Events zur Verfügung.

Dein Code ist (nicht böse gemeint) ein Anfängercode. Das wechseln von Blättern und markieren kostet Zeit und ist nicht schön für die Augen.
Schöner ist, die Worksheets Variablen zuzuweisen und die Ranges direkt anzusprechen.

Code:
Public Sub Beispiel()
    Dim objWorksheet As Worksheet
    Set objWorksheet = Workbooks("Mappe1.xlsx").Worksheets("Tabelle1")
End Sub

"Application.CutCopyMode = False" brauchst Du nicht. Evtl. am Ende einmal um, den Kopierrahmen wegzubekommen.

Lediglich im Formatierungsblock ist ein Fehler: Was passiert, wenn Du mehr als 500 Einträge hast?
Also letzte Zeile bestimmen und bis dahin runterkopieren, oder gleich in den ganzen Bereich schreiben.

Gruß,
Lutz
Antworten Top
#3
Hallo Lutz,

ich habe nun folgendes Problem...

wenn ich den Reiter öffnen, klappt der Code bis zufolgendem Punkt:

Private Sub Worksheet_Activate()

Set WS_1 = ThisWorkbook.Worksheets("Dashboard")
Set WS_2 = ThisWorkbook.Worksheets("Einnahmen")
Set WS_3 = ThisWorkbook.Worksheets("fixe Ausgaben")
Set WS_4 = ThisWorkbook.Worksheets("variable Ausgaben")

    WS_1.Select
    Range("B4").Select
    Range(Selection, Selection.End(xlToRight)).Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.Delete Shift:=xlUp
    Range("B4").Select
   
    WS_2.Select
    WS_2.Range("Tabelle5").Select
    'Range(Selection, Selection.End(xlDown)).Select
    'Range(Selection, Selection.End(xlToRight)).Select
    Selection.Copy <<<< bis hier funktioniert der Code :)
    WS_1.select >>>> ab hier haben die Variablen keinen Wert mehr und der Code beginnt von vorne :(
    Selection.Paste
    Cells([b65536].End(xlUp).Row + 1, 2).Activate
    WS_2.Select
    Application.CutCopyMode = False
    Range("A1").Select



danach haben meine Variablen keinen Inhalt mehr?

Ich habe die Public SUB Workbook open ()
in jeweils dem Arbeitsblatt und im Modul versucht, immer mit dem gleichen Ergebnis.

Wie bekomme ich es hin, dass der Wert der Variable im Private Sub immer und von Annfang an gefüllt bleibt.

Das Ansprechen der intelligenten Tabelle habe ich herausgefunden und wird meinen Code kleiner machen.

P.s.wie kann ich die Funktion durchlaufen ohne, dass er immer select macht?

Danke Dir :)
Antworten Top
#4
Hallo Ralf,

mein Problemhat sich erledigt :)

Ich habe den Code erheblich kürzen können und dersieht jetzt wie folgt aus:

Private Sub Worksheet_Activate()

Set WS_1 = ThisWorkbook.Worksheets("Dashboard")
Set WS_2 = ThisWorkbook.Worksheets("Einnahmen")
Set WS_3 = ThisWorkbook.Worksheets("fixe Ausgaben")
Set WS_4 = ThisWorkbook.Worksheets("variable Ausgaben")

    WS_1.Select
    Range("B4").Select
    Range(Selection, Selection.End(xlToRight)).Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.Delete Shift:=xlUp
    Range("B4").Select
   
    WS_2.Range("Tabelle5").Copy
    WS_1.Range("B4").PasteSpecial
   
    WS_3.Range("Tabelle6").Copy
    WS_1.Cells([b65536].End(xlUp).Row + 1, 2).PasteSpecial
         
    WS_4.Range("Tabelle7").Copy
    WS_1.Cells([b65536].End(xlUp).Row + 1, 2).PasteSpecial
   
             
    'Formatierung und Formel'
   

    WS_1.Select

    Range("O4").Select
    ActiveCell.FormulaR1C1 = "=IF(SUM(RC[-12]:RC[-1])=0,"""",SUM(RC[-12]:RC[-1]))"
    Selection.AutoFill Destination:=Range(Selection, Selection.End(xlDown))
    Range("O4:O41").Select
    Range("O4").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.Style = "Currency"
    Selection.Font.Bold = True
    Columns("B:O").Select
    Columns("B:O").EntireColumn.AutoFit
   
    Range("B4").Select


 
End Sub


Hast Du vielleicht noch eine Idee wie ich den letzten Teil kürzer bekomme? Es stört jetzt nicht, aber wäre spitze :)

Danke Dir nochmal für deine Denkanstöße.

Esmacht richtig Spaß, wenn man einen Erfolg dabei verbuchen kann.

Gruss
Antworten Top
#5
Hallöchen,

... den letzten Teil vom letzten code?

Zitat:Sub test()
WS_1.Select
With Range("O4", Range("O4").End(xlDown))
.FormulaR1C1 = "=IF(SUM(RC[-12]:RC[-1])=0,"""",SUM(RC[-12]:RC[-1]))"
.Style = "Currency"
.Font.Bold = True
.EntireColumn.AutoFit
End With
End Sub
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Antworten Top
#6
Hallo Westmaster,

dein Code schaut doch schon viel besser aus.

Dein erwähnter Fehler kommt daher, dass Du in deinem Makro erneut WS_1 aktivierst und damit das Makro erneut startest. Kann man umgehen mit Application.EnableEvents. Kannst Du dir mal anschauen.

Noch ein kleiner Tip, zum finden der letzten beschriebenen Zelle. Was passiert, wenn Du mehr als 65536 Zeilen gefüllt hast?
Zu dem Thema immer wieder gern gelesen: https://www.excel-inside.de/vba-loesunge...-ermitteln

Gruß,
Lutz
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste