# VBA: Warum wird die Excel-Datei nicht geschlossen?



## Jan (25 September 2010)

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.


----------



## Question_mark (25 September 2010)

*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


----------



## PN/DP (25 September 2010)

Jan schrieb:


> '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
> ...


Wenn Du bei IF die selbe Variable auswerten würdest, die den Rückgabewert der MsgBox auffängt ...

Harald


----------



## Jan (25 September 2010)

Question_mark schrieb:


> Hallo,
> 
> 
> 
> ...


 
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."?


----------



## Jan (25 September 2010)

PN/DP schrieb:


> Wenn Du bei IF die selbe Variable auswerten würdest, die den Rückgabewert der MsgBox auffängt ...
> 
> Harald


 
Das ist ja so banal, da hätte ich ja schon fast selbst drauf kommen müssen. 

Danke, jetzt wird Excel geschlossen.


----------



## Question_mark (25 September 2010)

*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


----------



## Jan (25 September 2010)

Nein, das hat er mir nicht erklärt.

Ja, da liegst du völlig richtig.

Der von mir eingestellte Code, ist mein erster eigener.


----------



## Thomas_v2.1 (25 September 2010)

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

```
Option Explicit
```
hin.
Das zwingt einen dazu alle Variablen vorher deklarieren zu müssen.


----------



## Jan (25 September 2010)

Thomas_v2.1 schrieb:


> 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
> 
> ```
> Option Explicit
> ...


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


----------



## Question_mark (26 September 2010)

*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 ) 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


----------



## Question_mark (26 September 2010)

*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


----------



## Question_mark (26 September 2010)

*DIM ist das Zauberwort*

Hallo,



			
				Jan schrieb:
			
		

> Wie würde das z. B. aussehen?



Ich bin eigentlich zu faul, das ganze hier zu tippen, das haben andere schon vor mir gemacht.

http://msdn.microsoft.com/de-de/library/7ee5a7s1%28VS.80%29.aspx

Gruß

Question_mark


----------



## Thomas_v2.1 (26 September 2010)

Question_mark schrieb:


> Diese Option sollte es in keiner Programmiersprache (Ok, VBA mit einer Programmiersprache zu vergleichen ist etwas gewagt ) 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.


----------



## Question_mark (26 September 2010)

*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


----------



## Jan (26 September 2010)

@ 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.


----------



## PN/DP (26 September 2010)

*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*
> ...


Ich würde statt Me.Save die im Beispiel angegebene Schreibweise ActiveWorkbook.Save benutzen.

Harald


----------

