"Inclure" dans Excel VBA?

J'ai une forme d'user composée de nombreux sous-systèmes, ce qui est affecté en macro à un button de la feuille de calcul. Lorsque l'user est terminé avec cette forme d'user, ils peuvent appuyer sur un button qui fait que sa visibilité devient fausse et lorsqu'elle est input à nouveau, tout apparaît comme il en a résulté, ce qui a donné lieu à une fonctionnalité de sauvegarde.

Je dois maintenant appliquer cela à plusieurs buttons sur la feuille de calcul et chaque formulaire d'user doit avoir exactement le même code et les mêmes buttons, mais être un formulaire distinct car chaque button individuel requirejs sa propre fonction de sauvegarde. La façon dont je prévoyais de le faire était de copyr le formulaire user existant et de le coller plusieurs fois avec des noms différents, mais si une modification est requirejse, il faudra beaucoup de time pour y parvenir, y a-t-il une méthode telle que "include" qui pourrait utiliser un module de base à partir duquel tout le code est accessible, de sorte que si je devais changer quelque chose, je le fais juste sur ce module et tout le rest des mises à jour via l'inclusion?

MODIFIER:

J'ai maintenant une fonction publique appelée coût () et je reçois une erreur lorsque j'ai utilisé:

Private Sub material_Change() Call costing End Sub 

Vous pouvez avoir plusieurs instances de la même forme. Vous pouvez l'utiliser pour conserver plusieurs sets de valeurs de formulaire

Essaye ça:

Créez votre formulaire, comme d'habitude. On l'appelle MyForm

Créez plusieurs buttons sur votre feuille. Mon exemple utilise des buttons ActiveX, mais les buttons de contrôle de formulaire peuvent également être utilisés. Lancez-les CommandButton1 et CommandButton2

Dans votre module de formulaire, inclure un Terminate Sub, qui inclut ce code

 Private Sub UserForm_Terminate() ' any other code you may need... Unload Me End Sub 

Le but du formulaire pour sauvegarder / masquer le formulaire doit être

 Private Sub btnSaveAndHide_Click() Me.Hide End Sub 

Le code de button de feuille est le suivant

  • Le code est identique pour chaque button (et appelle un commun Sub), et chaque button possède sa propre variable de forme Static .)
  • Le gestionnaire d'erreurs est nécessaire pour traiter le cas où un formulaire est correctement fermé. Dans ce cas, l'instance n'existe plus, mais la variable statique locale n'est pas non plus rien
  • L'exemple montre le formulaire montré comme Modéré, vous pouvez le modifier en Modal si vous le souhaitez.

     Private Sub CommandButton1_Click() Static frm As MyForm ShowMyForm frm End Sub Private Sub CommandButton2_Click() Static frm As MyForm ShowMyForm frm End Sub Private Sub ShowMyForm(frm As MyForm) If frm Is Nothing Then Set frm = New MyForm On Error GoTo EH frm.Show vbModeless Exit Sub EH: If Err.Number = -2147418105 Then On Error GoTo 0 Set frm = Nothing Set frm = New MyForm frm.Show End If On Error GoTo 0 End Sub 

Résultat final: plusieurs copys de la même forme, chacune avec leurs propres valeurs

entrez la description de l'image ici


METTRE À JOUR

En réponse au commentaire Comment accéder aux variables à l'intérieur de chaque formulaire d'user à l'externe

Dans l'exemple ci-dessus, les instances du Form ne peuvent être accessibles que dans les routines du button de command Cliquez sur le gestionnaire de clics, dans le module À partir de celui-ci. Si vous pouvez écrire votre code dans le module de formulaire, aucun changement n'est nécessaire.

Pour rendre les instances du formulaire disponibles ailleurs, considérez la modification de leur déclaration dans la scope du module d'un module standard. Vous pouvez déclarer les déclarer comme, par exemple, des variables individuelles, un tableau (statique ou dynamic), une collection, un dictionary. La meilleure structure dépendra de la façon dont vous souhaitez gérer et accéder à vos instances de formulaire.

Pour eaxample, un tableau statique: code dans un module standard

 Option Explicit Global MyForms(1 To 2) As MyForm 

Mettre à jour le code CommandButton pour

 Private Sub CommandButton1_Click() ShowMyForm Module1.MyForms(1) End Sub Private Sub CommandButton2_Click() ShowMyForm Module1.MyForms(2) End Sub 

Private Sub ShowMyForm(frm As MyForm) pas de changement, identique à précédemment

Le code fonctionne comme précédemment, mais vous pouvez maintenant accéder à la variable globale dans un module standard

 Sub Demo() Dim i As Long For i = LBound(MyForms) To UBound(MyForms) If Not MyForms(i) Is Nothing Then MsgBox "For " & i & " Value = " & MyForms(i).TextBox1.Value End If Next End Sub 

Vous n'avez pas besoin d'un "Inclure" (aucun n'existe dans VBA); tout ce que vous devez faire est de créer un module et de rendre les methods courantes publiques.

Par exemple, si vous créez un module et que vous avez une fonction comme celle-ci:

 Public Function Add(first As Integer, second As Integer) As Integer Add = first + second End Function 

Ensuite, vous pouvez l'accéder comme cela à partir d'un autre module / formulaire / module de class:

 Sub test() MsgBox Add(3, 6) End Sub