Problem mit CommandButton und UserForm in Excel

Hallo!
Wenn ich die UserForm über einen in einem Tabellenblatt eingebetteten CommandButton aufrufe und dort auf der UserForm den „Schließen“-Button betätige, bekomme ich die Fehlermeldung Objektvariable nicht definiert, Laufzeitfehler 91 an der ersten Stelle im Makro „Dialogaufrufen“, in der die UserForm angesprochen wird. Kann mir jemand bei dem folgenden code helfen? Danke!
Dies ist der Code der Userform:

Private Sub CommandButton1_Click()

’ Übergabe der Daten in das Formular
On Error Resume Next
Worksheets(„Inhaltsverzeichnis“).Range(„Mandant“).Value = txtMandant.Value

Worksheets(„Inhaltsverzeichnis“).Range(„Mandantnr“).Value = txtMandantnr.Value

Worksheets(„Inhaltsverzeichnis“).Range(„Bearbeiter“).Value = txtBearbeiter.Value
Worksheets(„Inhaltsverzeichnis“).Range(„Jahresabschluss“).Value = txtJahresabschluss.Value
usf_Daten.Hide

End Sub

Private Sub CommandButton2_Click()
’ Leeren der einzelnen Felder bei Anklicken des „Eingaben verwerfen“-Buttons (CommandButton2).
txtMandant.Value = „“
txtMandantnr.Value = „“
txtBearbeiter.Value = „“
txtJahresabschluss.Value = „“

Worksheets(„Inhaltsverzeichnis“).Range(„Mandant“).Value = txtMandant.Value
Worksheets(„Inhaltsverzeichnis“).Range(„Mandantnr“).Value = txtMandantnr.Value
Worksheets(„Inhaltsverzeichnis“).Range(„Bearbeiter“).Value = txtBearbeiter.Value
Worksheets(„Inhaltsverzeichnis“).Range(„Jahresabschluss“).Value = txtJahresabschluss.Value

End Sub

Private Sub CommandButton3_Click()
usf_Daten.Hide ’ Call UserForm_Click ’ Aufruf der Prozedur und damit verbergen des Formulars.
End Sub

Private Sub Label1_Click()

End Sub

Private Sub Label3_Click()

End Sub

Private Sub UserForm_Initialize()
Load usf_Daten 'Die Maske für die Eingabe der persönlichen Daten wird geladen.
usf_Daten.Show 'und hiermit angezeigt.
End Sub

’ Dies ist das Click-Ereignis für Formular und verbirgt es wieder.
Private Sub UserForm_Click()
usf_Daten.Hide
End Sub

Und dies der Code für die im Tabellenblatt „Inhaltsverzeichnis“ eingefügten Button:

Private Sub CommandButton1_Click()
DialogAufrufen
End Sub

Und dies das Makro für den Dialog:

Sub DialogAufrufen()

Dim Mandant As String
Dim Mandantnr As String
Dim Jahresabschluss As String
Dim Bearbeiter As String

'Bildschirmaktualisierung ausschalten
Application.ScreenUpdating = False
'Alle Änderungen sollen sich auf das Fenster beziehen, von dem aus der Dialog
'gestartet wurde: Definition des Startfensters (öffentliche Variable)

StartFenster = ActiveSheet.Name

’ Vorhandene Einträge auslesen
Mandant = Worksheets(„Inhaltsverzeichnis“).Range(„Mandant“).Value
Mandantnr = Worksheets(„Inhaltsverzeichnis“).Range(„Mandantnr“).Value
Jahresabschluss = Worksheets(„Inhaltsverzeichnis“).Range(„Jahresabschluss“).Value
Bearbeiter = Worksheets(„Inhaltsverzeichnis“).Range(„Bearbeiter“).Value

'Einträge in Dialogfelder schreiben
usf_Daten.txtMandant.Value = Mandant
usf_Daten.txtMandantnr.Value = Mandantnr
usf_Daten.txtJahresabschluss.Value = Jahresabschluss
usf_Daten.txtBearbeiter.Value = Bearbeiter

'Dialog einblenden
usf_Daten.Show

Application.ScreenUpdating = True

End Sub

Wenn ich die UserForm über einen in einem Tabellenblatt
eingebetteten CommandButton aufrufe und dort auf der UserForm
den „Schließen“-Button betätige, bekomme ich die Fehlermeldung
Objektvariable nicht definiert, Laufzeitfehler 91 an der
ersten Stelle im Makro „Dialogaufrufen“, in der die UserForm
angesprochen wird. Kann mir jemand bei dem folgenden code
helfen? Danke!

