VBA If Formel geht nicht

Hallo zusammen. Was stimmt an meiner Formel nicht?

Ich möchte WENN Spalte D4:smiley:1000 verändert wird, UND irgendwann mal das Blattregister „Tabelle2“ aktiviert (angeklickt) wird, DANN soll es das Makro Test() ausführen.

Mein Code:

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = D Then Exit Sub
If Sheets(„Tabelle2“).Select Then
Call Test()
End If

End Sub

Ich möchte WENN Spalte D4:smiley:1000 verändert wird, UND irgendwann
mal das Blattregister „Tabelle2“ aktiviert (angeklickt) wird,
DANN soll es das Makro Test() ausführen.

Hallo Sascha,

in welchen Blättern soll auf D4:smiley:1000 reagiert werden? Ich hab hier mal Tab1 genommen.

Gruß
Reinhard

In Modul: Diese Arbeitsmappe:

Option Explicit
Private bolWechsel As Boolean

Private Sub Workbook\_SheetActivate(ByVal Sh As Object)
If Sh.Name = "Tabelle2" And bolWechsel = True Then
 bolWechsel = False
 Call test
End If
End Sub

Private Sub Workbook\_SheetChange(ByVal Sh As Object, ByVal Target As Range)
If Sh.Name "Tabelle1" Then Exit Sub
If Intersect(Target, Range("D4:smiley:1000")) Is Nothing Then Exit Sub
bolWechsel = True
End Sub

Perfekt. Danke Reinhard. Auf Dich ist extrem Verlass. :smile:) Bin das nicht gewohnt…

Ich habe nun anstatt den bereich d4:d1000 einen namen definiert, um fehler zu vermeiden… funktioniert prima…

nur… wie kann ich anstatt den tabellennamen (tab1) sicherstellen dass es auch funktioniert wenn der tabellenname umbenennt wird?

Grüezi Sascha

nur… wie kann ich anstatt den tabellennamen (tab1)
sicherstellen dass es auch funktioniert wenn der tabellenname
umbenennt wird?

Du könntest den Code auch direkt im Tabellenblatt selbst unterbringen, dann spielt der Name desselben keine Roll mehr.

Im Moment ist der Code in ‚Diese Arbeitsmappe‘ gespeichert und gilt mappenweit. Daher ist auch die Abfrage des Tabellennamens notwendig um einzuschränken auf welchen Blättern der Code greift.

Wenn Du einen Rechtsklick auf den Reiter des einzelne Tabellenblattes machst und ‚Code anzeigen‘ wählst ‚landest‘ Du im Codemodul des Tabellenblattes. Hier dann die folgenden Zeilen reinkopieren bewirkt dasselbe wie Reinhards Code, wirkt aber nur in diesem einen Tabellenblatt (den Code in ‚Diese Arbeitsmappe‘ noch löschen oder auskommentieren):

Option Explicit

Private Sub Worksheet\_Activate()
 MsgBox Me.Name & " wurde aktiviert"
 'Call Test
End Sub

Private Sub Worksheet\_Change(ByVal Target As Range)
 If Not Intersect(Target, Range("A1:A1000")) Is noting Then
 'Call Test
 End If
End Sub

Mit freundlichen Grüssen

Thomas Ramel

  • MVP für MS-Excel -

etwas mache ich falsch. es will so nicht funktionieren… :frowning:

Grüezi Sascha

etwas mache ich falsch. es will so nicht funktionieren… :frowning:

Ja, das denke ich auch - aber ohne zu wissen was Du genau tust, können wir da wohl leider auch nicht viel tun… :wink:

Erstelle daher eine Demo-Mappe und lade sie auf einen Webspace hoch.
Nenne hier dann den Link damit wir sie herunterladen können.

Mit freundlichen Grüssen

Thomas Ramel

  • MVP für MS-Excel -

nur… wie kann ich anstatt den tabellennamen (tab1)
sicherstellen dass es auch funktioniert wenn der tabellenname
umbenennt wird?

Hallo Sascha,

schau mal links in den VB-Editor zu einer Mappe (=Projekt) wo du Blätter umbenannt hast.

