Petit exercice en VBA (Table Multiplication dynamique)


#1

Bonjour à tous,
Afin de vous occuper un petit peu sur le forum,
ce petit exercice à réaliser entièrement en VBA

Instruction dans le classeur
Table de multiplication dynamique.xlsx (10,6 Ko)

Celui ou celle qui aura fini en premier avec une macro fonctionnelle, aura toute ma gratitude :wink:

Au boulot


#2

Salut @Mimimathy, :wink:

Je viens de télécharger le fichier:

C’est intéressant comme “Petit exercice en VBA” et merci d’avance pour toute ta gratitude pour celui / celle qui aura fini en premier.

Mais à défaut de la vitesse d’exécution de l’exercice et donc de la récompense au vainqueur :trophy: Je ne sais même pas par ou commencer.

A part qu’il faudra mettre le code VBA dans la feuille et commencer l’instruction par:

Private Sub Worksheet_Change(ByVal Target As Range)

Et je vois que ça ne se bouscule pas au portillon, alors quelques indices sur la façon de procéder ne serait pas de trop, en tout cas pour moi :roll_eyes:

Cdlt.


#3

Re @Mimimathy,

Alors pour les privés de VBA comme moi :tired_face:

Voici une proposition de résultat dans le fichier joint :stuck_out_tongue_winking_eye:

Table de multiplication dynamique V1.xlsm (11,2 Ko)

Alors, alors… J’ai gagné, j’ai gagné :trophy: :1st_place_medal: :joy::rofl::upside_down_face:

@+


#4

Salut MDO

Ah, le début est bon pour le VBA

Mais ton classeur présente des formules :-1:

De plus si je veux une table avec des Ré-pets à + de 21, y a pas :rofl:

Puni des p’tits suisses pendant 2 jours :wink:

Aucune formule n’est tolérée et en principe sur 7/8 lignes la macro est construite
sans liste déroulante

Petite aide, déclarer des variables qui seront le multiplicateur et le Nb d’éxécution (répétition)
une fois cela fait une simple boucle, sans oublier de supprimer les anciennes données

A la réponse

Alors, alors… J’ai gagné, j’ai gagné :trophy: :1st_place_medal: :joy::rofl::upside_down_face:

NIET :face_with_raised_eyebrow:


#5

Salut @Mimimathy, :wink:

Bon je n’avance pas :rage: Voila ou j’en suis:

Private Sub Worksheet_Change(ByVal Target As Range)

  Dim Dl$, Table%, Rep%
  Dl = Range("C" & Rows.Count).End(xlUp).Row
    

End Sub

Et je ne sais pas comment avancer plus !

@+


#6

