Umschalten von 2 Worksheet_Change(ByVal Target As Range)
#1
Hallo Profi  69
ich habe in Tabelle1 ab Spalte "BC" ein extern gespiesener Datenpool. Daraus werden per
Makro die für mich relevanten Spalten extrahiert und ab Spalte A eingetragen. Dazu wird
im "VBA Projekt" in "Tabelle1" zusätzlich der Code aus "targed_Portrait" verwendet.
Beim Zurückschreiben von Ändernungen zum Datenpool benötige ich aber den Code aus
"targed_zurück_zu_Datenpool" in "Tabelle1". Dies wolte ich per Makrorecorder aufzeichnen,
was jedoch funktionierte. Ist das Umschalten per Makro überhaut machbar?
Wenn ja wie lautet der Code, oder gibt es eine andere Lösung?
Bitte um eure Hilfe.
Gruss Martin


Angehängte Dateien
.xlsm   Ereignisüberwachung neu Test.xlsm (Größe: 1,54 MB / Downloads: 7)
Antworten Top
#2
Hallo Namensvetter,
ein Private Sub Worksheet_Change(ByVal Target As Range) in einem Modul ist Unsinn, das kann nicht gehen. Ein solches Sub ist an eine Tabelle gebunden und erhält von dort auch den Parameter Target.
Wenn Du den Inhalt des _Change-Subs einzig aus dem Aufruf eines anderen Subs Tabelle1_Change(ByVal Target as Range) bastelst, kannst Du den bisherigen Code des Change-Subs in dieses übernehmen. Das Sub Tabelle1_Change(...) kann dann in einem Modul stehen und von überall aufgerufen werden.
Gruß der ALteDresdner (mit bürgerlichem Namen Martin)
Gruß der AlteDresdner (Win11, Off2021)
Antworten Top
#3
Hallo Namensvetter,
danke für die Antwort. Ich weiss das die Module so nicht funktionieren.
Aus diesen 2 targed ... in den Modulen kopiere ich manuell den Makrotext in Tabelle1
und überschreibe den alten Makrotext und wenn nötig wieder zurück. Ich suche eine
Möglichkeit, dass wenn "targed_Portait" in Tabelle1 abgelaufen ist, den Inhalt gelöscht
wird und durch den Text von "targed_zurück_zu _Datenpoo"l in Tabell1 ersetzt wird.

Oder anderst ausgerükt:
Lösche in Tabelle 1 in "targed_Portrait" den Text;   öffne "targed_Daten_zurück_zu_Datenpool"; 
markiere den Inhalt ; kopiere ihn in Tabelle1.

Gruss
Martin
Antworten Top
#4
Hallo,
wenn ich dich richtig verstanden habe, tauschst du den Makrotext in den Subs aus?
Das könnte man auch so regeln, dass beide Makros in dem Change-Sub vorhanden sind und durch eine passend gesetzte Public Variable vom Typ Boolean abwechselnd in Szene gesetzt werden.
Gruß der Martin
Gruß der AlteDresdner (Win11, Off2021)
Antworten Top
#5
Hallo Martin (der ALteDresdner),
danke für deine Antwort. Ja du hast richtig verstanden.
Wenn man beides kombinieren könnte wäre das toll.
Doch wie, da bin ich überfordert.
Wäre dankbar, wenn du mir helfen würdest.
Gruss Martin
Antworten Top
#6
Hallo Martin,
da ich verständlicherweise in Deinem Makroablauf nicht durchsehe, hier ein Code, der das Prinzip darstellt.
Code:
Option Explicit
Public MakroWechsel 'absichtlich kein Typ angegeben
Private Sub Worksheet_Change(ByVal Target As Range)
  If VarType(MakroWechsel) <> vbBoolean Then MakroWechsel = True '1. setzen nach Dateistart
  If MakroWechsel Then
    Makro1
  Else
    Makro2
  End If
  MakroWechsel = Not MakroWechsel
End Sub
Sub Makro1()
  MsgBox "Makro1"
End Sub
Sub Makro2()
  MsgBox "Makro2"