Du siehst da pro Blatt zwei Namen, der zweite in Klammern.
Der in Klammern ist der Blattname so wie ihn der User umbenennen kann und darf in Excel

Den sprichst du an mit „Name“, also z.B. so:

If Sh.Name = „Tabelle2“ And bolWechsel = True Then

Den ersten Namen das ist der internerne Name für das Blatt. Den kann man nur mit Vba abändern/asulesen usw.
Den sprichst du an mit „CodeName“, also z.B. so:

If Sh.CodeName = „Tabelle2“ And bolWechsel = True Then

Was genau willst du eigentlich machen?

Gilt das was du anfangs geschrieben hast, daß du wenn du in D4:smiley:4000 etwas geändert hast und dann SPÄTER das Blatt Tabelle2 aktivierst ein Makro gestartet werden soll?

Im Code von Thomas ändere das noting in nothing ab.
Ansonsten hat Thomas programmiert daß die Prozedur ausgeführt wird wenn du Tabelle2 aktivierst ODER in tabelle2 in D4:smiley:1000 etwas änderst.

Also haben wir beide verschiedene Programmierlogik hinter den Codes.
Nur, wir wissen beide nicht genau *glaub* welche Programmierlogik du eigentlich möchtest.

Und grundsätzlich bei Fehlern, genau angeben was passiert und in welcher Prozedur in welcher Codezeile. Auch mitteilen wenn nichts passiert.

Setze mal in jede Prozedur einen Haltepunkt.
Dann "arbeite in der mappe bis die Codes auslösen müßten.
Dann gehe im Code mit F8 weiter im Code…

Wenn du Tabelle2 aktivierst und die Prozedur
Private Sub Worksheet_Activate()
(in der du vor der Msgbox einen Haltepunkt hast)
wird gar nicht „angesprungen“, d.h. der Editor erscheint usw. dann liegt es nicht am Code selbst.

Dann laß diesen Code laufen:

Sub tt()
Application.EnableEvents=True
End sub

Wenn es daran auch nicht liegt so hast du die Prozedur im mfalschen Modul *gg*

Gruß
Reinhard

Gruß
Reinhard

Ja genau. Das habe ich gesucht… ich wollte nur den CodeNamen ansprechen, damit alles funktioniert und der User den tabellennamen umbenenn kann wie er will.

so läufts…

habe nun das makro

Sub Liste\_aktualisieren()

 Sheets("Hilfsblatt").Visible = True
 Sheets("Klientenliste 2011").Unprotect Password:="Cma10"
 Sheets("Hilfsblatt").Unprotect
 Sheets("Total Klienten\_Monat").Unprotect
 Sheets("Klientenliste 2011").Select
 Range("D3:smiley:1000").Select
 Selection.Copy
 Range("D1").Select
 Sheets("Hilfsblatt").Select
 Columns("E:E").Select
 ActiveSheet.Paste
 Range("E1").Select
 Application.CutCopyMode = False
 Range("E1:E1000").AdvancedFilter Action:=xlFilterInPlace, Unique:=True
 Range("E2:E1000").Select
 Selection.Sort Key1:=Range("E2"), Order1:=xlAscending, Header:=xlGuess, \_
 OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, \_
 DataOption1:=xlSortNormal
 Selection.Copy
 Sheets("Total Klienten\_Monat").Select

 Range("A8").Select
 Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks \_
 :=False, Transpose:=False
 Range("B9").Select
 Sheets("Hilfsblatt").Select
 Application.CutCopyMode = False
 ActiveSheet.ShowAllData
 Columns("E:E").Select
 Selection.ClearContents
 Range("C1").Select
 Columns("E:E").Select
 Selection.ClearContents
 Range("D1").Select
 Sheets("Total Klienten\_Monat").Select
 Sheets("Klientenliste 2011").Protect Password:="Cma10"
 Sheets("Hilfsblatt").Protect
 Sheets("Total Klienten\_Monat").Protect
 Sheets("Hilfsblatt").Visible = False
 Sheets("Klientenliste 2011").Activate


End Sub

Kann ich nun auch die befehle: Sheets(„Klientenliste 2011“) auch mit CodeName ansprechen?

Kann ich nun auch die befehle: Sheets(„Klientenliste 2011“)
auch mit CodeName ansprechen?

