Wenn Zelle sich ändert dann SpeichernUnter

Hallo,

ich bin neu was Excel - VBA angeht. Ich möchte das, wenn sich eine Zelle ändert, das Fenster „SpeichernUntern“ öffnet.
MeinCode:

Private Sub Worksheet_Change(ByVal Target As Range) 
  If Intersect(Target, Range("$J$8")) Then
     Call speichereArbeitsblatt
End If
End Sub

Beim Ausführen, wird ein Fehler angezeigt:
Laufzeitfehler 91:
Objektvariable oder With-Blockvariable nicht festgelegt.

Habe überhaupt keine Ahnung was damit gemeint ist. Bin für jede Hilfe dankbar.

Gruß Khai…

Private Sub Worksheet_Change(ByVal Target As Range) 
  If Intersect(Target, Range("$J$8")) Then
     Call speichereArbeitsblatt
End If
End Sub
Beim Ausführen, wird ein Fehler angezeigt:
Laufzeitfehler 91:
Objektvariable oder With-Blockvariable nicht festgelegt.

Hallo Khai

Vielfach muss man in VBA eine Variable, die einen Zellbereich „darstellt“ mit Set definieren. Hier z. B. so:

Private Sub Worksheet\_Change(ByVal Target As Range)
Set Target = Intersect(Target, Range("$J$8"))
If Target Is Nothing Then Exit Sub
Call speichereArbeitsblatt
End Sub

Ich hoffe, der Fehler erledigt sich damit. Grüsse Niclaus

Der Fehler wird jetzt nicht mehr angezeigt, dafür erstmal Danke. Jedoch öffnet sich das Fenster „SpeichernUnter“ nicht.

Private Sub Worksheet_Change(ByVal Target As Range)
Set Target = Intersect(Target, Range("$J$8"))
If Target Is Nothing Then Exit Sub
Application.Dialogs(xlDialogSaveAs).Show
End Sub

Hey Niclaus,

wenn ich die Zelle manuell ändere dann öffnet sich das Fenster.
Die Zelle dient damit, dass sie die Kalenderwoche berechnet.
Wenn ich jetzt eine Zelle „Tag“ ändere und sich die Zelle mit der Kalenderwoche ändert, dass sich dann erst das Fenster „SpeichernUnter“ öffnet.

Jedoch öffnet sich das Fenster „SpeichernUnter“ nicht.

Private Sub Worksheet_Change(ByVal Target As Range)
Set Target = Intersect(Target, Range("$J$8"))
If Target Is Nothing Then Exit Sub
Application.Dialogs(xlDialogSaveAs).Show
End Sub

Hallo Khai

Da bin ich überfordert. Bei mir funktioniert nämlich das obige Makro.

Wie ist es denn, wenn Du (in den Modulen) ein Makro einfügst:

Sub test()
Application.Dialogs(xlDialogSaveAs).Show
End Sub
Funktioniert dieses Makro?

Möglicherweise musst Du Einstellungen ändern/ergänzen. Bei mir (Excel 2010) habe ich folgendes aktiviert:
Im VBA-Explorer im Menü Extras unter Verweise:
. Visual Basic For Applications
. Microsoft Excel 14.0 Object Library
. OLE Automation
. Microsoft Office 14.0 Object Library

Ob die erste dieser Einstellungen für Application.Dialogs(…) „zuständig“ ist? Ich weiss es nicht. Tut mir leid!

Niclaus

Durch manuelles ändern der Zelle funktioniert das Makro, wenn die Zelle durch eine andere Zelle geändert wird, klappt dies jedoch nicht mehr.
Hoffe es kann mir jemand weitere Tipps dazu geben…

Hallo Khai,

ja, das ist so: Das Change-Ereignis tritt nur ein, wenn eine Zelle von Hand geändert wird.
Aber da ja die Änderung der Zelle erfolgt, weil eine andere Zelle von Hand geändert wird, frag doch auf diese andere Zelle ab:

Private Sub Worksheet\_Change(ByVal Target As Range)
 ' Als Beispeiel sei die von Hand geänderte Zelle hier M2.
 If Target.Address = "$M$2" Then Application.Dialogs(xlDialogSaveAs).Show