Salut MDO
C’est un bon début, avec une petite erreur dans la variable Dl.
tu as mis un $ (qui remplace “As String” pour chaine de caractère, or Dl représentera la Dernière ligne je suppose, vu que tu l’a déclaré

Ensuite, pour les 2 autres variables déclarées, il te faut maintenant les initialiser avec les données des cellules respectives, soit Range(“B3”) ou cells(3,2) et Range(“E3”) ou cells(3,5)

Ceci étant fait, dans une boucle For … Next pour boucler sur le nombre de répétition, on introduit la formule pour effectuer le résultat dans la colonne C à partir de C5 jusqu’à C et Nb Rep

tu y es presque :wink:


#7

Re @Mimimathy,

Oui, j’ai mis Dl avec $ car il me s’emblait que le résultat était du texte.
Tu veux 1 x 2 = 2 etc… ou seulement le résultat soit 2 etc…

Je vais tenter à tête reposée de continuer avec tes conseils.

@+


#8

Re,
cette ligne
Dl = Range("C" & Rows.Count).End(xlUp).Row
te renseigne sur le N° de la dernière ligne de la colonne C qui n’est pas vide et pourra d’aider à effacer les lignes allant de la ligne 5 à la dernière

Pour avancer plus vite, tu n’est pas obliger de mettre directement
Private Sub Worksheet_Change(ByVal Target As Range) tu le met en commentaire avec un apostrophe au début et tu met Sub Test() par exemple.
Cela permet en cliquant sur la petite flèche verte dans le ruban de lancer la macro
ou
en étant sur une ligne de la macro, tu cliques sur la touche F8, cela te fait avancer le code en pas à pas

En plus, pour surveiller les résultats, tu sélectionne par exemple: Dl et clic droit --> Ajouter un espion et valider par OK
tu auras un menu sur le bas qui te donnera le résultat en temps réel dés que tu auras passé par F8 dessus
ou
autre solution
mettre après Dl par exemple, la ligne
Msgbox Dl

La macro s’arrêtera et te donnera le résultat de la Dl

Pour info, une manière de vérifier si l’écriture est correcte, et de taper tout en minuscule, les fonctions se mettront en bleu et les variables prendrons les majuscule attribuées comme déclarées après passage à la ligne


#9

@Mimimathy,

Je n’avance plus, voila ce que j’ai fais:

Private Sub Worksheet_Change(ByVal Target As Range)
'Pour mémoire ==> Dl = dernière ligne; Table = B3; Rep = E3
Dim Dl%, Table%, Rep%

If Not Application.Intersect(Target, Range("B3")) Is Nothing Then
    Table = Cells(3, 2)
    Rep = Cells(3, 5)
    Dl = Cells(6, 3)
    
    Cells(5, 3) = Table * Table / Table
    Cells(6, 3) = Cells(5, 3) * Table
    
End If
End Sub

Mais c’est loin du compte, si je puis dire :flushed:


#10

Re,

Ca vient doucement,

petit coup de pouce

Private Sub Worksheet_Change(ByVal Target As Range)
'Pour mémoire ==> Dl = dernière ligne; Table = B3; Rep = E3
Dim Dl%, Table%, Rep%

If Not Application.Intersect(Target, Range("B3")) Is Nothing Then
    Table = Cells(3, 2)
    Rep = Cells(3, 5)
    Dl = Range("C" & Rows.Count).End(xlUp).Row
    
    Cells(5, 3) = 1 & " x " & Table & " = " & 1 * Table
    Cells(6, 3) = 2 & " x " & Table & " = " & 2 * Table
    Cells(7, 3) = 3 & " x " & Table & " = " & 3 * Table
    
    Cells(Rep, 3) = Rep & " x " & Table & " = " & Rep * Table
    
End If
End Sub


#11

Re,
Coup de pouce de plus sur le code

Private Sub Worksheet_Change(ByVal Target As Range)
'Pour mémoire ==> Dl = dernière ligne; Table = B3; Rep = E3
Dim Dl%, Table%, Rep%

If Not Application.Intersect(Target, Range("B3")) Is Nothing Then
    Table = Cells(3, 2)
    Rep = Cells(3, 5)
    Dl = Range("C" & Rows.Count).End(xlUp).Row
    
  '  Cells(5, 3) = 1 & " x " & Table & " = " & 1 * Table
  '  Cells(6, 3) = 2 & " x " & Table & " = " & 2 * Table
  '  Cells(7, 3) = 3 & " x " & Table & " = " & 3 * Table
  
  
 ' ici on place une boucle **FOR Rep = 1  to  Rep**  pour que la multiplication commence à 1 jusqu'à valeur de REP
 
 
 For Rep =  to   'à déclarer
 
 
'dans cette cellule de réception **Cells(Rep, 3)** la formule ira se copier en C1 or je la désire en C5, donc j'ajoute 4 à Rep, soit Cells(Rep+4, 3)


    Cells(Rep, 3) = Rep & " x " & Table & " = " & Rep * Table
    
 Next Rep
   ' ici on place **Next Rep**  pour que la boucle fasse le tour de 1 à Rep
End If
End Sub

#12

@Mimimathy,

Regarde, ça commence a bien fonctionner, même si je n’ais pas su encore comment me servir de Dl pour effacer jusqu’à la dernière ligne.

Private Sub Worksheet_Change(ByVal Target As Range)

'Pour mémoire ==> Dl = dernière ligne; Table = B3; Rep = E3
Dim Dl%, Table%, Rep%, i%

If Not Application.Intersect(Target, Range("B3,E3")) Is Nothing Then
  Range("C5:C65000").ClearContents
    Table = Cells(3, 2)
    Rep = Cells(3, 5)
    Dl = Range("C" & Rows.Count).End(xlUp).Row
    
 ' ici on place une boucle **FOR Rep = 1  to  Rep**  pour que la multiplication commence ? 1 jusqu'? valeur de REP
 For Rep = 1 To Rep  'à déclarer
 
    Cells(Rep + 4, 3) = Rep & " x " & Table & " = " & Rep * Table
  
'dans cette cellule de réception **Cells(Rep, 3)** la formule ira se copier en C1 or je la désire en C5, donc j'ajoute 4 à Rep, soit Cells(Rep+4, 3)
    
 Next Rep
   ' ici on place **Next Rep**  pour que la boucle fasse le tour de 1 ? Rep
End If
End Sub

@+


#13

Re,

Encore un p’tit effort

Private Sub Worksheet_Change(ByVal Target As Range)
Dim Dl%, Table%, Rep%, i%
  If Not Application.Intersect(Target, Range("B3,E3")) Is Nothing Then
  'Range("C5:C65000").ClearContents
    Table = Cells(3, 2)
    Rep = Cells(3, 5)
    
 '*************************************************
 '*  Dans cette partie, il y a une astuce à faire *
    Dl = Range("C" & Rows.Count).End(xlUp).Row
    Range("C5:C65000").ClearContents
 '*************************************************
    For Rep = 1 To Rep
       Cells(Rep + 4, 3) = Rep & " x " & Table & " = " & Rep * Table
    Next Rep
  End If
End Sub


#14

@Mimimathy,

Ne donne pas la solution de suite et merci pour le téléguidage pas à pas, mais je reprendrai demain, la journée a été difficile (levé à 3h). :fearful:

@+


#15

Bonjour Mimimathy

svp je n’ai pas saisie le +4 dans le code suivant
Cells(Rep + 4, 3) = Rep & " x " & Table & " = " & Rep * Table

pourquoi + 4
vraiment vous expliquez très bien les lignes de code, je suis débutant et je comprend bien ce que vous avez fait, a part le + 4 ??!

Merci a vous et a mdo100


#16

Bonsoir sadi58

Si tu as compris le système de la boucle for Rep = 1 to Rep
qui veut dire en partant de 1 pour boucler à Rep (qui vaut le Nb de répétition)

j’ai demandé que le résultat soit à partir de C5 soit la ligne 5
au départ Rep vaut 1, je rajoute 4, cela vaut 5 (ligne 5)
la boucle suivante Rep vaut 2 , je rajoute 4, cela vaut 6 (ligne 6)
etc, jusqu’à Rep = Rep dans la boucle + 4


#17

Bonsoir Mimimathy

Bien saisi un grand Merci

au faites si vous patienté un peux pour donner la réponse, car on essaye sinon !!!

Merci encore


#18

Re,

Pas de soucis,
J’avais donné un “coup de pouce” voyant que personne ne répondait aux appels pour montrer un peu le début de la macro
Car il ne faut pas avoir honte de montrer ses débuts, le but est de vous remettre dans le droit chemin et que la ou les erreurs vous soient bénéfiques pour la suite,

car il y aura des suites de plus en plus compliquées afin de pouvoir me "passer au-dessus ":wink:


#19

Bonjour @Mimimathy, :wink:

Bon, je n’arrive pas a effacer la colonne selon la valeur en “E3”

Au lieu de l’instruction:
Range("C5:C65000").ClearContents

J’ai mis:
Dl = Range("C" & Rows.Count).End(xlUp).ClearContents

Mais ça me supprime ligne par ligne, jusqu’à la valeur en “E3”, je suppose qu’il faudrait une autre boucle mais jusqu’à la valeur “E3”

J’ai donc essayé:

 For Rep = Dl To 1

       Dl = Range("C" & Rows.Count).End(xlUp).ClearContents

 Next Dl

Mais ça me bloque tout.

Et je n’ais pas trouvé l’astuce dont tu parles

 '*************************************************
 '*  Dans cette partie, il y a une astuce à faire *
    Dl = Range("C" & Rows.Count).End(xlUp).Row
    Range("C5:C65000").ClearContents
 '*************************************************

J’ai vu ton 2ème Exercice, il me parait très difficile, on verra après.

Cdlt.

PS: Tu rigoles là :sunglasses:


#20

SaluT MDO

j’ai précisé
'*************************************************
'* Dans cette partie, il y a une astuce à faire *
Dl = Range(“C” & Rows.Count).End(xlUp).Row
Range(“C5:C65000”).ClearContents
'*************************************************

Dl signifie la dernière ligne non vide de la colonne C
Range(“C5:C65000”) signifie la plage allant de C5 à C65000

pourquoi aller à 65000 alors que la dernière ligne est DL