Hallo Sascha,

im Code könntewn aber ne Menge Zeilen raus und das meiste Select gleich mit.
Steht dazu nix hier in der FAQ?
Wenn nicht so kann man das ändern *mal schauen*

Ja

anstatt
Sheets(„Klientenliste 2011“).Activate
Tabelle345.Activate

wenn Tabelle345 der Codename ist.

Gruß
Reinhard

GELÖST :smile:
Hallo Liebe Experten,

Hatte soeben eine Lösung zur Hand die funktionierte. Aber die von Reinhard gefällt mir besser…

Ich hatte den Befehl geändert in:

Sheets(1).Select
Sheets(2).Select usw… hat funktioniert,

Habe mich aber an Reinhard gehalten und nochmals geändert.
Vielen Dank

Nochmals zum erklären
Ich wollte wenn sich etwas in der Spalte D vom Tabellenblatt 1 etwas ändert UND wenn man dann auf das Tabellenblatt 2 klickt, DANN ein Makro ausführen…

Was ich nun geändert habe ist:

In „Diese Arbeitsmappe“ folgender Code:

Option Explicit
Private bolWechsel As Boolean

Private Sub Workbook\_SheetActivate(ByVal Sh As Object)
If Sh.CodeName = "Tabelle2" And bolWechsel = True Then
 bolWechsel = False
 Call Liste\_aktualisieren
End If
End Sub

Private Sub Workbook\_SheetChange(ByVal Sh As Object, ByVal Target As Range)
If Sh.CodeName "Tabelle1" Then Exit Sub
If Intersect(Target, Range("Clients")) Is Nothing Then Exit Sub
bolWechsel = True
End Sub

Dann das Makro:

Sub Liste\_aktualisieren()

 Sheets("Hilfsblatt").Visible = True
 Tabelle1.Unprotect Password:="password"
 Sheets("Hilfsblatt").Unprotect
 Tabelle2.Unprotect
 Tabelle1.Select
 Range("Clients").Select
 Selection.Copy
 Range("D1").Select
 Sheets("Hilfsblatt").Select
 Range("Clients\_Hilfe").Select
 ActiveSheet.Paste
 Range("E1").Select
 Application.CutCopyMode = False
 Range("Clients\_Hilfe").AdvancedFilter Action:=xlFilterInPlace, Unique:=True
 Range("Clients\_Hilfe\_1").Select
 Selection.Sort Key1:=Range("E2"), Order1:=xlAscending, Header:=xlGuess, \_
 OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, \_
 DataOption1:=xlSortNormal
 Selection.Copy
 Tabelle2.Select

 Range("A8").Select
 Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks \_
 :=False, Transpose:=False
 Range("B9").Select
 Sheets("Hilfsblatt").Select
 Application.CutCopyMode = False
 ActiveSheet.ShowAllData
 Range("Clients\_Hilfe").Select
 Selection.ClearContents
 Range("C1").Select
 Range("Clients\_Hilfe").Select
 Selection.ClearContents
 Range("D1").Select
 Tabelle2.Select
 Sheets("Hilfsblatt").Protect
 Tabelle2.Protect
 Tabelle1.Protect Password:="password"
 Sheets("Hilfsblatt").Visible = False

End Sub

So funktionierts… :smile:

Danke Vielmals

Liebe Grüsse
Sascha

Hallo Sascha,

zu deinem Code:

Range(„D3:smiley:1000“).Select
Selection.Copy
kannste so schreiben:
Range(„D3:smiley:1000“).Copy

Range(„E2:E1000“).Select
Selection.Sort …
kannste so schreiben:
Range(„E2:E1000“).Sort …

Hier ist die Selektion von C1 sinnlos weil gleich danach was anderes selektiert wird.
Range(„C1“).Select
Columns(„E:E“).Select
Selection.ClearContents
Schreib’s so
Columns(„E:E“).ClearContents

Ohne diese Selektiererei kommste auch meist ohne
Application.CutCopyMode
aus.

Gruß
Reinhard

Hallo Reinhard

Danke für Deine Hilfe…

Ich habe den Code so angepasst:

Sub Liste\_aktualisieren()