End Sub

Gruß, Andreas

Genau, nur wenn sich die Kalenderwoche ändert/erhöht soll „SpeichernUnter“ geöffnet werden.
Die Zelle Tag befindet sich in J8

Wenn die Zelle mit dem Tag geändert wird und Kalenderwoche nicht erhöht dann soll nichts geschehen, NUR wenn sich die Kalenderwoche erhöht soll „SpeichernUnter“ geöffnet werden.

Gruß Khai

Genau, nur wenn sich die Kalenderwoche ändert/erhöht soll
„SpeichernUnter“ geöffnet werden.

Hallo Khai

Ich bin nicht sicher ob ich Dich richtig verstanden habe: Zelle J8 enthält eine KALENDERWOCHE-Formel, die sich auf irgendeine andere Zelle bezieht? Stimmt das?

Wenn Ja, mache ich es mit der folgenden Formel.
Ich brauche dazu aber eine Hilfszelle! Ich füge sie bei mir in K8 ein! Diese Hilfszelle enthält ebenfalls die Kalenderwoche, ich brauche sie als Vergleichsmöglichkeit. Statt K8 kannst Du eine x-beliebige Zelle dazu verwenden, musst sie aber im folgenden Makro (an zwei Stellen) anpassen.
Bevor Du den ersten Test machst, gib bitte in K8 die gleiche Zahl ein, die in J8 gezeigt wird.

Private Sub Worksheet\_Change(ByVal Target As Range)
AltWert = Range("K8")

On Error Resume Next
If Intersect(Target.Dependents, [J8]) Is Nothing Then
Exit Sub
Else
 If Range("J8") AltWert Then Application.Dialogs(xlDialogSaveAs).Show
 Range("K8") = Range("J8")
End If
End Sub

Hilft das? Niclaus

Aber da ja die Änderung der Zelle erfolgt, weil eine andere
Zelle von Hand geändert wird, frag doch auf diese andere Zelle
ab:

Hallo Andreas

Ich glaube, das hilft Khai nicht weiter. Eine Aenderung dieser „andern“ Zelle hat nicht unbedingt eine Aenderung von J8 zur Folge. Es geht ja um Kalenderwochen. Es ginge wohl, wenn man im Makro bereits die Kalenderwoche dieser „andern“ Zelle berechnen würde. Aber wenn man nicht weiss, mit welcher Kalenderformel in J8 gerechnet wird, ist es etwas schwierig.

Würdest Du Dir bitte mal oben meine Antwort von 22.10.2014 16:36 an Khai anschauen. Ich habe dazu eine Frage an Dich. Ich brauche für mein Makro eine Hilfszelle in der Tabelle. Geht das auch ohne Hilfszelle? Kann ich die Vergleichszahl auch direkt ins Makro aufnehmen? Ich habe es mit Static AltWert versucht. Bin aber nicht weitergekommen damit.

Diese Frage wäre wohl ein eigenes Forumsthema, aber es ist leichter, sie im Rahmen des aktuellen Themas darzulegen.

Vielen Dank und viele Grüsse
Niclaus

Hallo Niclaus,

eine Möglichkeit ohne Hilfszelle wäre, die Zelle mit der Formel für die Kalenderwoche (ich benutze hier mal B2) beim Öffnen der Mappe abzufragen. Ich habs jetzt mal so gelöst:
Im Codebereich von DieseArbeitsmappe:

Option Explicit

Public altWert

Private Sub Workbook\_Open()
 altWert = Tabelle1.Range("B2")
End Sub

Im Codebeich des Tabellenblatts:

Option Explicit

Private Sub Worksheet\_Change(ByVal Target As Range)
 If DieseArbeitsmappe.altWert Range("B2") Then Application.FileDialog(msoFileDialogSaveAs).Show
 DieseArbeitsmappe.altWert = Range("B2")
End Sub

Ich habe ein paar Testläufe gemacht. Scheint zu klappen.

Gruß, Andreas

Jetzt passt es perfekt! Danke Euch @Niclaus & @ Andreas für eure Hilfe :smiley:

