Macro conditionnelle au mois pour Excel

  • Initiateur de la discussion Initiateur de la discussion Broch002
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Broch002

XLDnaute Occasionnel
Bonjour,


Je voudrais, par une macro, remplir une cellule "E4" d'un fichier Excel par la valeur de 12 autres cellules correspondantes à des objectifs mensuelles. J'ai plus de 2000 lignes et mettre 2000 formules conditionnelles à 12 variables est trop lourd.
J'ai commencé, mais je bute sur la fonction "si" en VBA.

Exemple Si "F1" = janvier:
Range("E4").Select
Application.CutCopyMode = False
ActiveCell.FormulaR1C1 = "='[Budget Total.xls]Feuil1'!RC[32]"

Exemple Si "F1" = février:
Range("E4").Select
Application.CutCopyMode = False
ActiveCell.FormulaR1C1 = "='[Budget Total.xls]Feuil1'!RC[35]"

Exemple Si "F1" = mars:
Range("E4").Select
Application.CutCopyMode = False
ActiveCell.FormulaR1C1 = "='[Budget Total.xls]Feuil1'!RC[38]" Etc....

Merci de votre aide.🙂
 
Re : Macro conditionnelle au mois pour Excel

Bonsoir Broch002,

Je ne sais si je pourrai t'aider, mais une chose est sûre, c'est que sans extrait de fichier pour voir les données et tester, ça complique ! (sans données confidentielles le fichier bien sûr)

Bonne soirée à toi,

mth
 
Re : Macro conditionnelle au mois pour Excel

Bonsoir.
De quelle version de Excel s'agit-il ? Le VBA n'est plus traduit en français depuis bien longtemps, et il faut écrire les conditions "Si" comme suit :
(corrigé le 5 octobre)

