Création d'une application : Les diviseurs

Nous allons, pour cet exemple imaginer une petite application qui va s'intégrer à Excel, et qui va nous permettre de calculer les diviseurs d'un nombre. Avant d'aller plus loin, il est nécessaire de bien comprendre le fonctionnement de la recherche des diviseurs d'un nombre. Aussi, avant d'aller plus loin, rafraîchissez-vous la mémoire avec cette page de programmation en Word.

Maintenant, le tout est de transformer ce programme de base :

Sub DiviseurOptimise()
  Dim QuelNombre As Long
  Dim Ctr As Long
  QuelNombre = Val(InputBox("Quel nombre voulez-vous analyser ?"))
  For Ctr = 2 To QuelNombre / 2
    If QuelNombre Mod Ctr = 0 Then
      MsgBox Ctr & " est diviseur de " & QuelNombre
    End If
  Next Ctr
End Sub

Qui n'est pas très convivial, avouons-le, en véritable application Excel. En effet, nous ne pouvons pas simplement transformer ce programme en fonction personnalisée de type Function ChercheDiviseur(), puisque nous ne recherchons pas un seul résultat à mettre dans une seule cellule, mais bien toute une colonne de longueur variable de résultats.

Nous allons lui ajouter un menu dans le menu Outils :
Et, quand on clique sur "Chercher les diviseurs", on a carrément une boîte de dialogue personnalisée, comme ceci :

Dans cette boîte de dialogue, nous avons 2 zones sélecteur de référence , sous 2 étiquettes ("Ou se trouve le nombre à analyser" et "Ou placer les diviseurs") , et un bouton OK. La bôite de dialogue est elle même titrée (Détermination des diviseurs). Donc, quand tout sera fini, nous pourrons donner l'exemple suivant :

  1. Cliquez dans A1
  2. Ecrivez 1000
  3. Faites Outils/Options/Chercher les diviseurs
  4. Cliquez dans la zone "Ou se trouve le nombre à analyser", et cliquez sur A1
  5. Cliquez dans la zone "Ou placer les diviseurs", et cliquez sur B1
    Voici le résultat de la boîte de dialogue :
  6. Cliquez sur OK

C'est tout. Si tout s'est bien passé, vous devriez obtenir ceci :

A
B
1
1000 2
2
  4
3
  5
4
  8
5
  10
6
  20
7
  25
8
  40
9
  50
10
  100
11
  125
12
  200
13
  250
14
  500

On commence