In welchen Modulen steht denn da was, wie ersichtlich kann ja nicht alles in einem Modul stehen.
Hilft vielleicht:
worksheets(1).usf_Daten.txtMandant.Value = Mandant
Gruß
Reinhard

Hallo Claudia.

Mir sind noch ein, zwei Sachen unklar:

  1. Du blendest das UserForm immer mir Hide aus. Ist das so gewollt? Mit Hide wird das UserForm tatsächlich nur unsichtbar gemacht, es behält aber alle Werte.

  2. Du verwendest das Ereignis UserForm_Initialize , in dem Code zum Laden und zum Anzeigen des UserForm ausgeführt wird. Das ist aber eingentlich überflüssig, da Du ja schon in der Prozedur DialogAufrufen schreibst : usf_Daten.Show
    Diese Anweisung sorgt ja bereits dafür, daß das UserForm angezeigt wird.
    Und : durch die Zuweisung usf_Daten.txtMandant.Value = Mandant sprichst Du das UserForm schon vorher an, wodurch es automatisch geladen wird.
    Für nur diesen Zweck brauchst Du das Ereignis UserForm_Initialize nicht, es sei denn, Du hast nicht den kompletten Code gepostet und in dieser Prozedur wird noch mehr Code abgehandelt.

  3. Du verwendest das Ereignis UserForm_Click zum Verstecken des UserForm. Ist das so gewollt? Denn Du verwendest ja auch CommandButton3 zum Verstecken des UserForm.

Wenn Du möchtest, kannst Du ja mal den folgenden Code ausprobieren:

  1. Code für den CommandButton1 auf dem Tabellenblatt unverändert

    Private Sub CommandButton1_Click()
    DialogAufrufen
    End Sub

  2. Code für die Prozedur DialogAufrufen ein wenig anders

    Sub DialogAufrufen()
    Dim Form As New usf_Daten
    Form.Show
    Set Form = Nothing
    End Sub

  3. Code im Deklarationsbereich des UserForm

    Private Abbruch as Boolean
    Private Mandant As String
    Private Mandantnr As String
    Private Jahresabschluss As String
    Private Bearbeiter As String

  4. Code für das Ereignis UserForm_Initialize ein wenig anders

    Private Sub UserForm_Initialize()
    'Vorhandene Einträge auslesen
    Mandant = Worksheets(„Inhaltsverzeichnis“).Range(„Mandant“).Value
    Mandantnr = Worksheets(„Inhaltsverzeichnis“).Range(„Mandantnr“).Value
    Jahresabschluss = Worksheets(„Inhaltsverzeichnis“).Range(„Jahresabschluss“).Value
    Bearbeiter = Worksheets(„Inhaltsverzeichnis“).Range(„Bearbeiter“).Value
    'Einträge in Textfelder schreiben
    txtMandant.Value = Mandant
    txtMandantnr.Value = Mandantnr
    txtJahresabschluss.Value = Jahresabschluss
    txtBearbeiter.Value = Bearbeiter
    End Sub

  5. Code für CommandButton1 auf dem UserForm ein wenig anders

    Private Sub CommandButton1_Click()
    Unload Me
    End Sub

  6. Code für CommandButton3 auf dem UserForm ein wenig anders

    Private Sub CommandButton3_Click()
    Abbruch = True
    Unload Me
    End Sub

  7. Code einfügen für das Ereignis UserForm_QueryClose

    Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    If Abbruch = True Then Exit Sub
    Mandant = txtMandant.Text
    Mandantnr = txtMandantnr.Text
    Bearbeiter = txtBearbeiter.Text
    Jahresabschluss = txtJahresabschluss.Text
    Worksheets(„Inhaltsverzeichnis“).Range(„Mandant“).Value = Mandant
    Worksheets(„Inhaltsverzeichnis“).Range(„Mandantnr“).Value = Mandantnr
    Worksheets(„Inhaltsverzeichnis“).Range(„Bearbeiter“).Value = Bearbeiter
    Worksheets(„Inhaltsverzeichnis“).Range(„Jahresabschluss“).Value = Jahresabschluss
    End Sub

  8. Code für den CommandButton2 auf dem UserForm kann unverändert beibehalten werden.