If [condition 1] Then
[action 1]
ElseIf [condition 2] Then
[action 2]
ElseIf [condition 3] Then
[action 3]
etc......
Else
[action si aucune des conditions n'est remplie]
End If

Pour suivre ton exemple :
Code:
Sub Exemple()

    If Range("F1") = "janvier" Then
        Range("F4").Select
        Application.CutCopyMode = False
        ActiveCell.FormulaR1C1 = "='[Budget Total.xls]Feuil1'!RC[32]"
    End If

End Sub

Mais attention : ça ne fonctionne que si les cellules F1 et F4 sont dans la feuille active. Et il n'est pas nécessaire de sélectionner la cellule F4 pour y coller la formule (j'ai supprimé le "Application.CutCopyMode = False" dont je ne vois pas l'utilité dans ce "If ... End If") :
Code:
Sub Exemple_2()
    
    If Range("F1") = "janvier" Then
        Range("F4").FormulaR1C1 = "='[Budget Total.xls]Feuil1'!RC[32]"
    End If

End Sub

Si les cellules F1 et F4 ne sont pas dans la feuille active ou pas dans la même feuille, il faut désigner l'objet "Range" comme suit :
Sheets("[Nom de la feuille]").Range("F1")
Et si les cellules ne sont pas dans le même classeur (alors, les deux classeurs doivent être ouverts en même temps), il faut écrire :
Workbooks("[Nom du classeur]").Sheets("[Nom de la feuille]").Range("F1")

Et, plutôt que des faire des "If ... En if" à la chaîne, il vaut mieux utiliser le "Select Case :
Code:
Sub Exemple_3()

    Select Case Range("F1").Value
        Case "janvier"
            Range("F4").FormulaR1C1 = "='[Budget Total.xls]Feuil1'!RC[32]"
        Case "février"
            Range("F4").FormulaR1C1 = "='[Budget Total.xls]Feuil1'!RC[35]"
        Case "mars"
            Range("F4").FormulaR1C1 = "='[Budget Total.xls]Feuil1'!RC[38]"
Rem Etc.....
    End Select

End Sub

Bon courage.

PS : attention à la casse ! "janvier" <> "JANVIER" !
 
Dernière édition:
Re : Macro conditionnelle au mois pour Excel

Bonsoir.
De quelle version de Excel s'agit-il ? Le VBA n'est plus traduit en français depuis bien longtemps, et il faut écrire les conditions "Si" comme suit :
(corrigé le 5 octobre)

If [condition 1] Then
[action 1]
ElseIf [condition 2] Then
[action 2]
ElseIf [condition 3] Then
[action 3]
etc......
Else
[action si aucune des conditions n'est remplie]
End If


Bonjour,
Merci je vais essayer et vous tiendrais informé. Par contre j'ai un autre problème, j'écris un userform comportant plusieurs textbox dont je souhaiterais me servir de la valeur d'entre eux dans plusieurs autres. Je me trouve confronté au fait qu'il y a ambiguïté

Pour suivre ton exemple :
Code:
Sub Exemple()

    If Range("F1") = "janvier" Then
        Range("F4").Select
        Application.CutCopyMode = False
        ActiveCell.FormulaR1C1 = "='[Budget Total.xls]Feuil1'!RC[32]"
    End If

End Sub

Mais attention : ça ne fonctionne que si les cellules F1 et F4 sont dans la feuille active. Et il n'est pas nécessaire de sélectionner la cellule F4 pour y coller la formule (j'ai supprimé le "Application.CutCopyMode = False" dont je ne vois pas l'utilité dans ce "If ... End If") :
Code:
Sub Exemple_2()
    
    If Range("F1") = "janvier" Then
        Range("F4").FormulaR1C1 = "='[Budget Total.xls]Feuil1'!RC[32]"
    End If

End Sub

Si les cellules F1 et F4 ne sont pas dans la feuille active ou pas dans la même feuille, il faut désigner l'objet "Range" comme suit :
Sheets("[Nom de la feuille]").Range("F1")
Et si les cellules ne sont pas dans le même classeur (alors, les deux classeurs doivent être ouverts en même temps), il faut écrire :
Workbooks("[Nom du classeur]").Sheets("[Nom de la feuille]").Range("F1")

Et, plutôt que des faire des "If ... En if" à la chaîne, il vaut mieux utiliser le "Select Case :
Code:
Sub Exemple_3()

    Select Case Range("F1").Value
        Case "janvier"
            Range("F4").FormulaR1C1 = "='[Budget Total.xls]Feuil1'!RC[32]"
        Case "février"
            Range("F4").FormulaR1C1 = "='[Budget Total.xls]Feuil1'!RC[35]"
        Case "mars"
            Range("F4").FormulaR1C1 = "='[Budget Total.xls]Feuil1'!RC[38]"
Rem Etc.....
    End Select

End Sub

Bon courage.

PS : attention à la casse ! "janvier" <> "JANVIER" !

Bonjour,
Merci je vais essayer et vous tiendrais informé. Par contre j'ai un autre problème, j'écris un userform comportant plusieurs textbox dont je souhaiterais me servir de la valeur de l'un d'entre eux dans un autre. Je me trouve confronté au fait qu'il y a ambiguïté.
Exemple:

J'utilise le valeur du textbox21 dans le textbox253
Formule pour le 253
Private Sub TextBox21_afterUpdate()
TextBox253.Value = Val(TextBox21.Value) + Val(TextBox22.Value)
Private Sub TextBox22_AfterUpdate()
TextBox253.Value = Val(TextBox21.Value) + Val(TextBox22.Value)
End Sub

Je souhaite également utiliser la valeur de ce textebox dans le 301

Private Sub TextBox191_AfterUpdate()
TextBox301.Value = Val(TextBox191.Value) + Val(TextBox21.Value)
End Sub
Private Sub TextBox21_AfterUpdate()
TextBox301.Value = Val(TextBox191.Value) * Val(TextBox21.Value)
End Sub

et là problème, il y a ambiguïté😕

Commet faire pour résoudre ce problème.

Merci.
 
Re : Macro conditionnelle au mois pour Excel

Bonsoir,

Je m'excuse de ce long moment d’absence mais des impératifs m'ont fait abandonner provisoirement ce fichier Budget.
J'y reviens et me trouve toujours confronté à mon problème. Ma version D'excel est 2007.

Je joins les fichiers pour exemple.

Je reformule autrement ma question.

Dans le fichier "Budget Test", la cellule E1 doit être renseignée par les cellules D4 à O4 de la feuil1 du fichier "Budget Four" en fonction du mois en cours qui s'affiche automatiquement dans le cellule E1.
Bien sur il y a la possibilité, comme précisé précédemment, de mettre une formule conditionnelle, mais vu le nombre de ligne d'au minimum 2000, c'est trop lourd. Je souhaite le faire par macro à l'ouverture du fichier "Budget test"

Merci d'avance.
 

Pièces jointes

Re : Macro conditionnelle au mois pour Excel

Bonjour Lermiton.

Ces formules remplissent parfaitement leurs fonctions.

Sub Exemple_3()

Select Case Range("F1").Value
Case "janvier"
Range("F4").FormulaR1C1 = "='[Budget Total.xls]Feuil1'!RC[32]"
Case "février"
Range("F4").FormulaR1C1 = "='[Budget Total.xls]Feuil1'!RC[35]"
Case "mars"
Range("F4").FormulaR1C1 = "='[Budget Total.xls]Feuil1'!RC[38]"
Rem Etc.....
End Select

End Sub

Génial cela marche à merveille.

Merci beaucoup.
 
Re : Macro conditionnelle au mois pour Excel

Bonsoir;

houps petit problème, j'ai dans un textbox le résultat de l’addition d'autre textbox, 44 au total et ma ligne de code est trop longue, comment faire pour passer à la ligne.+ Val(TextBox391.Value) est en trop.
Voici le code.

Private Sub TextBox81_AfterUpdate()
TextBox253.Value = Val(TextBox81.Value) + Val(TextBox82.Value) + Val(TextBox83.Value) + Val(TextBox84.Value) + Val(TextBox85.Value) + Val(TextBox86.Value) + Val(TextBox87.Value) + Val(TextBox88.Value) + Val(TextBox89.Value) + Val(TextBox90.Value) + Val(TextBox91.Value) + Val(TextBox181.Value) + Val(TextBox182.Value) + Val(TextBox183.Value) + Val(TextBox184.Value) + Val(TextBox185.Value) + Val(TextBox186.Value) + Val(TextBox187.Value) + Val(TextBox188.Value) + Val(TextBox189.Value) + Val(TextBox190.Value) + Val(TextBox191.Value) + Val(TextBox281.Value) + Val(TextBox282.Value) + Val(TextBox283.Value) + Val(TextBox284.Value) + Val(TextBox285.Value) + Val(TextBox286.Value) + Val(TextBox287.Value) + Val(TextBox288.Value) + Val(TextBox289.Value) + Val(TextBox290.Value) + Val(TextBox291.Value) + Val(TextBox381.Value) + Val(TextBox382.Value) + Val(TextBox384.Value) + Val(TextBox385.Value) + Val(TextBox386.Value) + Val(TextBox387.Value) + Val(TextBox388.Value) + Val(TextBox389.Value) + Val(TextBox390.Value)
+ Val(TextBox391.Value)
End Sub

Merci d'avance
 
Re : Macro conditionnelle au mois pour Excel

Bonsoir,

pour passer à la ligne tu peux essayer ainsi:
Code:
TextBox253.Value = Val(TextBox81.Value) + Val(TextBox82.Value) + Val(TextBox83.Value) + Val(TextBox84.Value) + _
      Val(TextBox85.Value) + Val(TextBox86.Value) + Val(TextBox87.Value) + Val(TextBox88.Value) + _
      Val(TextBox89.Value) + Val(TextBox90.Value) + Val(TextBox91.Value) + Val(TextBox181.Value) + _
      Val(TextBox182.Value) + Val(TextBox183.Value) + ... tutti quanti

chaque ligne se termine par un espace suivie d'un tiret bas, puis tu passes à la ligne suivante.

Sans fichier donc pas testé ...

Petite remarque, quand tu écris du code, peux-tu penser à utiliser la balise code s'il te plaît? (en haut de la fenêtre de message, la troisième en partant de la droite: # ), sans ça ton code est illisible.

Bien à toi,

mth
 
Re : Macro conditionnelle au mois pour Excel

Bonsoir.

Pour calculer la valeur du "TextBox253", tu peux aussi écrire ceci, en remplaçant "UserForm1" par le nom que tu as donné à ton UserForm, et en vérifiant que la fonction "Cumul" doit bien être du type "Single" dans ton cas :
Code:
Private Sub TextBox80_AfterUpdate()
    TextBox253.Value = Cumul
End Sub

Private Sub TextBox81_AfterUpdate()
    TextBox253.Value = Cumul
End Sub

' etc........

Private Function Cumul() As Single
    Dim n As Integer
    Dim Ctrl As Control
    
    For Each Ctrl In UserForm1.Controls
        If TypeName(Ctrl) = "TextBox" Then
            n = Val(Right(Ctrl.Name, Len(Ctrl.Name) - 7))
            Select Case n
                Case 80 To 91
                    Cumul = Cumul + Val(Ctrl)
                Case 181 To 191
                    Cumul = Cumul + Val(Ctrl)
                Case 281 To 291
                    Cumul = Cumul + Val(Ctrl)
                Case 381, 382
                    Cumul = Cumul + Val(Ctrl)
                Case 384 To 391
                    Cumul = Cumul + Val(Ctrl)
            End Select
        End If
    Next
End Function

Bonne soirée.

PS : plus élégant, si tu donnes un "Tag" à chaque TextBox que tu veux utiliser pour le cumul (propriété "Tag" du Textbox), par exemple "81" pour le TextBox81 et ainsi de suite, tu peux écrire la fonction "Cumul" comme ceci :
Code:
Private Function Cumul() As Single
    Dim Ctrl As Control
    
    For Each Ctrl In UserForm1.Controls
        Select Case Ctrl.Tag
            Case 80 To 91
                Cumul = Cumul + Val(Ctrl)
            Case 181 To 191
                Cumul = Cumul + Val(Ctrl)
            Case 281 To 291
                Cumul = Cumul + Val(Ctrl)
            Case 381, 382
                Cumul = Cumul + Val(Ctrl)
            Case 384 To 391
                Cumul = Cumul + Val(Ctrl)
        End Select
    Next

End Function
 
Dernière édition:
Re : Macro conditionnelle au mois pour Excel

Bonsoir.

Pour calculer la valeur du "TextBox253", tu peux aussi écrire ceci, en remplaçant "UserForm1" par le nom que tu as donné à ton UserForm, et en vérifiant que la fonction "Cumul" doit bien être du type "Single" dans ton cas :
Code:
Private Sub TextBox80_AfterUpdate()
    TextBox253.Value = Cumul
End Sub

Private Sub TextBox81_AfterUpdate()
    TextBox253.Value = Cumul
End Sub

' etc........

Private Function Cumul() As Single
    Dim n As Integer
    Dim Ctrl As Control
    
    For Each Ctrl In UserForm1.Controls
        If TypeName(Ctrl) = "TextBox" Then
            n = Val(Right(Ctrl.Name, Len(Ctrl.Name) - 7))
            Select Case n
                Case 80 To 91
                    Cumul = Cumul + Val(Ctrl)
                Case 181 To 191
                    Cumul = Cumul + Val(Ctrl)
                Case 281 To 291
                    Cumul = Cumul + Val(Ctrl)
                Case 381, 382
                    Cumul = Cumul + Val(Ctrl)
                Case 384 To 391
                    Cumul = Cumul + Val(Ctrl)
            End Select
        End If
    Next
End Function

Bonne soirée.

PS : plus élégant, si tu donnes un "Tag" à chaque TextBox que tu veux utiliser pour le cumul (propriété "Tag" du Textbox), par exemple "81" pour le TextBox81 et ainsi de suite, tu peux écrire la fonction "Cumul" comme ceci :
Code:
Private Function Cumul() As Single
    Dim Ctrl As Control
    
    For Each Ctrl In UserForm1.Controls
        Select Case Ctrl.Tag
            Case 80 To 91
                Cumul = Cumul + Val(Ctrl)
            Case 181 To 191
                Cumul = Cumul + Val(Ctrl)
            Case 281 To 291
                Cumul = Cumul + Val(Ctrl)
            Case 381, 382
                Cumul = Cumul + Val(Ctrl)
            Case 384 To 391
                Cumul = Cumul + Val(Ctrl)
        End Select
    Next

End Function

Bonsoir, je vais essayer et vous tiens informé du résultat.

Bonne nuit.
 
Re : Macro conditionnelle au mois pour Excel

bonjour,

J'ai une userform contenant 5 CommandButtons lançant chacun une macro qui dure entre 15 à 30 secondes. Je souhaite placer une progressbar qui ce mettrait en route dès que l'on Click indifféremment sur sur l'un des CommandButtons. Pour faire patienter l'utilisateur.
J'ai essayé de trouver sur le forum mais je n'ai pas trouvé chaussure à mon pied.

Merci d'avance.
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

L
Réponses
9
Affichages
1 K
I
  • Question Question
Réponses
1
Affichages
3 K
B
Réponses
2
Affichages
1 K
G
  • Question Question
Réponses
3
Affichages
2 K
D
Réponses
22
Affichages
3 K
C
Réponses
5
Affichages
943
C
V
Réponses
2
Affichages
2 K
vynmarius
V
L
  • Question Question
Réponses
11
Affichages
2 K
LaSimonerie
L
Réponses
0
Affichages
681
L
  • Question Question
Réponses
0
Affichages
1 K
lycan54
L
M
Réponses
11
Affichages
2 K
Melidan2006
M
  • Question Question
Réponses
1
Affichages
1 K
A
Réponses
8
Affichages
1 K
A
Retour