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+

14essai.xlsm (46.87 Ko)

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

Rechercher des sujets similaires à "worksheet change colonne toutes colonnes"