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 !
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....
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)
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" !
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
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"
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
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.
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.
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
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
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.
- 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