Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
1856to1860
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
VBA Userform macht ungewollt neue Mapp
10.11.2021 15:33:24
Justin
Guten Tag an die Profis,
ich beschäftige mich schon seit geraumer Zeit mit einer Programmierung eines umfangreichen Produktes, das diverse Dinge auf verschiedenen Tabellenblättern machen soll.
In Kurzform habe ich in dem Workbook 18 Reiter, die auch über Buttons ein und ausgeblendet werden können.
Bei einer vorherigen Version funktionierte das gleich beschriebene noch einwandfrei, doch nun wird immer ungewollt eine neue Mappe erstellt und Buttons und Zellbreiten werden auf der ursprünglichen Datei komplett verändert und verzogen!
Kurz zur Thematik:
Ich starte über einen Button "Konfigurator" eine Userform. Diese besitzt eine Multipage mit a) Maschinenkarte und b) Angebot, wo man verschiedene Druck- oder Speicheroptionen auswählen kann. Wenn ich die Seite "Angebot" wähle und alle möglichen Optionen auswähle und dann über den "Weiter"-CommandButton die Aktion starte, dann klappt alles einwandfrei.
Bei der Seite "Maschinenkarte" allerdings kann ich noch alles in der Userform auswählen und ändern, wenn ich dann aber auf den "Weiter"-CommandButtion klicke, dann lässt er mich noch den Dateinamen angeben und den Speicherort auswählen, aber dann passiert oben beschriebenes. Eine neue "Mappe1" mit den dort ausgewählten 5 Reitern wird erstellt und die anderen Reiter sind weg. Wie kann sowas passieren? Wo ist der Bug im Code?
Hier dazu mein Code von dem Weiter-Button:

