Insertion cellule avec fonction dans liste - Macro

Bonjour,

Je souhaiterais insérer une ligne avec une macro :

Dans cette ligne une cellule avec validation de données en liste pour avoir une liste déroulante.

Une formule est à l'intérieur pour avoir accès à une liste déroulante différente en fonction d'une autre cellule

Je note ça dans la source de validation de donnée.

=SI($Q$3="";Données!$AB$3:$AB$17;Données!$AE$3:$AE$5)

Cela fonctionne lorsque que la manipulation est hors macro car quand j'essaye d'enregistrer une macro et je refait la même manip, lorsque je veux l'exécuter, excel me trouve une erreur...

Voici la macro crée par Excel :

Sub Macro1()

'

' Macro1 Macro

'

'

With Selection.validation

.Delete

.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _

xlBetween, Formula1:= _

"=SI($Q$3="""";Données!$AB$3:$AB$17;Données!$AE$3:$AE$5)"

.IgnoreBlank = True

.InCellDropdown = True

.InputTitle = ""

.ErrorTitle = ""

.InputMessage = ""

.ErrorMessage = ""

.ShowInput = True

.ShowError = True

End With

End Sub

Ayant vu des erreurs, j'ai voulu la corriger moi-même en enlevant les "" en trop dans la formule mais cela ne fonctionne toujours pas...

J'espère avoir été assez claire, sinon posez des questions

Merci d'avance

13essai.xlsm (33.38 Ko)

Bonjour,

à tester,

Sub Macro1()
If Range("$Q$3") = "" Then plg = "Données!$AB$3:$AB$17" Else plg = "Données!$AE$3:$AE$5)"
    With Selection.Validation
        .Delete
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
        xlBetween, Formula1:="=" & plg
        .IgnoreBlank = True
        .InCellDropdown = True
        .InputTitle = ""
        .ErrorTitle = ""
        .InputMessage = ""
        .ErrorMessage = ""
        .ShowInput = True
        .ShowError = True
    End With
End Sub

Bonjour,

Ta macro un peu réduite

Sub Macro1()
    With ActiveSheet
        .Rows(3).Insert
        With .Range("S3").validation
            .Delete
            .Add xlValidateList, xlValidAlertStop, , _
             "=IF($Q$3="""",Données!$AB$3:$AB$17,Données!$AE$3:$AE$5)"
        End With
    End With
End Sub

J'ai supprimé tous les Select inutiles (comme toujours) mais rajouté les qualificateurs d'objets [je n'aime pas voir des Rows ou Range ou autre Cells non rattachés explicitement à une feuille, même quand on peut s'en passer, c'est une garantie de fiabilité pour l'avenir, et souvent cela permet aussi une exécution plus rapide...]

Pour ce qui est de la Validation, comme en toute autre chose, tu gagneras du temps et de l'efficacité à ne pas suivre (bêtement) l'enregistreur : inutile d'énumérer tous les arguments, si tu n'interviens pas spécifiquement pour modifier leur valeur par défaut (cela fait de l'écriture en plus, et du temps d'exécution en plus pour les redéfinir à la valeur qu'ils ont déjà !), en outre le passage des arguments par nom (méthode chère à l'enregistreur) n'est pas la méthode normale de passage, la méthode normale est le passage par position (qui évite les noms des arguments... il n'est utile de passer par nom que si cela fait gagner du temps).

Pour une validation de liste, seuls xlValidateList qui définit le type et la formule sont utiles (tiens ! j'en ai laissé un qui peut également disparaître ! )

Là où ça coinçait, c'est que la formule doit être en anglais : peu de choses ici, juste IF au lieu de SI et virgules à la place des points-virgules, mais ça suffit pour que ça plante.

[Note toi cette particularité VBA dans un coin de mémoire, la formule en Validation doit être en anglais (de même, si tu passes une liste sous forme d'énumération, ce doit être une chaîne (String) d'éléments séparés par des virgules...) ; alors que toujours en VBA pour une formule de MFC, tu la passes en francais !... ]

Pour insérer une ligne entière, à partir d'une ligne, ce que j'ai mis suffit :

.Rows(3).Insert mais : .Rows("3:6").Insert (pour insérer alors 4 lignes)

Le paramètre de direction n'a pas d'utilité sur une insertion de ligne entière, il le faut sur insertion à partir d'un plage (portion de ligne). Le paramètre de format non plus, à sa valeur par défaut, mais par contre, comme je vois que tu fais une insertion ligne 3 alors que tes données partent à 2... en insérant sur la première ligne de données, la valeur inverse [ xlFormatFromRightOrBelow ] peut avoir son utilité pour aligner le format sur la ligne en-dessous plutôt que celle du dessus.

Cordialement.

Bonjour désolé pour cette réponse tardive, je n'ai pu tester vos solutions avant.

sabV :

La solution ne fonctionne pas avec le Else c'est-à-dire que lorsque la cellule Q3 n'est pas vide, il me trouve aussi une erreur..

MFerrand :

La solution fonctionne merci beaucoup.

Très bien, je ne suis pas experte non plus, j'essaye tout simplement de comprendre et modifier le code pour que cela marche.

Ne connaissant pas beaucoup le code VBA j'ai juste essayé de m'inspirer de l'enregistreur.

Donc dans la barre de formule d'Excel, il faut que la condition soit en français mais dans le code d'une macro il faut que celui-ci soit en anglais si j'ai bien compris ?

Merci beaucoup je pense avoir tout compris la réponse était très claire.

Cordialement

La solution ne fonctionne pas avec le Else c'est-à-dire que lorsque la cellule Q3 n'est pas vide, il me trouve aussi une erreur..

Mea culpa, j'avais laissé trainée une parenthèse

Sub Macro1()
If Range("$Q$3") = "" Then plg = "Données!$AB$3:$AB$17" Else plg = "Données!$AE$3:$AE$5"
    With Selection.Validation
        .Delete
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
        xlBetween, Formula1:="=" & plg
        .IgnoreBlank = True
        .InCellDropdown = True
        .InputTitle = ""
        .ErrorTitle = ""
        .InputMessage = ""
        .ErrorMessage = ""
        .ShowInput = True
        .ShowError = True
    End With
End Sub
Rechercher des sujets similaires à "insertion fonction liste macro"