2016-12-09 1 views
2

Je tente de créer un frontal simple pour une base de données en créant un formulaire utilisateur via VBA dans Excel. Le formulaire est multipage. Lorsque je travaillais sur la première page, et que j'ouvrais le formulaire utilisateur avec UserForm1.Show vbModeless, je n'ai eu aucun problème. La deuxième page était présente, ne contenait rien. Pour l'arrière-plan, la première page est un endroit pour entrer des informations à insérer dans la base de données, la seconde va être une page pour éditer ces champs et mettre à jour un enregistrement. Maintenant que j'ai commencé à créer la deuxième page, lorsque j'essaie de lancer le formulaire utilisateur en utilisant UserForm1.Show vbModeless, l'erreur suivante s'affiche. Tout ce que chaque page contient est un tas d'étiquettes avec chacune une zone de texte ou une zone de liste déroulante correspondante.Erreur d'exécution '3704' avec formulaire utilisateur multipage

Run-time error '3704'

Operation is not allowed when the object is closed.

Comment puis-je ouvrir ceci afin de le montrer?

Le code étant appelé à ouvrir le UserForm est:

Option Explicit 

Sub Show_Form() 
UserForm1.Show vbModeless 
End Sub 

Le code initialize est:

Private Sub UserForm_Initialize() 
Dim conn As New ADODB.Connection 
Dim rst As New ADODB.Recordset 
Dim strSQL As String, NextAM As String 

With conn 
    .Provider = "SQLOLEDB" 
    .ConnectionString = "DATA SOURCE = server;Initial Catalog=database;INTEGRATED SECURITY=sspi;" 
    .Open 
End With 

strSQL = "SELECT MAX(RIGHT(AM_Ref,6)) + 1 FROM AM" 

rst.Open strSQL, conn 

With ThisWorkbook 
    If Len(rst(0)) = 3 Then 
     .Sheets("Lists").Range("Next_AM") = "AM_000" & rst(0) 
    ElseIf Len(rst(0)) = 4 Then 
     .Sheets("Lists").Range("Next_AM") = "AM_00" & rst(0) 
    ElseIf Len(rst(0)) = 5 Then 
     .Sheets("Lists").Range("Next_AM") = "AM_0" & rst(0) 
    End If 

    Me.AM_Ref.Text = .Sheets("Lists").Range("Next_AM").Value2 
End With 

rst.Close 
Set rst = Nothing 
conn.Close 
Set conn = Nothing 


With Me 
    .StartUpPosition = 0 
    .Left = Application.Left + (0.5 * Application.Width) - (0.5 * .Width) 
    .Top = Application.Top + (0.5 * Application.Height) - (0.5 * .Height) 
End With 

End Sub 

S'il vous plaît noter, la sous initialize est la même que celle qu'elle était auparavant. Si j'ai été peu clair du tout (probablement) s'il vous plaît faites le moi savoir et je peux clarifier.

À la votre!

+1

votre problème est que vous fermez le premier/conn –

+0

Façon de me faire sentir stupide @DougCoats! Mais merci beaucoup pour la réponse rapide. Pourquoi cela cause-t-il le problème? – Kyle

+0

bien si la connexion est close et l'ensemble d'enregistrements est fermé, alors vous ne pouvez rien faire avec les enregistrements –

Répondre

-1

Couple solutions rapides et vous devriez être hors et le fonctionnement:

1) Changer Private Sub UserForm_Initialize() à Public Sub UserForm_Initialize()

2) Dans le maître sous quand vous voulez lancer UserForm utiliser les éléments suivants:

Public Sub MasterSub() 
    Dim UserForm as UserForm1 
    .... code ..... 
    'Now ready to use the UserForm: 
    Set UserForm = New UserForm1 
    'UserForm will already be initialized and ready to be shown if you did not include that in your initialize sub 
    UserForm.Show 
End Sub 

Espérons que cela aide, TheSilkCode