Private Sub cmdWeiter_Click() 'Aktionen bei Click auf Weiter
Dim Inhalt As String
Dim i As Integer
Application.ScreenUpdating = False 'Bildschirmaktualisierung ausschalten
Select Case True
Case Me.mpgAuswahl.Value = 0 'Auswahl des Reiters Maschinenkarte in Multipage
If Worksheets(2).Visible = True Then 'Nur weitermachen, wenn alle Blätter der Maschinenkarte eingeblendet sind!
'Mindestens eine Druckoption muss angewählt sein
If Not (Me.optDrucken.Value Or Me.optPDF.Value Or Me.optDruckenMitPDF.Value) = True Then
MsgBox "Bitte wenigstens eine Druckoption wählen!" & Chr(13) & _
"Entscheidung zwischen PDF speichern, Drucken oder beides!", vbCritical, "Auswahl setzen" 'Ohne eine Auswahl geht es nicht!
Exit Sub
Else
'Zuerst soll nach Auswahl eines Optionsfeldes und der Checkboxen (min. eines und min. eine) der Array gefüllt werden
Call ArrayFüllen_chkMaschinenkarte 'Abrufen der angeklickten Checkboxes
'Prüfen, ob Druckbereich über anwählen von Checkbox geschehen ist, sonst Sub verlassen
If Join(Drucksammlung, "") = "" Then
MsgBox "Das geht nicht, bitte mindestens einen Haken im Druckbereich setzen!", vbCritical, "Was soll gedruckt oder gespeichert werden?" 'Prüfen, ob VariableBlätter leer, Eingabe erforderlich
Exit Sub 'mindestens eine Eingabe ist erforderlich
End If
'Fallunterscheidung, je nach Auswahl des Optionsbuttons
Select Case True
Case Me.optDrucken.Value
Call Maschinenkarte_NurDrucken
Case Me.optPDF.Value
Call Maschinenkarte_NurPDF
Case Me.optDruckenMitPDF.Value
Call Maschinenkarte_PDFundDrucken
End Select
End If
Else: MsgBox "So wird nur das Deckblatt abgebildet! Bitte alle Reiter der Maschinenkarte einblenden!", vbCritical, "Fehler bei Fortsetzung"
Exit Sub
End If
Case Me.mpgAuswahl.Value = 1 'Auswahl des Reiters Angebot in Multipage
If (Worksheets(12).Visible = True And UFDrucken.tgbSprachen.Value = True) _
Or (Worksheets(17).Visible = True And UFDrucken.tgbSprachen.Value = False) Then 'Nur weitermachen, wenn alle Blätter des deutschen oder des englischen Angebotes eingeblendet sind!
'Mindestens eine Angebotserstellung muss angewählt sein
If Not (Me.optDruckenMitSpeichernAngebot.Value Or Me.optNurDruckenAngebot.Value Or Me.optNurPDFAngebot.Value) = True Then
MsgBox "Bitte wenigstens eine Angebotserstellung wählen!" & Chr(13) & _
"Entscheidung zwischen PDF speichern, drucken oder beides!", vbCritical, "Auswahl erforderlich" 'Ohne eine Auswahl geht es nicht!
Exit Sub
Else
Call StandardAusblenden 'Abrufen des Status des ToggleButtons - Standardbeschreibungen eingeblendet oder ausgeblendet
Call LeereZeilenAusblenden 'Ausblenden aller leeren Zeilen, die die Optionscheckboxen erzeugen
Call KopfUndFuß 'Abrufen des Status des Druckpapiers und des Wunsches auf Kopf- und Fußzeile
'Zuerst soll nach Auswahl eines Optionsfeldes und der Checkboxen (min. eines und min. eine) der Array gefüllt werden
Call ArrayFüllen_chkAngebot 'Abrufen der angeklickten Checkboxes für Druckblätter
If Join(Drucksammlung2, "") = "" Then
MsgBox "Das geht nicht, bitte mindestens einen Haken im Druckbereich setzen!", vbCritical, "Was soll gedruckt oder gespeichert werden?" 'Prüfen, ob VariableBlätter leer, Eingabe erforderlich
Exit Sub 'mindestens eine Eingabe ist erforderlich
End If
'Fallunterscheidung, je nach Auswahl des Optionsbuttons
Select Case True
Case Me.optDruckenMitSpeichernAngebot.Value
Call Angebot_PDFundDrucken
Case Me.optNurDruckenAngebot.Value
Call Angebot_NurDrucken
Case Me.optNurPDFAngebot.Value
Call Angebot_NurPDF
End Select
End If
Else: MsgBox "So wird nichts abgebildet! Bitte alle Reiter des entsprechenden Angebotes (deutsch/ englisch) einblenden!", vbCritical, "Fehler bei Fortsetzung"
Exit Sub
End If
Select Case True 'ist das Blatt schon gesperrt?
Case Worksheets(12).ProtectContents 'Blatt 12 (deutsch) ist noch gesperrt - dann wurde englisch ausgewählt und muss gesperrt werden
'Optionen Blattschutz reaktivieren, wenn ausgeschaltet, weil leere Zeilen gelöscht wurden
If Worksheets(17).ProtectContents = True Then 'Wenn Schutz auf AEBestellumfang aktiviert ist, entsperren, sonst nicht (da kein Schutz vorhanden)
Worksheets(17).Unprotect ActiveWorkbook.Sheets("Passwort").Cells(1, 1)
End If
Worksheets(17).Rows.Hidden = False 'Ausgeblendete Zeilen auf Blatt "AEBestellumfang" wieder einblenden
Worksheets(17).Protect ActiveWorkbook.Sheets(Passwortblatt).Cells(1, 1) 'Blattschutz des Bestellumfangs englisch wieder aktivieren
Case Else 'Blatt 12 (deutsch) ist nicht mehr gesperrt - Blattschutz des Bestellumfangs deutsch wieder aktivieren
'Blattschutz reaktivieren, damit niemand etwas ungewollt ändern kann
'Optionen Blattschutz reaktivieren, wenn ausgeschaltet, weile leere Zeilen gelöscht wurden
If Worksheets(12).ProtectContents = True Then 'Wenn Schutz auf ADBestellumfang aktiviert ist, entsperren, sonst nicht (da kein Schutz vorhanden)
Worksheets(12).Unprotect ActiveWorkbook.Sheets("Passwort").Cells(1, 1)
End If
Worksheets(12).Rows.Hidden = False 'Ausgeblendete Zeilen auf Blatt "ADBestellumfang" wieder einblenden
Worksheets(12).Protect ActiveWorkbook.Sheets(Passwortblatt).Cells(1, 1)
End Select
End Select
Application.Cursor = xlNorthwestArrow
Worksheets(1).Select
Application.ScreenUpdating = True 'Bildschirmaktualisierung wieder einschalten
Unload Me
End Sub

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA Userform macht ungewollt neue Mapp
10.11.2021 17:15:44
onur
So ein Code funktioniert nicht ohne die Datei und lässt sich dadurch auch nicht testen oder komplett analysieren.
AW: VBA Userform macht ungewollt neue Mapp
10.11.2021 20:00:47
ralf_b
Hallo,
du programmierst sowas und kannst aber nicht feststellen, mittels debugging, wo die neue Mappe erstellt wird? Is klar. Zur Info. Es ist in dem Code nicht ersichtlich wo die Mappe erstellt wird. Grund: Die vielen Subs, die da aufgerufen werden, hast du für dich behalten.
Setze Haltepunkte in deinem Code und finde heraus in welcher Sub die Mappe erstellt wird. Dort findest du auch den Grund.
AW: VBA Userform macht ungewollt neue Mapp
10.11.2021 20:02:15
onur
Wieso schreibst du mir das?
damit du es liest. lach owt
10.11.2021 20:10:46
ralf_b
AW: damit du es liest. lach owt
10.11.2021 20:11:33
onur
Verstehe. :)
nee, war natürlich ein Versehen. owt
10.11.2021 20:12:40
ralf_b
AW: damit du es liest. lach owt
11.11.2021 07:26:20
Justin
Hallo, das ist natürlich ein berechtigter Einwand:
Hier die einzelnen Prozeduren.