Création de la boîte de dialogue en elle-même

  1. Quittez Excel et revenez dans Excel
  2. Allez dans l'environnement VBA
    Nous allons tout placer dans Perso.XLS, histoire que vous ayez toujours accès à cette nouvelle fonctionnalité
  3. Cliquez sur le petit + de VBA Project (Perso.XLS)
  4. Cliquez avec le bouton droit sur VBA Project (Perso.XLS), et sélectionnez Insertion/UserForm
    Ca fait apparaître cette feuille :
    Et cette boîte à outils :
    Et ces propriétés :
  5. Dans la feuille des propriétés, définissez Name = FeuilleDiviseur, et Caption = Détermination des diviseurs
  6. Placez les 2 sélecteurs de références , les deux étiquettes et le bouton OK dans cette feuille, er redimensionnez le tout à la main pour avoir quelque chose qui ressemble à ceci

    (Pour écrire les textes, c'est la propriété Caption de la feuille des propriétés qui doit être changée)

  7. Cliquez sur le sélecteur de références du haut, et dans la feuille des propriétés, donnez lui le Name = REDNombre
    RED est simplement les initiales de Reference zone d'EDition (mais on aurait pu appeler cette zone ChouFleur, çaurait été bien aussi...)
  8. le sélecteur de références du bas doit avoir le Name = REDDestination
  9. Le bouton OK soit s'appeler Name = BDCOK
    BDC = Bouton De Commande

A ce stade, "L'interface Utilisateur est terminée". Reste maintenant à savoir comment faire pour faire fonctionner tout ça !

Appel de la boîte de dialogue personnalisée

Nous allons commencer créer la commande "Chercher les diviseurs", du menu Outils. Juste avant ça, il faut que nous créions une petite macro qui se contente d'afficher notre boîte de dialogue personnalisée dont le nom est, je le rappelle, "FeuilleDiviseur".

Création du code appelant la feuille

  1. Allez dans l'environnement VBA
  2. Cliquez avec le bouton droit sur VBA Project (Perso.XLS), et sélectionnez Insertion/Module
  3. Cliquez sur le Module1 qui vient d'apparaître, et dans les propriétés du bas, définissez le Name = Diviseur
  4. Cliquez 2 fois sur ce module Diviseur pour faire apparaître la page d'édition sur la droite, et mettez-y cette procédure :
    Sub AffichageFeuille()
      FeuilleDiviseur.Show
    End Sub
    Vous aurez sans doute deviné que FeuilleDiviseur.Show est la ligne de code qui "Montre" (Affiche) votre boîte de dialogue FeuilleDiviseur

Création du sous-menu, et affectation de la macro

  1. Quittez l'environnement VBA pour revenir dans Excel
  2. Faites Affichage/Barres d'outils/Personnaliser, onglet Commandes
  3. Chechez Macros, et cliquez dessus
  4. Dans la partie de droite, cliquez sur "Elément de menu personnalisé", faites le glisser sur le menu Outils (de Excel), NE LACHEZ PAS LA SOURIS, glissez jusque tout en bas du menu Outils, et lâchez la souris, pour avoir ceci

    Nous allons maintenant "Attacher" (Affecter) la macro AffichageFeuille à cette commande de menu
  5. Cliquez avec le bouton droit sur "Chercher les diviseurs", et choisissez "Affecter une macro"
  6. Choisissez Perso.XLS!AffichageFeuille
  7. Cliquez sur OK
  8. Cliquez sur Fermer

Voilà. C'est terminez. Testez :

  1. Faites Outils/Options/Chercher les diviseurs
  2. Cliquez dans la zone "Ou se trouve le nombre à analyser", et cliquez sur A1
  3. Cliquez dans la zone "Ou placer les diviseurs", et cliquez sur B1
    Voici le résultat de la boîte de dialogue :

Si vous cliquez sur OK, il ne se passe rien (La boîte de dialogue ne se ferme même pas). C'est normal, on ne lui a encore rien demandé. Pour l'instant, on peut juste constater que les zones se remplissent correctement quand on clique dans les différentes cellules de votre feuille de calcul.

Création du code à proprement parler

C'est maintenant, justement à l'appui de cette touche OK que le miracle va devoir se produire : Le programme doit extraire le nombre inscrit dans la zone Feuil1!$A$1 (puisque c'est ce qu'on a choisi), et renvoyer les diviseurs du nombre qui s'y trouve dans la cellule Feuil1!$B$1 (puisque c'est là qu'on les veut), et les cellules plus bas (B2, B3, B4, etc. si nécessaire)

  1. Allez dans l'environnement VBA
  2. Cliquez 2 fois sur FeuilleDiviseur dans l'explorateur de projets, pour faire apparaître votre boîte de dialogue en mode création
  3. Cliquez 2 fois sur le bouton OK
    Vous devriez arriver dans une nouvelle feuille avec le code suivant :
    Private Sub BDCOK_Click()

    End Sub
  4. Copiez le code suivant qui est le code définitif de calcul des diviseurs, et de leur bon placement :

Private Sub BDCOK_Click()
  Dim Ctr, Ctr2
  Ctr2 = 0
  For Ctr = 2 To Range(REDNombre) / 2
    If Range(REDNombre) Mod Ctr = 0 Then
      Ctr2 = Ctr2 + 1
      Range(REDDestination).Offset(Ctr2 - 1, 0) = Ctr
    End If
  Next
  FeuilleDiviseur.Hide
End Sub

Range(REDNombre) doit vous rappeler Range("G41") par exemple. Simplement, ce n'est pas une référence de type G41 ou A89, mais c'est la référence qui se trouve dans le sélecteur de référence REDNombre ("Ou se trouve le nombre à analyser"). Dans notre cas, ce sera Feuil1!$A$1

Donc la ligne For Ctr = 2 To Range(REDNombre) / 2 puut se traduire en quelque sorte par For Ctr = 2 jusqu'à le contenu de Range (Feuil1!$A$1) - QUi est sensée contenir un nombre (1000 par exemple)

If Range(REDNombre) Mod Ctr = 0 Then : Si ce contenu Range(Feuil1!$A$1), donc toujours 1000, donc si 1000 MOD Ctr = 0, Ctr est donc un diviseur de 1000. Bingo !. Qu'est ce qu'on fait dans ce cas là, et bien on augmente la valeur de Ctr2 (qui va augmenter vraiment moins vite que Ctr, puisque Ctr2 n'augmente de 1 que lorsque on tombe sur un diviseur), et donc :

Range(REDDestination).Offset(Ctr2 - 1, 0) = Ctr : On met la valeur de Ctr (le diviseur correct donc) dans la destination Range(REDDestination). Qu'est ce que c'est REDDestination ? et bien, c'est comme REDNombre : C'est la référence qu'on a donné en cliquant dans cette zone, et en sélectionnant B1 (par exemple). Donc dans notre exemple, REDDestination est égale à Feui1!$B$1, et Range(REDDestination) est égale AU CONTENU de Feul1!$B$1.

Et le Offset (je rappelle que Offset signifie Déplacement), permet d'écrire les différents diviseurs les uns en dessous des autres. Si Ctr2 vaut 5 (Nous serions donc au 5ème diviseur de notre nombre), et bien Range(REDDestination).Offset(5, 0) signifierait un déplacement de 5 cellules plus bas que REDDestination !

Et tout à la fin, c'est facile, FeuilleDiviseur.Hide demande à cacher la boîte de dialogue personnalisée. Nous n'en avons plus besoin.

C'est fini ! OUF ! Vous pouvez tester, ça marche. Le mode d'emploi ? tout en début de page, cherchez "Donc, quand tout sera fini, nous pourrons donner l'exemple suivant"