End Sub
Gruß der MArtin
Gruß der AlteDresdner (Win11, Off2021)
Antworten Top
#7
Giuten Abend Martin
98 für deine Hilfe.
Werde das Makro mal testen und melde mich wieder.
Gruss und ein schöner Sonntagabend wünscht dir
Martin
Antworten Top
#8
Guten Tag Martin (der AlteDresdner)
hier die neue Tabelle mit allen Makro, zur besseren Nachverfolgung.
Mit dem Button "Quelldaten nach Zieldatei kopieren, startet das
Makro "Personendaten_Spalten_kopieren" welches automatisch die
andern Makro aufruft. Das funktioniert alles soweit gut.

Ich möchte anschliessend im "VBA Projekt in Tabelle1" den Text
durch denjenigen aus"targed_zurück_nach_Quelle" ersetzen.

Beim Anpassen des "Public MakroWechsel" bin ich immer noch am üben.
Da könnte ich nochmals deine Hilfe gebrauchen
Gruss Martin


Angehängte Dateien
.xlsm   Ereignisüberwachung Mappe 1 Test.xlsm (Größe: 563,31 KB / Downloads: 2)
Antworten Top
#9
Hallo Martin,
warum auch immer Du das so tun willst, es ist etwas ungewöhnlich.
Ich würde beide Codevarianten in das Sub stecken und mit einer If-Else-Konstruktion laufen lassen.
Wenn Du einmalig etwas Anderes tun willst, kannst Du Dir das ja über eine einmal gesetzte boolsche Variable merken, bei dauerndem Wechsel übder die von mir oben vorgeschlagene Variante.
Wenn Du aber partout den Code tauschen willst:
Es gibt eine Möglichkeit, den Code zeilenweise zu ersetzen, das ist aber aufwendig.
Der m.E. einfachste Weg wäre: Schreibe das _Change-Sub so, dass es nur aus dem Aufruf eines anderen Makros besteht, also sinngemäß
Private Sub ..._Change(Byval Target as Range)
  Tab1_Change Target
End Sub
und schicke den eigentlichen Inhalt des Makros in einen Modul, z.B. Tab1_C.
Die zweite Variante des Subs Tab1_Change bastele einmal in einen Modul Tab1_C und exportiere ihn, das ergibt ein Tab1_C.bas.
Mit der Konstruktion
    With Activeworkbook.VBProject.VBComponents
      .Remove .Item("Tab1_C")
      .Import ThisWorkbook.Path & "\" & "Tab1_C.bas"

   End with
tauscht Du das alte gegen das neue Makro aus.
Ich wollte Dir das eigentlich in der geposteten Datei schreiben, bin aber über Deine, Du verzeihst, "unordentliche" Codierung gestolpert. Mal Sheets("Tabelle1"), mal .Tabelle3, mal Me...
Wenn Du Deine Code jemals nach 2 Monaten Pause korrigieren/erweitern willst: Viel Spaß!
Martin, damit will ich es bewenden lassen. Wenn Du mir nicht zwingende Gründe für den Codetausch und eine halbwegs saubere Codierung postest, wäre ich dann raus.
Gruß der AlteDresdner (Win11, Off2021)
Antworten Top
#10
Guten Abend Martin,
danke für deine Info mit den Möglichkeiten, wie das machbar wäre. Da mein erster Post mehr
Fragen aufwarf habe ich nochmals eine halbwegs lauffähige Version gepostet in der Hoffnung,
dass damit mein Wunsch klarer ersichtlich ist, doch habe ich damit nur noch mehr Fragen produziert.
Ich möchte, wenn der Kopiervorgang abgeschlossen ist, wie Du erwähst hast, nur den alten Makrocode
durch den neuen Makrocode ersetzen, damit ich bei Bedarf Daten wieder zurück schreiben kann.
Leider reicht mein Wissen nicht aus, dies zu realisieren. Schade, da muss ich es machen wie bisher.

Ich öffne "targed_zurück_nach_Quelldaten", markiere und kopiere den Code,
öffne "Tabelle1"  lösche den alten Code und ersetze ihn durch den neuen Code.

Danke für Deine bisherigen Bemühungen. Darum mein nochmaliger Hilferuf.
Wünsche eine gute Nacht.
Gruss Martin
Antworten Top


Gehe zu:


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