Public Sub ArrayFüllen_chkMaschinenkarte()
'Ein Array deklarieren mit i Einträgen (Index maximal von 0 bis 4, minimal 0)
Dim Anzahl As Long
VariableBlätter = ""
'** Festlegen, welche Tabellenblätter gedruckt werden sollen, nur die mit Haken
If UFDrucken.chkDeckblatt.Value = True Then
VariableBlätter = Worksheets(1).Name & ";" 'Deckblatt einfügen
With Worksheets(1).PageSetup
.Orientation = xlPortrait 'Hochformat einstellen (=1)
.PrintArea = "$A$1:$H$70"
.Zoom = False
.FitToPagesWide = 1
.FitToPagesTall = False
.RightHeader = ""
.LeftHeader = ""
.CenterHeader = ""
.RightFooter = ""
.LeftFooter = ""
.CenterFooter = ""
End With
End If
If UFDrucken.chkTermine.Value = True Then
VariableBlätter = VariableBlätter & Worksheets(2).Name & ";" ' Termine einfügen
With Sheets(2).PageSetup
.Orientation = 1 'Hochformat einstellen
.Zoom = False
.FitToPagesWide = 1
.FitToPagesTall = 1
End With
End If
If UFDrucken.chkStandard.Value = True Then
VariableBlätter = VariableBlätter & Worksheets(3).Name & ";" 'Standardbaugruppen einfügen
Select Case True
Case Sheets(3).Columns("D").EntireColumn.Hidden 'Standard eingekürzt ohne Erklärungen
With Sheets(3).PageSetup
.Orientation = 1 'Hochformat einstellen
.PrintArea = "$A$1:$G$44"
.Zoom = False
.FitToPagesWide = 1
.FitToPagesTall = False
End With
Case Else   'Standard nicht eingekürzt, also mit Erklärungen
With Sheets(3).PageSetup
.Orientation = 2 'Querformat einstellen
.PrintArea = "$A$1:$G$44"
.Zoom = False
.FitToPagesWide = 1
.FitToPagesTall = False
End With
End Select
End If
If UFDrucken.chkOptionen.Value = True Then
VariableBlätter = VariableBlätter & Worksheets(4).Name & ";"  'Optionsbaugruppen einfügen
Select Case True
Case Sheets(4).Columns("D").EntireColumn.Hidden 'Optionen eingekürzt ohne Erklärungen
With Sheets(4).PageSetup
.Orientation = 1 'Hochformat einstellen
.PrintArea = "$A$1:$G$40"
.Zoom = False
.FitToPagesWide = 1
.FitToPagesTall = False
End With
Case Else   'Optionen nicht eingekürzt, also mit Erklärungen
With Sheets(4).PageSetup
.Orientation = 2 'Querformat einstellen
.PrintArea = "$A$1:$G$40"
.Zoom = False
.FitToPagesWide = 1
.FitToPagesTall = False
End With
End Select
End If
If UFDrucken.chkTypenschild.Value = True Then
VariableBlätter = VariableBlätter & Worksheets(5).Name & ";" 'Typenschild einfügen
With Sheets(5).PageSetup
.Orientation = 1 'Hochformat einstellen
.Zoom = False
.FitToPagesWide = 1
.FitToPagesTall = 1
End With
End If
If VariableBlätter = "" Then
Drucksammlung = Split(VariableBlätter, ";") 'Split-Funktion macht aus der String-Variablen 'VariableBlätter' einen 1D-Array
Else
Anzahl = Len(VariableBlätter) 'Bestimmung der Länge des Strings
VariableBlätter = Left(VariableBlätter, Anzahl - 1) 'Löschen des letzten Semikolons
Drucksammlung = Split(VariableBlätter, ";") 'Split-Funktion macht aus der String-Variablen 'VariableBlätter' einen 1D-Array
End If
End Sub