Application.ScreenUpdating = False
 Sheets("Hilfsblatt").Visible = True
 Sheets("Hilfsblatt").Unprotect
 Tabelle2.Unprotect
 Tabelle1.Unprotect Password:="Cma10"
 Range("Clients").Copy
 Sheets("Hilfsblatt").Select
 Range("Clients\_Hilfe").Select
 ActiveSheet.Paste
 Range("E1").Select
 Application.CutCopyMode = False
 Range("Clients\_Hilfe").AdvancedFilter Action:=xlFilterInPlace, Unique:=True
 Range("Clients\_Hilfe\_1").Select
 Selection.Sort Key1:=Range("E2"), Order1:=xlAscending, Header:=xlGuess, \_
 OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, \_
 DataOption1:=xlSortNormal
 Selection.Copy
 Tabelle2.Select
 Range("A8").Select
 Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks \_
 :=False, Transpose:=False
 Sheets("Hilfsblatt").Select
 Application.CutCopyMode = False
 ActiveSheet.ShowAllData
 Range("Clients\_Hilfe").Select
 Selection.ClearContents
 Range("Clients\_Hilfe").Select
 Selection.ClearContents
 Range("D1").Select
 Tabelle2.Select
 Range("D1").Select
 Sheets("Hilfsblatt").Protect
 Tabelle2.Protect
 Tabelle1.Protect Password:="Cma10"
 Sheets("Hilfsblatt").Visible = False

Application.ScreenUpdating = True 
End Sub

LG Sascha

Warum nur funktioniert das Aufrufen des Makros beim Öffnen der Mappe nicht?

Option Explicit
Private bolWechsel As Boolean
Sub Workbook\_Open()
Call Liste\_aktualisieren
End Sub
Private Sub Workbook\_SheetActivate(ByVal Sh As Object)
If Sh.CodeName = "Tabelle2" And bolWechsel = True Then
 bolWechsel = False
 Call Liste\_aktualisieren
End If
End Sub
Private Sub Workbook\_SheetChange(ByVal Sh As Object, ByVal Target As Range)
If Sh.CodeName "Tabelle1" Then Exit Sub
If Intersect(Target, Range("Clients")) Is Nothing Then Exit Sub
bolWechsel = True
End Sub

Hallo Sascha,

Warum nur funktioniert das Aufrufen des Makros beim Öffnen der
Mappe nicht?

ich habe jetzt zugegebenermaßen mir das Makro gar nicht angeschaut.

Ich nehme an es liegt an einer Besonderheit von Excel die für mich unlogisch ist.
Das Ereignis Tabellenblatt aktivieren, also _Activate
wird beim Öffnen der mappe nicht ausgeführt.

Schreib also in#s Modul Diese Arbeitsmappe:

Private Sub Workbook_Open()
Worksheets(„anderes blatt“).Activate
Worksheets(„das Blatt daß du meinst“).Activate
End Sub

Gruß
Reinhard

Private Sub Workbook_Open()
Worksheets(„anderes blatt“).Activate
Worksheets(„das Blatt daß du meinst“).Activate
End Sub

Funktioniert auch nicht. Aber ich habe gesehen dass beim öffnen der Mappe, 2 Datenquellen verknüpft sind.
Lösche ich diese, funktionierts…

Naja Egal… Ich lasse diese vorerst mal gelöscht. Ich brauche diese momentan nicht…

Danke und lieber Gruss
Sascha

Hallo Sascha,

Private Sub Workbook_Open()
Worksheets(„anderes blatt“).Activate
Worksheets(„das Blatt daß du meinst“).Activate
End Sub

Funktioniert auch nicht. Aber ich habe gesehen dass beim
öffnen der Mappe, 2 Datenquellen verknüpft sind.
Lösche ich diese, funktionierts…

sorry, von „Funktiuoniert auch nicht“ haben wir hier nix und warum da zwei verknüpfte Dateien damit zu tun haben ist mir acuh unklar.

Zum Selektieren:

Schau mal da:

http://www.online-excel.de/excel/singsel_vba.php?f=78

Gruß
Reinhard

oh super…

damit wird auch mein code extrem gekürzt…
werde es ausprobieren.

danke für den link :smile:

sascha