Hallo zusammen,
ich habe gerade damit begonnen mich mit VBA zu beschäftigen und bin auf mein erstes kleinere Problem gestoßen, dass ich bisher nicht selbst oder mit google lösen konnte. Ich glaube zwar den Grund zu kennen warum das Problem verursacht wird, habe aber keine Lösung parat (vll bin ich auch auf dem Holzweg). Daher wäre Hilfe von euch wirklich super :)
Ich habe einer Userform erstellt, über welche der Benutzer vor dem Speichern über ein paar Dinge abgefragt wird (diese werden anschlißend in einem separatem Arbeitsblatt protokolliert). Wenn das Arbeitsball noch nicht existiert wird es angelegt, ansonsten nur die Werte übertragen. Wenn ich nun versuche die Excel Datei zu speichern öffnet sich die Userform, ich kann die Werte eingeben, diese werden übertragen, jedoch kommt es dann zum Laufzeitfehler 400: "Formular wird bereits angezeigt..."
Das ganze leite ich über das Ereigniss Workbook_BeforSave im Bereich der Arbeitsmappe ein. Hier der Code dazu:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
UserForm1.Show
End Sub
Und hier der Code der UserForm:
Private Sub abbrechenButton_Click()
'Eingabefensterschließen
Unload UserForm1
End Sub
Private Sub saveButton1_Click()
Dim strBlattName As String
strBlattName = "Protokollierung"
On Error Resume Next
Worksheets(strBlattName).Activate
If Err.Number <> 0 Then
Err.Clear
MsgBox "Blatt [" & strBlattName & "] nicht vorhanden! Wird automatisch angelegt!"
Worksheets.Add
ActiveSheet.Name = "Protokollierung"
ActiveSheet.Move After:=Sheets(Sheets.Count)
Range("A1:D1").Font.Bold = True
Range("A1:D1").Interior.ColorIndex = 8
Range("A1").Value = "Name"
Range("B1").Value = "Datum"
Range("C1").Value = "Zeit"
Range("D1").Value = "Kommentar"
Columns("D:D").ColumnWidth = 70
Worksheets("Protokollierung").Range("A2") = NameBox1
Worksheets("Protokollierung").Range("B2") = DatumBox1
Worksheets("Protokollierung").Range("C2") = TimeBox1
Worksheets("Protokollierung").Range("D2") = Commend
ThisWorkbook.Save
MsgBox "Änderungen gespeichert und protokolliert."
ThisWorkbook.Close
Else
Worksheets(strBlattName).Activate
Rows("2:2").Select
Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
Range("A3:D3").Select
Selection.Copy
Range("A2:D2").Select
Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
Worksheets("Protokollierung").Range("A2") = NameBox1
Worksheets("Protokollierung").Range("B2") = DatumBox1
Worksheets("Protokollierung").Range("C2") = TimeBox1
Worksheets("Protokollierung").Range("D2") = Commend
ThisWorkbook.Save
MsgBox "Änderungen gespeichert und protokolliert."
ThisWorkbook.Close
End If
End Sub
Private Sub UserForm_Initialize()
'Für Kombofeld Name
With UserForm1.NameBox1
.AddItem "Eberle" 'nullter Begriff
.AddItem "Müller" 'erster Begriff
.AddItem ".."
.AddItem ".."
'.ListIndex = 0 'Sorgt dafür das von Beginn ein Begriff angezeigt wird
End With
UserForm1.DatumBox1.Value = Date
UserForm1.TimeBox1.Value = Time
End Sub
Ich gehe davon aus, dass der Fehler deshalb auftritt, da durch das Klicken des speichern Buttons in der UserForm der Befehl "ThisWorkbook.Save" ausgeführt wird, und diese eben auch ein Ereignis in der Arbeitsmappe darstellt und somit das Programm von vorne gestartet wird.
Gibt es eine Möglichkeit das Ereignis Speichern über den Befehl "ThisWorkbook.Save" in der UserForm aus dem "Private Sub Workbook_BeforeSave" herauszunehmen? Oder eventuell eine ganz andere Lösung?
Würde mich über eure Hilfe sehr freuen. Mit Sicherheit hat mein Code auch noch weitere Schwachstellen und kann optimiert werden, mir geht es aber erstmal drum, dass es überhaupt funktioniert. Vielen Dank und Grüße
Jerome
|