Public Sub Maschinenkarte_PDFundDrucken()
Dim SpeicherName As String
Dim Speicherpfad As String
'PDF erstellen, Speicherort auswählen und abspeichern, PDF öffnen und über den Viewer drucken
On Error GoTo Fehler
'Speichername und SpeicherPfad angeben, wo normalerweise gespeichert wird
SpeicherName = InputBox("Wie soll die Datei heißen?", "Speichername angeben", "MaschinenkarteXY")
If SpeicherName = "" Then
MsgBox "Kein Name zum Speichern angegeben", vbCritical, "Konfigurator wird jetzt geschlossen"
Exit Sub
End If
'Abfrage des Speicherpfades --> Speichern unter
If MsgBox(prompt:="Möchtest du die Maschinenkarte nun speichern?", Buttons:=vbYesNo _
+ vbQuestion, Title:="Speichern?") = vbNo Then Exit Sub
Speicherpfad = Application.GetSaveAsFilename( _
InitialFileName:="O:\" & SpeicherName, _
FileFilter:="PDF-Datei (*.pdf),*.pdf", _
Title:="Speicherpfad auswählen oder eingeben")
'Übertragung des gewünschten Speichernamens, des gewünschten Dateiformates und Titel des Fensters
Sheets(Drucksammlung).Copy
'hier werden nur die ausgewählten Checkbox-Elemente
MsgBox "Drucken bitte über den PDF-Viewer starten!", vbOKOnly + vbExclamation, "Druckauftrag einleiten"
With ActiveWorkbook
.ExportAsFixedFormat Type:=xlTypePDF, FileName:=SpeicherName, Quality:=xlQualityStandard, _
IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=True
.Close SaveChanges:=False
End With
Exit Sub
Fehler:
MsgBox "Da ist wohl was schief gelaufen (Prozedur Maschinenkarte_PDFundDrucken)", vbInformation
End Sub


