Worksheet_change sur une colonne toutes les 13 colonnes
Bonjour à vous,
Première venue sur le forum. J'ai commencé le vba il y a 3 semaines. Peut être ma question sera idiote.
Voilà mon problème.
Mon Worksheet_change fonctionne actuellement sur la 24ème colonne de mon onglet et des lignes 3 jusqu'à la dernière ligne avec du texte.
Si une des valeurs de cette colonne change entre M (mensuel), T (Trimestriel), S (Semestriel) et A ( Annuel), je veux qu'une liste déroulante apparaisse dans la colonne juste à droite et qu'elle aille chercher ses valeurs dans l'onglet Cours_M si c'est M, Cours_T si c'est T, etc....
Cela fonctionne très bien.
Mais ce que je souhaiterais est appliquer cette macro à partir de la colonne 24 et tous les 13 colonnes.
Donc l'appliquer aussi à la 37ème, 50ème, etc...
Et ce jusqu'à la colonne 6500 (oui oui j'ai beaucoup de colonnes...).
Je pourrai donc écrire les numéros de colonne un par un mais bon... Vous comprenez...
J'ai actuellement un Worksheet_change de ce type :
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 24 And Target.Row >= 3 And Target.Row <= Range("H100000").End(xlUp).Row Then
If Target.Value = "M" Then
With Cells(Target.Row, Target.Column + 1).Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:="=Cours_M!$A$5:$A$136"
End With
End If
'Si la fréquence est Trimestrielle
If Target.Value = "T" Then
With Cells(Target.Row, Target.Column + 1).Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:="=Cours_T!$A$5:$A$136"
End With
End If
'Si la fréquence est semestrielle
If Target.Value = "S" Then
With Cells(Target.Row, Target.Column + 1).Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:="=Cours_S!$A$5:$A$136"
End With
End If
'Si la fréquence est annuelle
If Target.Value = "A" Then
With Cells(Target.Row, Target.Column + 1).Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:="=Cours_A!$A$5:$A$136"
End With
End If
End If
End Sub
D'avance merci pour votre aide.
Super Kiwi
Un Kiwi pas comme les autres
Bonjour,
Tu peux remplacer
If Target.Column = 24 And Target.Row >= 3 And Target.Row <= Range("H100000").End(xlUp).Row Then
Par
Dim MaPlage As Range
Dim i As Integer
Dim DerLig As Long
Set MaPlage = Columns(24)
For i = 37 To 6498 Step 13
Set MaPlage = Application.Union(MaPlage, Columns(i))
Next i
DerLig = Range("H" & Rows.Count).End(xlUp).Row
Set MaPlage = Application.Intersect(Range(Rows(3), Rows(DerLig)), MaPlage)
If Not Application.Intersect(Target, MaPlage) Is Nothing Then
Ensuite, si tu veux éviter de déclarer la totalité de la plage à chaque évènement Change (pour éviter la lenteur du traitement), tu peux déporter une partie de cette déclaration dans un module standard, en utilisant un variable publique pour MaPlage.
Dans l’exemple joint, la déclaration partielle est effectuée à l’ouverture du classeur.
A+
Bonjour,
une autre approche :
If (Target.Row >= 3 And Target.Row <= Cells(Rows.Count, 8).End(xlUp).Row) And Target.Column < 6500 And (Target.Column = 24 Or (Target.Column - 24) Mod 13 = 0) Then
'ton code
End If
bon après midi
@+
Bonjour Frangy, bonjour Pierrot93,
Merci à tous les deux pour vos réponses précises et fonctionnelles !!!
Grâce à toi Pierrot j'ai appris l'existence des modulos sur vba et la formulation, ça m'aidera surement pour la suite.
Frangy, pour ta solution, pourrais-tu m'expliquer l'intérêt de Option Explicit dans ton fichier joint.
Que se passe-t-il aussi avec ThisWorkbook. Même en cherchant sur internet je n'arrive pas bien à comprendre l'intérêt.
Si je comprends bien, dès que je sélectionne l'onglet sur lequel je travaille, il va lancer la macro DeclarerPlage qui va me définir la plage de colonnes.
Mais pourquoi ne pas compléter DeclarerPlage et en faire MaPlage "finale" qui comprend l'intersection des colonnes avec les lignes 3 à "fin"? Cela évitera de faire l'intersection à chaque déclenchement de l'évènement.
Merci d'avance pour ta réponse
Frangy, pour ta solution, pourrais-tu m'expliquer l'intérêt de Option Explicit dans ton fichier joint.
Cette instruction impose la déclaration explicite de toutes les variables.
Ce n’est pas une obligation mais une bonne habitude qui t’oblige à réfléchir aux types de variable à utiliser et qui te permet d’optimiser l’utilisation de la mémoire.
Que se passe-t-il aussi avec ThisWorkbook. Même en cherchant sur internet je n'arrive pas bien à comprendre l'intérêt.
ThisWorkbook permet de spécifier que l’instruction doit s’appliquer au classeur dans lequel s'exécute le code de la macro active. C’est bien utile lorsque tu as plusieurs classeurs ouverts.
Si je comprends bien, dès que je sélectionne l'onglet sur lequel je travaille, il va lancer la macro DeclarerPlage qui va me définir la plage de colonnes.
Non, la procédure DeclarerPlage est lancée à l’ouverture du classeur. Tu pourrait effectivement la lancer à l’activation de la feuille si tu ne fais pas des Aller/Retour vers d’autres feuilles.
Mais pourquoi ne pas compléter DeclarerPlage et en faire MaPlage "finale" qui comprend l'intersection des colonnes avec les lignes 3 à "fin"? Cela évitera de faire l'intersection à chaque déclenchement de l'évènement.
Parce que la plage de traitement peut évoluer en cours de traitement, ajout ou suppression de ligne en particulier.
A+
Merci beaucoup pour tes réponses très claires.
Bonne fin de journée et bon week-end.
SuperKiwi
Un Kiwi pas comme les autres