VBA: Warum wird die Excel-Datei nicht geschlossen?

Jan

Level-1
Beiträge
813
Reaktionspunkte
79
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich habe in der Hilfe und mit der Suchfunktion keine Antwort gefunden.

Ich verstehe nicht, warum die Excel-Datei nicht geschlossen wird (der hier rot eingefärbte Text).


Private Sub Workbook_Open()
'Den Zähler auf 2 vorbelegen
Zähler = 2
'Die Schleife ausführen, solange der Zähler <= 19 ist.
Do While Zähler <= 19
'Den Tag und Monat aus der ausgewählten Zelle mit dem heutigen Tag und Monat vergleichen (Gburtstag)
Set TagMonat = Range("A" & Zähler)
If Left(TagMonat, 5) = Left(Date, 5) Then
'Anzeige der Person, die heute Geburtstag hat
MsgBox Range("B" & Zähler) & " hat heute Geburtstag"
Else
End If
'Den Zähler um 1 erhöhen
Zähler = Zähler + 1
'Die Schleife weiter ausführen
Loop
'Abfrage, ob die Datei geschlossen werden soll oder nicht
Rückmeldung = MsgBox("Wollen sie die Datei schließen?", 36, "Datei schließen")
'Wenn die Abfrage mit Ja beantwortet wird, wird die Datei gespeichert und geschlossen
If Rueckfrage = vbYes Then
Me.Save
Application.Quit
Else
End If
End Sub

Ich vermute, dass sich hier diejenigen, die sich mit VBA auskennen, vor Lachen wegschmeißen, aber ich als Anfänger auf diesem Gebiet weiß nicht weiter.
Ich hoffe Ihr könnt mir trotz Lachanfall weiterhelfen. ;)
 
Etwas mehr Code bitte

Hallo,

Jan schrieb:
Ich vermute, dass sich hier diejenigen, die sich mit VBA auskennen, vor Lachen wegschmeißen

Ich kenne mich mit VBA nicht aus, darum lache ich auch nicht über die Frage.
Die Ursache für Dein Problem ist auch aus dem eingestellten Code-Fragment nicht ersichtlich, da zum Beispiel ein Objekt Me. auftaucht. Wo ist das deklariert, was für ein Objekt ist das ?

Um Excel wirklich zu schliessen, musst Du auch alle zuvor in VBA angelegten Objekte freigeben. Ansonsten kriegst Du Excel nie vollständig geschlossen. Es bleibt immer entweder ein sichtbares Excel übrig oder zumindest ein im Taskmanager sichtbarer Prozeß.

Gruß

Question_mark
 
Zuviel Werbung?
-> Hier kostenlos registrieren
'Abfrage, ob die Datei geschlossen werden soll oder nicht
Rückmeldung = MsgBox("Wollen sie die Datei schließen?", 36, "Datei schließen")
'Wenn die Abfrage mit Ja beantwortet wird, wird die Datei gespeichert und geschlossen
If Rueckfrage = vbYes Then
Me.Save
Application.Quit
Else
End If
End Sub
Wenn Du bei IF die selbe Variable auswerten würdest, die den Rückgabewert der MsgBox auffängt ...

Harald
 
Hallo,



Ich kenne mich mit VBA nicht aus, darum lache ich auch nicht über die Frage.
Die Ursache für Dein Problem ist auch aus dem eingestellten Code-Fragment nicht ersichtlich, da zum Beispiel ein Objekt Me. auftaucht. Wo ist das deklariert, was für ein Objekt ist das ?

Um Excel wirklich zu schliessen, musst Du auch alle zuvor in VBA angelegten Objekte freigeben. Ansonsten kriegst Du Excel nie vollständig geschlossen. Es bleibt immer entweder ein sichtbares Excel übrig oder zumindest ein im Taskmanager sichtbarer Prozeß.

Gruß

Question_mark

Mein Kollege hat mir erzählt, dass ich mit "Me.Save" die Datei speichern kann und mit "Application.Quit" Excel schließen kann.

Was meinst du mit: "Um Excel wirklich zu schliessen, musst Du auch alle zuvor in VBA angelegten Objekte freigeben."?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Watt issene Objekt

Hallo,

Jan schrieb:
Mein Kollege hat mir erzählt, dass ich mit "Me.Save" die Datei speichern kann und mit "Application.Quit" Excel schließen kann.

Hat Dir Dein Kollege auch erklärt, das man Me. auch in VBA anlegen und erstellen muß und von welchem Objekttyp ME. ist ???
Ich glaube fast, Du beschäftigst Dich zum ersten mal mit VBA und Konsorten.

Gruß

Question_mark
 
Nein, das hat er mir nicht erklärt.

Ja, da liegst du völlig richtig.

Der von mir eingestellte Code, ist mein erster eigener.
 
Um solche Tippfehler zu vermeiden bzw. frühzeitig erkennung zu können schreibe ich - wenn ich denn mal zu VBA gezwungen - werde oben immer ein
Code:
Option Explicit
hin.
Das zwingt einen dazu alle Variablen vorher deklarieren zu müssen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Um solche Tippfehler zu vermeiden bzw. frühzeitig erkennung zu können schreibe ich - wenn ich denn mal zu VBA gezwungen - werde oben immer ein
Code:
Option Explicit
hin.
Das zwingt einen dazu alle Variablen vorher deklarieren zu müssen.

Ich bin Anfänger.
Was bedeutet vorher deklarieren?
Wie würde das z. B. aussehen?
 
VBA - Schrott

Hallo,

Thomas_v2.1 schrieb:
Das zwingt einen dazu alle Variablen vorher deklarieren zu müssen.