Public Sub Maschinenkarte_PDFundDrucken()
Dim SpeicherName As String
Dim Speicherpfad As String
'PDF erstellen, Speicherort auswählen und abspeichern, PDF öffnen und über den Viewer drucken
On Error GoTo Fehler
'Speichername und SpeicherPfad angeben, wo normalerweise gespeichert wird
SpeicherName = InputBox("Wie soll die Datei heißen?", "Speichername angeben", "MaschinenkarteXY")
If SpeicherName = "" Then
MsgBox "Kein Name zum Speichern angegeben", vbCritical, "Konfigurator wird jetzt geschlossen"
Exit Sub
End If
'Abfrage des Speicherpfades --> Speichern unter
If MsgBox(prompt:="Möchtest du die Maschinenkarte nun speichern?", Buttons:=vbYesNo _
+ vbQuestion, Title:="Speichern?") = vbNo Then Exit Sub
Speicherpfad = Application.GetSaveAsFilename( _
InitialFileName:="O:\" & SpeicherName, _
FileFilter:="PDF-Datei (*.pdf),*.pdf", _
Title:="Speicherpfad auswählen oder eingeben")
'Übertragung des gewünschten Speichernamens, des gewünschten Dateiformates und Titel des Fensters
Sheets(Drucksammlung).Copy
'hier werden nur die ausgewählten Checkbox-Elemente
MsgBox "Drucken bitte über den PDF-Viewer starten!", vbOKOnly + vbExclamation, "Druckauftrag einleiten"
With ActiveWorkbook
.ExportAsFixedFormat Type:=xlTypePDF, FileName:=SpeicherName, Quality:=xlQualityStandard, _
IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=True
.Close SaveChanges:=False
End With
Exit Sub
Fehler:
MsgBox "Da ist wohl was schief gelaufen (Prozedur Maschinenkarte_PDFundDrucken)", vbInformation
End Sub


Public Sub Maschinenkarte_NurDrucken()
Dim Anzahl As Integer
Dim Druck As String
'Datei soll nur gedruckt werden (mit oder ohne Druckvorschau)
On Error GoTo Fehler
'Wie oft soll Drucksammlung gedruckt werden
Anzahl = CInt(UFDrucken.txtAnzahl.Value) 'Überführt Eingabewert in Integer-Wert
'Mit oder ohne Druckvorschau?
Select Case True
Case UFDrucken.opt_DruckvorschauAus.Value 'Ohne Druckvorschau
'Druckbereich festlegen:
MsgBox "Keine Druckvorschau, es wird gedruckt!", vbInformation, "Drucken in progress"
Sheets(Drucksammlung).PrintOut Copies:=Anzahl, ActivePrinter:=UFDrucken.lbxDruckerauswahl.Value
Case UFDrucken.opt_DruckvorschauEin.Value 'Mit Druckvorschau
'Druckbereich festlegen:
UFDrucken.Hide
Sheets(Drucksammlung).PrintPreview
MsgBox "Bei Betätigung des Druckersymbols wird gerade gedruckt." & Chr(13) & _
"Bei Betätigung des X-Symbols wähle:", vbInformation, "Abfrage nach Druckvorschau"
Druck = MsgBox("Tatsächlich (nochmals) drucken?", vbYesNoCancel, "Druckvorgang starten")
UFDrucken.Show
If Druck = vbYes Then
Sheets(Drucksammlung).PrintOut Copies:=Anzahl, ActivePrinter:=UFDrucken.lbxDruckerauswahl.Value
ElseIf Druck = vbNo Then
MsgBox "Druckvorgang abgebrochen"
ElseIf Druck = vbCancel Then
'ausgeblendete Zeilen wieder einblenden:
Rows.Hidden = False
Exit Sub
End If
End Select
Unload UFDrucken
Exit Sub
Fehler:
MsgBox "Da hat sich wohl ein Fehler beim Drucken eingeschlichen, bitte die entsprechenden Blätter einblenden!"
End Sub

