Boucle en formule SI VBA
Bonjour les amis j'aimerai savoir si il est possible de transposer cette formule en VBA s'il vous plait
=SI(Z2>AUJOURDHUI();"A JOUR";SI(Z2>AUJOURDHUI()-31;"A METTRE A JOUR";"PAS A JOUR"))
=SI(AA2>AUJOURDHUI();"A JOUR";SI(AA2>AUJOURDHUI()-31;"A METTRE A JOUR";"PAS A JOUR"))
=SI(AB2>AUJOURDHUI();"A JOUR";SI(AB2>AUJOURDHUI()-31;"A METTRE A JOUR";"PAS A JOUR"))
=SI(AC2>AUJOURDHUI();"A JOUR";SI(AC2>AUJOURDHUI()-31;"A METTRE A JOUR";"PAS A JOUR"))
j'aimerai que cette formule ce duplique jusqu'au dernier élement qu'il trouve.
Je vous remercie beaucoup de votre aide
Bonjour,
avec un fichier se serait possible stp ?
Cordialement.
bigdaddy154 a écrit :Bonjour,
avec un fichier se serait possible stp ?
Cordialement.
Pardon voila le fichier, j'aimerai qu'au lieu d'avoir les formules dans chaque case de S a AI, que le résultat soit directement mit dans les cases.
Re,
désolé mais y a toujours pas de fichier.
Cordialement.
Bonjour,
Pardon voila le fichier, j'aimerai qu'au lieu d'avoir les formules dans chaque case de S a AI, que le résultat soit directement mit dans les cases.
Excellente idée !
Mais le fichier est passé à la trappe
je suis désolé je n'arrive pas a joindre le fichier ça m'indique que la taille est trop grosse, j'ai eux beau dégraissé le mammouth j'y arrive pas je suis désolé
Passe par http://cjoint.com et tu mettras le lien...
Merci voici le lien
par contre dans mon fichier vous verrez que la dernière colonne est une formule imbriqué, j'aimerai avoir que vous juste que vous me fassiez la macro de duplication pour cette colonne et pour le reste des colonnes je veux me débrouiller ( je veux apprendre a le faire ) par moi meme
Bonjour,
Difficile car une seule macro pour la mise à jour...
Sub maj()
Dim maj() As Integer, aj, n%, i%, k%
With ActiveSheet
For k = 1 To 17
i = .Cells(.Rows.Count, k).End(xlUp).Row
If i > n Then n = i
Next k
ReDim maj(16, n - 2)
For i = 2 To n
For k = 1 To 17
Select Case .Cells(i, k).Value
Case Is > Date
maj(k - 1, i - 2) = 0
Case Is > Date - 31
maj(k - 1, i - 2) = 1
Case Else
maj(k - 1, i - 2) = 2
End Select
Next k
Next i
aj = Split("A JOUR;A METTRE A JOUR;PAS A JOUR", ";")
For i = 2 To n
For k = 19 To 35
.Cells(i, k).Value = aj(maj(k - 19, i - 2))
Next k
Next i
End With
End SubMacro simple dans sa conception. Tu as 17 colonnes comportant (ou non) des dates. Selon la comparaison avec la date du jour, cela donne lieu à une mention dans 17 autres colonnes, espacées de 18 col. de la col. date.
On va tester toutes ces dates et monter un tableau de valeurs 0, 1 ou 2 selon les conditions que tu posais dans ta formule.
On attribue ensuite la valeur littérale correspondante aux cellules cibles.
La macro ne fait pas la concaténation de ta dernière colonne, mais il suffit de rajouter une boucle avec l'instruction adéquate pour qu'elle le fasse.
Cordialement
Ligne à rajouter dans la dernière boucle (entre Next k et Next i :
.Cells(i, 36).Value = .Cells(1, 36) & .Cells(i, 19)Ton fichier (dégraissé) : la macro est dans Module1. Tu peux y affecter un raccourci clavier pour la lancer, compte tenu de ta configuration.
Merci beaucoup pour ton aide c'est génial, ta macro fonctionne parfaitement sur mon fichier mais j'ai remis ta macro sur un autre fichier en prenant soin de bien modifier les numéros de colonnes pour bien prendre en compte les dates sauf qu'elle affiche correctement " a jour " , " pas a jour" et " mettre a jour "sur les colonnes 43 à 47 et des colonnes 31 à 47 elle m'affiche uniquement la valeur " a jour"
Sub maj()
Dim maj() As Integer, aj, n%, i%, k%
With ActiveSheet
For k = 13 To 29
i = .Cells(.Rows.Count, k).End(xlUp).Row
If i > n Then n = i
Next k
ReDim maj(28, n - 1)
For i = 2 To n
For k = 13 To 29
Select Case .Cells(i, k).Value
Case Is > Date
maj(k - 1, i - 2) = 0
Case Is > Date - 31
maj(k - 1, i - 2) = 1
Case Else
maj(k - 1, i - 2) = 2
End Select
Next k
Next i
aj = Split("A JOUR;A METTRE A JOUR;PAS A JOUR", ";")
For i = 2 To n
For k = 31 To 47
.Cells(i, k).Value = aj(maj(k - 31, i - 2))
Next k
.Cells(i, 48).Value = .Cells(1, 48) & .Cells(i, 31)
Next i
End With
End SubJuste une erreur que tu vas vite comprendre.
13 à 29, cela fait 17 colonnes, donc le tableau (maj) est à indicer 16 dans sa première dimension (0 à 16).
De même ensuite pour l'affectation d'une valeur au tableau, si pour des colonnes de 1 à 17 l'indice du tableau est k-1, pour des col. de 13 à 29, ce sera k-13.
Sub maj2()
Dim maj() As Integer, aj, n%, i%, k%
With ActiveSheet
For k = 13 To 29
i = .Cells(.Rows.Count, k).End(xlUp).Row
If i > n Then n = i
Next k
'ReDim maj(28, n - 1)
ReDim maj(16, n - 1)
For i = 2 To n
For k = 13 To 29
Select Case .Cells(i, k).Value
Case Is > Date
'maj(k - 1, i - 2) = 0
maj(k - 13, i - 2) = 0
Case Is > Date - 31
'maj(k - 1, i - 2) = 1
maj(k - 13, i - 2) = 1
Case Else
'maj(k - 1, i - 2) = 2
maj(k - 13, i - 2) = 2
End Select
Next k
Next i
aj = Split("A JOUR;A METTRE A JOUR;PAS A JOUR", ";")
For i = 2 To n
For k = 31 To 47
.Cells(i, k).Value = aj(maj(k - 31, i - 2))
Next k
.Cells(i, 48).Value = .Cells(1, 48) & .Cells(i, 31)
Next i
End With
End SubJ'ai laissé les lignes remplacées en commentaires (précédées d'une apostrophe). Peu de choses !
Si tu n'étais pas familiarisé avec le code, félicitations, tu t'adaptes rapidement.
Cordialement
Ferrand
Merci beaucoup de ton aide, j'y connais rien sur VBA, j'y suis plonger a cause de mon stage, c'est vraiment un outil bien quand on sait l'utiliser, il sauve vraiment la vie ! En tout cas merci merci beaucoup
Bonjoue je me permets de revenir sur cette macro, car j'ai un soucis. Je rentre les dates qui doivent changer en " A JOUR ", " A METTRE A JOUR" et " PAS A JOUR " via des TextBox et je constate que la macro prends comme référence la 1er valeur qu'elle trouve par exemple " A JOUR" et la copie dans le reste des colonnes indépendamment du fait des conditions.
Quand j'entre a les dates sans passé par les textbox ça fonctionne
MFerrand a écrit :Juste une erreur que tu vas vite comprendre.
13 à 29, cela fait 17 colonnes, donc le tableau (maj) est à indicer 16 dans sa première dimension (0 à 16).
De même ensuite pour l'affectation d'une valeur au tableau, si pour des colonnes de 1 à 17 l'indice du tableau est k-1, pour des col. de 13 à 29, ce sera k-13.
Sub maj2() Dim maj() As Integer, aj, n%, i%, k% With ActiveSheet For k = 13 To 29 i = .Cells(.Rows.Count, k).End(xlUp).Row If i > n Then n = i Next k 'ReDim maj(28, n - 1) ReDim maj(16, n - 1) For i = 2 To n For k = 13 To 29 Select Case .Cells(i, k).Value Case Is > Date 'maj(k - 1, i - 2) = 0 maj(k - 13, i - 2) = 0 Case Is > Date - 31 'maj(k - 1, i - 2) = 1 maj(k - 13, i - 2) = 1 Case Else 'maj(k - 1, i - 2) = 2 maj(k - 13, i - 2) = 2 End Select Next k Next i aj = Split("A JOUR;A METTRE A JOUR;PAS A JOUR", ";") For i = 2 To n For k = 31 To 47 .Cells(i, k).Value = aj(maj(k - 31, i - 2)) Next k .Cells(i, 48).Value = .Cells(1, 48) & .Cells(i, 31) Next i End With End SubJ'ai laissé les lignes remplacées en commentaires (précédées d'une apostrophe). Peu de choses !
Si tu n'étais pas familiarisé avec le code, félicitations, tu t'adaptes rapidement.
Cordialement
Ferrand
Bonjour,
Excuses pour le délai de réponse. J'étais absent du forum depuis fin octobre et je reprends les messages en retard...
Je ne visualise pas le problème que tu soulèves. Il n'y avait pas de TextBox sur le modèle traité. Il faudrait donc examiner un modèle avec TextBox pour détecter où réside le problème.
Cordialement.