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
:
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 |
Placez les 2 sélecteurs de références (Pour écrire les textes, c'est la propriété Caption de la feuille des propriétés qui doit être changée) |
![]() |
A ce stade, "L'interface Utilisateur est terminée". Reste maintenant à savoir comment faire pour faire fonctionner tout ça !
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".
Voilà. C'est terminez. Testez :
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.
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)
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"