Es gäbe dann noch die Möglichkeit, den Umweg über die Prozedur DialogAufrufen zu sparen und stattdessen die Anweisungen dieser Prozedur direkt in das Klick-Ereignis des Tabellenblatt-CommandButtons zu schreiben.
Weiterhin könnte man die Variablen noch einsparen und die Werte direkt aus den Textfelden in die Tabelle schreiben
Soweit erstmal. Vielleicht ist ja damit schon die Fehlermeldung erledigt.

Viele Grüße
Carsten

Hallo Reinhard,

sorry, ja ist etwas durcheinander gegangen, ist allerdings - soweit ich das kapiere - nur der Code für die UserForm, das Modul DialogAufrufen und im Sheet „Inhaltsverzeichnis“ der CommandButton1.
Danke für die Hilfe!
Ich hab den Befehl unten ausprobiert, leider hats nichts geholfen.

In welchen Modulen steht denn da was, wie ersichtlich kann ja
nicht alles in einem Modul stehen.
Hilft vielleicht:
worksheets(1).usf_Daten.txtMandant.Value = Mandant
Gruß
Reinhard

Woowww, toll, womit hab ich soviel Hilfe verdient?? 10000 Dank, das probier ich jetzt mal aus und meld mich gleich wieder!
Claudia

Hallo Claudia.

Mir sind noch ein, zwei Sachen unklar:

  1. Du blendest das UserForm immer mir Hide aus. Ist das
    so gewollt? Mit Hide wird das UserForm tatsächlich nur
    unsichtbar gemacht, es behält aber alle Werte.

Ja, es soll alle Werte behalten bzw. die alten sogar aus den jeweiligen Zellen auslesen.

  1. Du verwendest das Ereignis UserForm_Initialize , in
    dem Code zum Laden und zum Anzeigen des UserForm ausgeführt
    wird. Das ist aber eingentlich überflüssig, da Du ja schon in
    der Prozedur DialogAufrufen schreibst :
    usf_Daten.Show
    Diese Anweisung sorgt ja bereits dafür, daß das UserForm
    angezeigt wird.

Gut…Danke.

Und : durch die Zuweisung usf_Daten.txtMandant.Value =
Mandant
sprichst Du das UserForm schon vorher an, wodurch
es automatisch geladen wird.

Brauch ich es dann gar nicht mehr zu laden?

Für nur diesen Zweck brauchst Du das Ereignis
UserForm_Initialize nicht, es sei denn, Du hast nicht
den kompletten Code gepostet und in dieser Prozedur wird noch
mehr Code abgehandelt.

Doch es ist der komplette Code, das reicht mir auch :wink:) nein Scherz beiseite, wahrscheinlich ist er etwas wirr…

  1. Du verwendest das Ereignis UserForm_Click zum
    Verstecken des UserForm. Ist das so gewollt? Denn Du
    verwendest ja auch CommandButton3 zum Verstecken des UserForm.

Das ist wohl irgendwie doppelt gemopplet, nicht wahr?

10000 Dank, hab ich ausprobiert und er steigt mir direkt in dem DialogAufrufen aus.
tja… schade!!

Wenn Du möchtest, kannst Du ja mal den folgenden Code
ausprobieren:

  1. Code für den CommandButton1 auf dem Tabellenblatt
    unverändert

Private Sub CommandButton1_Click()
DialogAufrufen
End Sub

  1. Code für die Prozedur DialogAufrufen
    ein wenig anders

Da steigt er mir schon aus: doppelt definiert, sagt er mir…:

Sub DialogAufrufen()


> Dim Form As New usf\_Daten  
> Form.Show  
> Set Form = Nothing  
> End Sub

Herzliche Grüße zurück
Claudia

sorry, ja ist etwas durcheinander gegangen, ist allerdings -
soweit ich das kapiere - nur der Code für die UserForm, das
Modul DialogAufrufen und im Sheet „Inhaltsverzeichnis“ der
CommandButton1.

Hi Claudia,
dezimiere die Datenmenge auf so 10 zeilen, ggfs anonymisiere sie, dann lade das mal bei http://www.badongo.com o.ä. hoch und poste den Link.
Gruß
Reinhard

Hallo Claudia.

10000 Dank, hab ich ausprobiert und er steigt mir direkt in
dem DialogAufrufen aus.
tja… schade!!

Willst Du etwa schon aufgeben? :wink: Bei mir funktioniert der Code einwandfrei.

Da steigt er mir schon aus: doppelt definiert, sagt er mir…:

Sub DialogAufrufen()

Dim Form As New usf_Daten
Form.Show
Set Form = Nothing
End Sub

Wie lautet denn der Text der Fehlermeldung genau?

Viele Grüße
Carsten