Automatische Makro Aktivierung

  • Excel

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von Der.Tobi.

    Automatische Makro Aktivierung

    Hallo zusammen,

    ich befasse mich seit kurzem mit der Programmierung bzw. VBA in Excel und habe dann beim Browsen dieses Forum gefunden und auch schon viele Hilfreiche Tips hier entdeckt. Ich hoffe hier noch mehr lernen zu können.

    Hierzu mein Problem.

    Ich habe eine DropDown Liste mit einer Auswahl an Namen. Ich möchte gerne bei der Auwahl eines neuen Namens das sich einige Zellen ändern. Das Ganze Funktioniert schon aber nur wenn ich Manuell das Makro Aktiviere. Meine Frage ist ob das ganze auch einfach Automatisch funktionieren kann. Aktuell sieht mein Code so aus:

    VB.NET-Quellcode

    1. Private Sub Worksheet_Change(ByVal Target As Range)
    2. ' Der zu Überprüfende Bereich wird festgelegt
    3. Sheets("Abfrage").Cell(2, 22).Value = "Wubba"
    4. Set Target = Sheets("Abfrage").Range("B14:D14")
    5. ' Wenn SuchePerson nicht gleich AktivePerson überprüfung
    6. If Target = Sheets("Abfrage").Cell(2, 7) Then
    7. Sheets("Abfrage").Cell(2, 22).Value = "Lubba"
    8. Exit Sub
    9. Else
    10. Sheets("Abfrage").Cell(2, 22).Value = "DubDub"
    11. Application.EnableEvents = False
    12. ' Beginn der Zellen Anpassung.....
    13. ' ....
    14. End If
    15. End Sub


    Die Beiden Zellen änderungen sollten nur Stützen für mich sein ob generell was gemacht wird.
    Das Makro hat ein mal am Anfang funktioniert danach nie wieder.

    Ich hoffe ihr könnt mir Hilfestellung oder aber eine Lösung geben.

    Danke und Grüße
    Tobi
    Willkommen im Forum.
    Möge ich es richtig verstanden haben.
    Wenn das Makro nur zu Beginn 1x ausgeführt werden soll und sonst gar nicht, dann hau den Code in die passende Prozedur. Worksheet_Change wird aufgerufen, wenn ... tja, wie es der Name sagt: Wenn sich was an der Tabelle ändert. Wenn es nur zum Anfang 1x geschehen soll, dann muss der Code dann ausgeführt werden, wenn die Datei geöffnet wird. Logische Schlussfolgerung: Rein mit dem Code in die Prozedur Workbook_Open.
    btw:

    Der.Tobi schrieb:

    Das Makro hat ein mal am Anfang funktioniert danach nie wieder.
    Den kapier ich net.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Danke für das Willkommen und die Antwort.

    Ich glaube dann habe ich mich schwach Ausgedrück. Ich will das das Makro immer dann angeht sobald sich was ändert, immer und immer wieder. Halt wie eine dauer überprüfung.
    Daher dachte ich mir das es ja im Change richtig wäre.

    VaporiZed schrieb:

    Der.Tobi schrieb:
    Das Makro hat ein mal am Anfang funktioniert danach nie wieder.

    Den kapier ich net.


    Ich habe das Makro geschrieben und es lief dann einmal durch als ich was geändert hatte. Danach Reagierte es auf eine weitere änderung in der Liste nicht mehr.
    Kann es sein, dass Dir die Zeile Application.EnableEvents = False einen Strich durch die Rechnung macht? Denn damit wird das Event WorkSheet_Change nicht mehr aufgerufen (und alle anderen auch nicht). Hast Du irgendwo das wieder zu einem passenden Zeitpunkt auf True gesetzt?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Ich habe das ganz Entfert.
    Das Problem welches er glaube ich hatte war der bezug auf

    VB.NET-Quellcode

    1. If Target = Sheets("Abfrage").Cell(2, 7) Then


    Ich habe das in

    VB.NET-Quellcode

    1. Private Sub Worksheet_Change(ByVal Target As Range)
    2. Set Target = Sheets("Abfrage").Range("A14")
    3. AktivePerson = Sheets("Abfrage").Range("A7")
    4. If Target <> AktivePerson Then
    5. Sheets("Abfrage").Range("A22").Value = "Wubba Lubba DubDub"
    6. Else
    7. Sheets("Abfrage").Range("A22").Value = "Wubba Lubba DubDub 2"
    8. End If
    9. End Sub

    (Habe den Code komplett gekürzt um überhaupt eine Funktionalität zu bekommen)
    geändert und er Prüft nun immer. Dies führt nun immer zu einem Absturz von Excel aber er prüft durchgehend.
    Das ist klar, da du mit Zeile 7 oder 9 das Worksheet_Change-Event nochmals auslöst.
    d.H. am Anfang des Worksheet_Change die Events ausschalten und am Ende wieder einschalten.
    Zweitens Zeile 3; Das ändern des Target macht nie Sinn.
    Drittens vergleiche nicht Zelle mit Zelle, sondern Zelleninhalt mit Zelleninhalt.

    Spoiler anzeigen

    Visual Basic-Quellcode

    1. Private Sub Worksheet_Change(ByVal Target As Range)
    2. Dim isect As Range
    3. 'Excel-Events ausschalten
    4. Application.EnableEvents = False
    5. Sheets("Abfrage").Cells(2, 22).Value = "Wubba"
    6. 'Abfrage ob Target in Bereich
    7. Set isect = Application.Intersect(Range("B14:D14"), Target)
    8. If Not isect Is Nothing Then
    9. ' Wenn SuchePerson nicht gleich AktivePerson überprüfung
    10. If Target.Value = Sheets("Abfrage").Cells(2, 7).Value Then
    11. Sheets("Abfrage").Cells(2, 22).Value = "Lubba"
    12. Else
    13. Sheets("Abfrage").Cells(2, 22).Value = "DubDub"
    14. ' Beginn der Zellen Anpassung.....
    15. ' ....
    16. End If
    17. End If
    18. 'Excel-Events wieder einschalten
    19. Application.EnableEvents = True
    20. End Sub

    Der.Tobi schrieb:

    Set Target = Sheets("Abfrage").Range("B14:D14")
    If Target = Sheets("Abfrage").Cell(2, 7) Then
    ...
    Else
    Application.EnableEvents = False

    Du überschreibst Target, was schon mal tödlich ist.
    Damit kommst du immer in den Else-Zweig.
    Dort disablest du alle Events.
    Dann wird nie wieder ein Event geworfen.

    Der Code ist Schrott.
    Ausserdem kompiliert er sicher nicht (oder läuft auf Runtime-Error).
    Sheets("Abfrage").Cell(2, 7) Es gibt keine Cell-Property im Worksheet, nur Cells.
    Verwende Option Explicit

    Sinnvoll wäre so etwas:

    Visual Basic-Quellcode

    1. Private Sub Worksheet_Change(ByVal Target As Range)
    2. If Not Intersect(Target, Range("B14:D14")) Is Nothing Then
    3. ' do whatever
    4. End If
    5. End Sub

    Und verwende den Debugger, dann zeigt er dir wo du auf Fehler läufst.

    Edit:
    Ok, ihr seid schon einen Schritt weiter.
    Ich würde aber die Events nicht abschalten, sondern nur abfragen, ob Target in einem Bereich liegt, der Aktion erfordert.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    petaod schrieb:

    Du überschreibst Target, was schon mal tödlich ist.
    Damit kommst du immer in den Else-Zweig.
    Dort disablest du alle Events.
    Dann wird nie wieder ein Event geworfen.


    Danke für die Hinweise!
    Der Code ist natürlich Schrott, habe mit dem Programmieren erst diese Woche angefangen also bitte ich hier um Nachsicht :)

    Ich habe das alles angepasst mit den Tipps hier und das ganze Funktioniert inzwischen einwandfrei.

    Danke für die Hilfe!