VBA de Nombreux boutons pointent vers le même _Click sous
J'ai un tas de zone de texte-Bouton paires sur un formulaire. Lorsque le bouton est cliqué, je veux insérer la valeur de la zone de texte dans une base de données. Le nom des zones de texte et les Boutons de suivre un standard de nommage, par exemple Value1Tb - Value1Cmd et Value2Tb - Value2Cmd.
Mon problème est que depuis que j'ai envie de faire de même pour chaque bouton, je voudrais que la possibilité d'écrire un Sous genre:
Private Sub AnyButton_Click(sender As CommandButton)
Dim tb As TextBox
Set tb = GetTBByName(s.Name)
PutValueToDatabase(s.Name,tb.Text)
End Sub
Mais je ne peux pas trouver un moyen de le point le Clic-événement d'un Bouton à un autre sous que la norme Name_Click()
.
Quelqu'un connais un moyen de contourner cela, qui n'implique pas de m'écrire 50 différents Name_Click()
subs?
- Qu'est-ce que vous avez créé une classe personnalisée pour lier le bouton (withevents) et de la zone de texte paires, y compris un retour d'appel dans l'exposé gestionnaire d'événements de bouton, puis faites une routine d'initialisation d'une collection de ces objets personnalisés en étendant les contrôles de formulaire, puis mettre un public de routine dans un module standard pour recevoir l'appel-dos, quel que soit le contexte dont vous avez besoin. Cela fonctionnerait-il? Les rappels sont mieux que des événements parce que vous n'avez pas besoin des talons de vous y abonner.
Vous devez vous connecter pour publier un commentaire.
Si vous êtes OK pour utiliser les Contrôles de Formulaire plutôt que ActiveX, comme il semble que vous pouvez être à l'heure actuelle, alors que Chris solution semble bonne.
Toutefois, si vous avez besoin d'ActiveX boutons de commande, alors vous êtes dans l'impossibilité (comme l'VBA compilateur vous diront que "la Procédure de déclaration ne correspond pas à...") pour avoir des paramètres dans la fonction de rappel pour l'événement de clic, et vous êtes incapable de soulever le cas de plusieurs objets, bien que vous ne le sais bien sûr que le bouton qui a déclenché l'événement (puisque le rapport est de 1 bouton de commande = 1 Sub).
Donc... je voudrais aller avec quelque chose comme:
Nécessite un stub pour chaque bouton, de sorte que certains de copier et de coller au départ, mais ensuite facile à entretenir etc ... comme tous les _Click les rappels d'événement sont pointant vers la même méthode...
Edit:
E. g.
Il semble que ce que vous voulez est d'obtenir le nom de l'cliqué sur le bouton. Si vous êtes à la création de boutons comme ceci:
(où le 'je' incrémente dans une boucle)
et puis la définition d'un générique de "private sub btnSub()" pour tous les boutons, vous pouvez au moins obtenir le nom du bouton qui a été cliqué à l'aide de l'Application.De l'appelant. Quelque chose comme:
Espère que cela aide!
J'ai cette même situation, et je n'ai qu'un événement click pour chaque bouton, qui est un wrapper pour la fonction, je tiens à appeler. Cela vous permet aussi de passer de la feuille de paramètres spécifiques si vous en avez besoin.
Exemple:
J'ai décidé de faire de cette question une réponse parce que je suis en train de faire quelque chose de similaire et je confirme que cela fonctionne.
Vous pouvez stocker la
OLEobjects
dans unCollection
, de taille arbitraire, contenantCustom Class
Objets qui incluent la OLEobjects et des associations et les événements que vous avez besoin. Ainsi, vous pouvez éviter toute code talons.Custom Class
pour lier le Bouton et la zone de texte paires.WithEvents
.Public
de routine dans unStandard Module
à l'initialisation d'unCollection
de cesCustom Class
objets en étendant les Contrôles de Formulaire. Vous pouvez également l'utiliser pourAdd
le contrôle par programmation comme une 'reconstruction' option. La Collection peut être à l'intérieur d'un autre Module de Classe avec toutes les routines de gestion, mais il doit être Instancié et chargé dans unStandard Module
.Que vous devez garder à l'esprit que le Module de la Forme est de recompiler à chaque fois que vous ajoutez un contrôle, vous devez donc faire attention où vous mettez votre code.
Ma demande a le contrôle, directement sur la Feuille de calcul de Surface, donc je ne peux pas mettre la Classe de Collection, ou de la source de toute initialisation de la Collecte à partir de la Feuille de module. Cela reviendrait à soi modification de code, et il broie excel à l'arrêt.
J'ai rêvé cette idée à travers sanguinaire de l'idéalisme (pas forcément une bonne chose), mais, bien sûr, je n'étais pas le premier à penser à elle comme vous pouvez le voir ici. @Tim Williams explique dans sa réponse. Vous pouvez également google VBA Tableau de Contrôle des Événements de voir de nombreux exemples similaires, y compris un excellent l'article par @SiddharthRout. En ligne avec le VB6 analogie, il utilise un
Array
au lieu d'unCollection
pour obtenir le même résultat.Je vais essayer de poster un peu de code plus tard. Ma demande est un peu différent, donc il faudra beaucoup de travail pour l'alléger, mais le principe est le même.
L'autre chose à garder à l'esprit est que VBE vraiment luttes avec ce genre de chose, donc ne vous inquiétez pas si il se charge de vous les processeurs. Une fois que vous re-démarrer avec visual basic editor, tout ira bien.
Je viens de publier (Open Source), la Événement Centralizer pour MSForms.
Citation: "L'Événement Centralizer pour MSForms est VBA un outil de programmation qui permet toutes sortes d'personnalisée de regroupement lors de l'écriture des gestionnaires pour les événements qui se produisent dans les UserForms.
Avec l'Événement Centralizer pour MSForms, il est facile par exemple d'avoir toutes les zones de texte réagissent de la même manière lors de l'Entrée d'événement se produit, ou toutes, sauf une, ou seulement ceux avec notamment un Tag de valeur.
Grâce à ses journaux d'événements système, l'Événement Centralizer pour MSForms est un puissant outil d'apprentissage et de débogage de l'aide."
Je ne peux pas expliquer ici comment il fonctionne. J'ai essayé de le faire sur le site.
Définir l'événement à
=FunctionName(parameter)
.Un peu de retard, mais cela peut aider quelqu'un d'autre:
Si vous avez une fonction appelée
OpenDocumentById(docID as integer)
, puis chaque contrôle de l'appel de la fonction aurait dans les cas suivants:cmd1 est Sur Cliquez sur l'événement:
cmd2 est Sur Cliquez sur l'événement:
etc...