Comprendre le VBA
Bonjour,
Tu pourrais commencer par lire ceci
Nota : Voir également sur ce forum (en haut):
Cours VBA
Sinon pour répondre brièvement à la question Module de classe tu peux oublier encore quelques années...
Sauf cas particulier 99 % des macros doivent être rédigées dans Module1
A+
Bonjour,
Je désirais pouvoir faire quelques petits programmes en VBA.
Mais, ma difficulté est de comprendre la toute première action pour commencer.
Comment comprendre le choix à faire entre le Module le Module de classe ou ThisWorlbook
Voir fichier joint.
Module c'est le cas général, commence donc ici
ThisWorlbook comportera des actions globales événementielles > voir ici un excellent aide-mémoire https://www.excel-pratique.com/fr/vba/evenements_classeur.php
mais n'oublie pas qu'on peut aussi insérer du code
- derrière un userform,
- ou derrière une feuille pour des procédures événementielles concernant ladite feuille > excellent memento ici : https://www.excel-pratique.com/fr/vba/evenements_feuille.php
Bonjour à tous,
Pourquoi rester intimidé inutilement devant les modules de classes?
C'est pas si compliqué que ça!
Un module de classe peut être utilisé pour étendre un même code à plusieurs objets (Textbox, Label, Bouton, ...).
L'intérêt est évident, le code devient plus concis, et ses modifications plus facile.
Prenons un exemple : imaginons qu'un userform serve à faire de la saisie de plusieurs valeurs numériques et qu'on veuille limiter la saisie aux seuls caractères "1234567890" pour les Textbox concernés
1/ Méthode sans module de classe :
Pour limiter la saisie on va écrire dans le code de l'userform :
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If InStr("1234567890", Chr(KeyAscii)) = 0 Then KeyAscii = 0
End Sub
et on va devoir répéter ce même code pour tous les Textbox à saisie numérique (50 fois s'il y en a 50 concernés)
2/ Méthode AVEC module de classe :
* On crée un module de classe "Classe1" par exemple.
Dans ce module, on déclare un objet TextBox générique nommé par exemple Txtbx avec la ligne
Public WithEvents Txtbx As MSForms.TextBox
Pour limiter la saisie de cet objet, on ajoute le code :
Private Sub Txtbx_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If InStr("1234567890", Chr(KeyAscii)) = 0 Then KeyAscii = 0
End Sub
* Il reste maintenant à indiquer quels seront les Textbox qui obéiront à ce code. Pour cela on va les placer dans une "collection" d'objet :
-- dans un module quelconque on crée un objet collection, par exemple :
Public Coll_Usf As Object
-- ensuite dans le code de l'userform, on place les textbox dans la collection :
Private Sub UserForm_Initialize()
Dim Usf_Class As Object, i As Integer
Set Coll_Usf = New Collection ' initialise la variable collection "Coll_Usf"
For i = 1 To 10 ' pour les 10 premiers Textbox de l'userform
Set Usf_Class = New Classe1 ' initialise la variable Usf_Class en tant que "Classe1"
Set Usf_Class.Txtbx = Me.Controls("Textbox" & i) ' indique que le textbox est un objet générique Txtbx
Coll_Usf.Add Usf_Class ' ajoute le nouvel objet Txtbx à la collection
Next i
End Sub
Dans cet exemple les 10 premiers Textbox de l'userform sont concernés, mais il est simple d'inclure les suivants en modifiant simplement le For i = 1 To 10
pour For i = 1 To 50
par exemple, sans autre ajout de code.
Et si on a effectivement 50 Textbox dont il faut limiter la saisie, ça évite de répéter 50 fois le code If InStr("1234567890"...
Donc dès qu'on a plusieurs objets identiques pour lesquels il faut définir un "comportement" identique, le module de classe est adapté.
Pour conclure, les modules de classe, c'est bon, mangez-en!
Pierre
merci
je vais étudier cela ...