Public Sub Maschinenkarte_NurPDF()
Dim SpeicherName As String
Dim Speicherpfad As String
'PDF erstellen, Speicherort auswählen und abspeichern
On Error GoTo Fehler
'Speichername und SpeicherPfad angeben, wo normalerweise gespeichert wird
SpeicherName = InputBox("Wie soll die Datei heißen?", "Speichername angeben", "MaschinenkarteXY")
If SpeicherName = "" Then
MsgBox "Kein Name zum Speichern angegeben", vbCritical, "Konfigurator wird jetzt geschlossen"
Exit Sub
End If
'Abfrage des Speicherpfades --> Speichern unter
If MsgBox(prompt:="Möchtest du die Maschinenkarte nun speichern?", Buttons:=vbYesNo _
+ vbQuestion, Title:="Speichern?") = vbNo Then Exit Sub
Speicherpfad = Application.GetSaveAsFilename( _
InitialFileName:="O:\" & SpeicherName, _
FileFilter:="PDF-Datei (*.pdf),*.pdf", _
Title:="Speicherpfad auswählen oder eingeben")
'Übertragung des gewünschten Speichernamens, des gewünschten Dateiformates und Titel des Fensters
Sheets(Drucksammlung).Copy
'hier befinden sich nur noch die ausgewählten Checkbox-Elemente
With ActiveWorkbook
.ExportAsFixedFormat Type:=xlTypePDF, FileName:=SpeicherName, Quality:=xlQualityStandard, _
IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=False 'PDF nicht öffnen
.Close SaveChanges:=False
End With
Exit Sub
Fehler:
MsgBox "Da hat wohl was nicht ganz bei der PDF-Erstellung funktioniert", vbInformation
End Sub
Auf die Prozeduren StandardAusblenden, LeereZeilenAusblenden oder KopfUndFuß oder ArrayFüllen_chkAngebot brauchen wir nicht zu schauen, denn dieser Pfad der Case-Verzweigung funktioniert einwandfrei.
Ich probiere das nochmal mit dem Haltepunkt setzen, aber ansonsten bin ich im Fehler suchen leider nicht der begabteste!
Über eure Mithilfe wäre ich sehr dankbar.
Grüße Justin
Anzeige
back to Topic
11.11.2021 18:27:11
ralf_b
Hallo,
hier wird die Mappe erstellt. weil du kein Ziel für die kopierten Blätter angegebenen hast, landen die in einer neuen Datei.

Sheets(Drucksammlung).Copy
Diese wird zur aktiven Mappe. Diese hat erstmal noch keinen Speicherpfad.
Nun soll eine pdf erzeugt werden. als Dateiname wird SpeicherName genutzt. Das ist aber nur ein Dateiname und kein vollständiger Pfad. Somit wird die Datei im aktuellen Ordner der aktuellen Datei (Ohne Speicherpfad ) erstellt. Da stimmt was nicht. Hab es aber nicht nachgebaut. Den vollständigen Pfad in der Variable Speicherpfad nutzt du aber gar nicht. Der wird auch gar nicht auf Gültigkeit geprüft.
so, das war mein Senf
gruß
rb
Anzeige
AW: back to Topic
12.11.2021 07:56:32
Justin
Guten Morgen Ralf,
danke dir für deine Erklärungen.
Ja genau, das Copy soll eine temporäre Datei erstellen, in der die benutzerdefinierten Blätter zum Drucken zusammengefasst werden, daraus dann eine PDF-Datei erstellen und dieses Aktive Workbook dann anschließend wieder schließen ohne zu Speichern.
Jetzt ist aber dank deiner Anmerkung der Groschen gefallen! Denn hier wird natürlich jetzt das Deckblatt aktiviert und dort wird auf einen Reiter verwiesen, der außerhalb dieser temporären Mappen ist. Dadurch blockiert die Ausführung und die neue Mappe wird sichtbar, obwohl sie das bisher nie wurde!
Ich habe jetzt eine If-Else-Abfrage vor das Activate-Ereignis auf dem Deckblatt gelegt, jetzt funzt es wieder.
Ich danke euch für eure konstruktive Mithilfe und wünsche allen ein schönes Wochenende.
Anzeige

301 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige