2008-12-26 10 views
5

J'essaie de programmer un module Excel où il insère dynamiquement du code dans de nouveaux objets dans un formulaire créé au moment du design.McAfee supprime le code du module VBA

J'utilise ce code où "Code" contient une chaîne avec le code réel qui devrait aller dans l'objet DstrFiles.

Dim DstrFiles As Object 
Set DstrFiles = ThisWorkbook.VBProject.VBComponents("DistributeFiles") 

With DstrFiles.CodeModule 
    .InsertLines .CountOfLines + 1, Code 
End With 

Mon problème est que quand je les utilise .InsertLines, McAfee supprime le code entier de mon module, est-il un moyen de contourner cela?

D'abord, je crée l'étiquette avec:

Form1.Controls.Add("Forms.Label.1", "Label1", True) 

Puis-je utiliser le .InsertLines pour créer un code pour aller avec l'étiquette. Par exemple, je veux que la couleur de fond de l'étiquette devienne rouge quand quelqu'un clique dessus. Cela a été très facile à accomplir avec ".InsertLines".

Une manière laide de contourner ce problème consiste simplement à créer un tas de code à l'avance qui est prêt en arrière-plan, puis à limiter la quantité d'étiquettes qui peuvent être créées à la volée. - J'espère que ça ne viendra pas à ça.

Je suis allé googeling, et cela semble être un problème connu avec McAfee.

Est-ce que quelqu'un connaît un moyen de créer un formulaire utilisateur dynamique qui peut ajouter du code à de nouvelles étiquettes ou de nouveaux boutons ajoutés avec la méthode Contrls.Add?

+0

Il ya une discussion ici qui peut aider: http://www.vbforums.com/showthread.php?t=358444 – Fionnuala

Répondre

7

Vous ne devez pas générer de nouvelles étiquettes en écrivant du code qui crée les contrôles.

Vous devez utiliser la méthode .Add de la collection Controls pour créer de nouvelles étiquettes.

Par exemple:

UserForm1.Controls.Add("Forms.Label.1", "foo", True) 

Vous pouvez utiliser WithEvents pour obtenir les événements.

Par exemple, dans UserForm1,

Public WithEvents a As MSForms.Label 

Private Sub a_Click() 

    MsgBox "label clicked" 

End Sub 

Private Sub CommandButton1_Click() 

    Set a = UserForm1.Controls.Add("Forms.Label.1", "foo", True) 
    a.Visible = True 
    a.Caption = "Hi There" 

End Sub 

Si vous voulez faire un tableau dynamique des contrôles nouvellement ajoutés, vous devrez créer une petite classe wrapper. Sample code for that is here.

+0

Ce n'est pas vraiment assez pour moi. J'ai besoin de code pour accompagner l'étiquette.Quelque chose devrait se produire lorsque vous cliquez sur l'étiquette. – Christian

+0

J'ai ajouté un exemple montrant comment faire cela –

+0

@Christian: Joel Spolsky a inventé la fonctionnalité VBA/Macro pour Excel :) http://www.joelonsoftware.com/items/2007/04/25.html –

1

Si possible, je recommande de ne pas générer de code de façon dynamique (ça sent comme un programme auto-modifiable?).

C'est peut-être difficile à dire sans connaître votre problème spécifique, mais je parie qu'il existe une meilleure solution en utilisant une fonction avec les paramètres nécessaires.

1

Vous pourriez être en mesure de contourner cette version de McAfee. Mais la prochaine version des fichiers de données, ou un autre bloqueur de logiciels malveillants pourrait vous bloquer de toute façon.

Vous pouvez donc créer un code comme celui-ci pour l'exécuter sur votre machine de développement, mais il ne fonctionnera jamais (ou seulement temporairement) lorsqu'il sera distribué aux clients.

Questions connexes