Comprendre le VBA

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.

Merci de votre aide.

mistral

vba project

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

Module de classe = laisse tomber pour l'instant !

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 ...

Rechercher des sujets similaires à "comprendre vba"