eine Möglichkeit ohne Hilfszelle wäre, die Zelle mit der
Formel für die Kalenderwoche (ich benutze hier mal B2) beim
Öffnen der Mappe abzufragen. Ich habs jetzt mal so gelöst:
Im Codebereich von DieseArbeitsmappe:

Public altWert

Private Sub Workbook_Open()
altWert = Tabelle1.Range(„B2“)
End Sub

Hallo Andreas

Danke schön für den Hinweis auf Public. Bei mir funktioniert es so nicht. Auf office-loesung.de habe ich den Hinweis gefunden, dass Public-Variablen nicht im VBA-Bereich von Arbeitsmappen oder Tabellen deklariert werden können. Sie müssen in einem Modul deklariert werden, können dann aber auch im VBA-Bereich von Arbeitsblättern und Tabellen eingesetzt werden.

Ich habe es nun so gemacht - und damit klappt es:

Im Codebereich von DieseArbeitsmappe:

Sub Workbook_Open()
Call Start
End Sub

Im Codebereich eines Moduls:

Public altWert

Sub Start()
altWert = Range(„Tabelle1!J8“)
End Sub

Noch einmal vielen Dank und viele Grüsse
Niclaus

Jetzt passt es perfekt! Danke Euch @Niclaus & @ Andreas für
eure Hilfe :smiley:

Freut mich!

Andreas hat mich noch auf eine Variante hingewiesen, mit der man sich die Hilfszelle K8 ersparen könnte. Schau mal unten meine Antwort an Andreas (23.10.2014 08:58 h).

Grüsse Niclaus

Hallo Andreas

'morgen Niclaus,

Danke schön für den Hinweis auf Public. Bei mir funktioniert
es so nicht. Auf office-loesung.de habe ich den Hinweis
gefunden, dass Public-Variablen nicht im VBA-Bereich von
Arbeitsmappen oder Tabellen deklariert werden können. :

Kannst du mir den Link mal zeigen?

Ich habe es nun so gemacht - und damit klappt es:

Im Codebereich von DieseArbeitsmappe:

Sub Workbook_Open()
Call Start
End Sub

Im Codebereich eines Moduls:

Public altWert

Sub Start()
altWert = Range(„Tabelle1!J8“)
End Sub

Ja, so klappt es auf alle Fälle.

Noch einmal vielen Dank und viele Grüsse
Niclaus

Gruß, Andreas

Auf office-loesung.de habe ich den Hinweis
gefunden, dass Public-Variablen nicht im VBA-Bereich von
Arbeitsmappen oder Tabellen deklariert werden können. :

Kannst du mir den Link mal zeigen?

Grüezi Andreas
Hier der Link:
http://www.office-loesung.de/ftopic197718_0_0_asc.php

Beitrag von maninweb - 15.12.2007 19:44 h:
„Und das Ganze natürlich in einem Modul, nicht in das Codemodul einer Tabelle; da funktioniert das nicht.“

Viele Grüsse
Niclaus

[MOD]: Link klickbar gemacht.

Hi Niclaus,

also, was da in dem Link steht, verstehe ich entweder nicht richtig oder es ist falsch.
Ich habe eben meinen Code aus dem Posting vom 22.10. 18:12 noch mal getestet (mit Excel 2007 und 2010). Er funktioniert.
Man muss halt darauf achten, dass man die Public-Variable altWert, die in „DieseArbeitsmappe“ dimensioniert wird, woanders dann mit DieseArbeitsmappe. altWert anspricht.

Gruß, Andreas

Hallo Andreas

also, was da in dem Link steht, verstehe ich entweder nicht
richtig oder es ist falsch.

Es ist tatsächlich falsch!

Man muss halt darauf achten, dass man die Public-Variable
altWert, die in „DieseArbeitsmappe“ dimensioniert wird,
woanders dann mit DieseArbeitsmappe. altWert anspricht.

Das DieseArbeitsmappe. altWert in Deinem Hinweis habe ich bisher falsch interpretiert. Ich habe DieseArbeitsmappe ersetzt durch den Namen der Excel-Datei, was nur einen Fehler produziert.

Wenn man nur auf Anhieb richtig lesen würde, was da geschrieben steht!

Noch einmal vielen Dank. Niclaus