Diese Option sollte es in keiner Programmiersprache (Ok, VBA mit einer Programmiersprache zu vergleichen ist etwas gewagt :ROFLMAO:) geben, ein absolutes NoGo. In einer sauberen Programmiersprachen sollte jede Variable zwangsweise deklariert werden müssen. Sowas darf nicht per Option ausgeschlossen werden können. Punktum. Nur eine weitere Bestätigung für mich, diesen VAB - Schrott einfach nicht für eine ernsthafte Programmerstellung in Betracht zu ziehen. Ist wohl eher gedacht für Controller mit Brillengläsern wie Glasbausteine und einem bis zur Rente gesichertem Job in der Verwaltung.

Gruß

Question_mark
 
VBA Schi...

Hallo,

Jan schrieb:
Was bedeutet vorher deklarieren?

Damit der Compiler (oder im Falle von VBA ein beschissener Interpreter) beim übersetzen vom Quellcode zur ausführbaren executable einen definierten Datentyp mit einem vergebenen symbolischen Namen richtig interpretieren kann. Das dies in VBA nicht zwingend vorgeschrieben ist und erst über "Option explicite" eingeführt wird, zeigt welch besch...enes Werkzeug dieses VBA ist. Ansonsten hätte Dir jeder vernünftige Compiler Deine Verwechselung zwischen "Rückmeldung" und "Rückfrage" direkt um die Ohren gehauen und Du hättest den Fehler direkt gemerkt.

Gruß

Question_mark
 
Diese Option sollte es in keiner Programmiersprache (Ok, VBA mit einer Programmiersprache zu vergleichen ist etwas gewagt :ROFLMAO:) geben, ein absolutes NoGo. In einer sauberen Programmiersprachen sollte jede Variable zwangsweise deklariert werden müssen. Sowas darf nicht per Option ausgeschlossen werden können. Punktum.

Ach, so eng würde ich das garnicht sehen.
Bei einer Scriptsprache in der man mal kurz was hinhacken will kann sowas durchaus sinnvoll sein.
Beispielweise man kann dem Perl-Interpreter über die Kommandozeile kurze Progrämmchen zum abarbeiten hinwerfen, und da will man nicht unbedingt alle Variablen deklarieren müssen.
Für größere Programme verwende ich aber bei Perl auch die Anweisung "use strict" was dem "Option Explicit" in VBA entspricht.
Bei Python braucht man auch keine Variablen zu deklarieren, und dort habe ich noch nichtmal eine Option gefunden um dies zu aktivieren. Und Perl sowie Python würde ich im Gegensatz zu VB schon zu den ernsthaften Sprachen zählen.
 
Ich sehe das trotzdem etwas eng ..

Hallo,

Thomas_v2.1 schrieb:
Ach, so eng würde ich das garnicht sehen.
Bei einer Scriptsprache in der man mal kurz was hinhacken will kann sowas durchaus sinnvoll sein.

Es gibt keinerlei Rechtfertigung in der Programmierung, irgendetwas mal kurz hin zu hacken. Jedenfalls nicht an Programmen, die ich für meine Kunden erstelle. Darum fallen bei mir Scriptsprachen sowieso heraus.

Meine Kunden erwarten von mir funktionsfähige Lösungen für einen 24/7 Betrieb, teilweise ist von meiner Programmierung (egal ob ob auf SPS-Seite oder PC mit Hochsprache) der Produktionsbetrieb für einige hundert Mitarbeiter möglich, oder auch nicht....

Es ist immer ein Ritt auf "the razors edge", aber ich bin auch sehr sorgfältig bei der Auswahl meiner Werkzeuge ... Und da sind so Dinge wie Excel oder Access mit VBA bestimmt ganz weit aussen vor :-D

Also ich bin eigentlich gezwungen, das ganze etwas eng zu sehen.

Gruß

Question_mark
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@ Questionmark

Mein Kollege hat mir erzählt das Me. die Datei selbst ist.
Also so wie ich es verstanden habe, bedeutet Me.Save, speicher diese Datei.
Und Me.close, schließe diese Datei.
 
das kann man doch alles nachlesen ...

Zitate aus der Microsoft Excel VBA-Hilfe:
Me
Das Schlüsselwort Me verhält sich wie eine implizit deklarierte Variable. Es steht allen Prozeduren in einem Klassenmodul automatisch zur Verfügung. Wenn eine Klasse mehrere Instanzen haben kann, stellt Me eine Möglichkeit dar, um sich auf diejenige Instanz der Klasse zu beziehen, in der Code ausgeführt wird. Die Verwendung von Me ist insbesondere dann hilfreich, wenn Sie Informationen zur momentan ausgeführten Instanz einer Klasse an eine Prozedur in einem anderen Modul übergeben möchten.
Save-Methode
Speichert Änderungen in der angegebenen Arbeitsmappe.

Ausdruck.Save
Ausdruck Erforderlich. Ein Ausdruck, der ein Workbook-Objekt zurückgibt.

Beispiel
In diesem Beispiel wird die aktive Arbeitsmappe gespeichert.
Anschließend wird Microsoft Excel beendet.
Code:
ActiveWorkbook.Save
Application.Quit
In diesem Beispiel werden alle geöffneten Arbeitsmappen gespeichert.
Anschließend wird Microsoft Excel beendet.
Code:
For Each w In Application.Workbooks
    w.Save
Next w
Application.Quit
Ich würde statt Me.Save die im Beispiel angegebene Schreibweise ActiveWorkbook.Save benutzen.

Harald
 
Zurück
Oben