Validation "INDIRECT"

Bonjour à tous,

Il n'y a pas longtemps j'ai utilisé l'aide de FRANGY, qui m'a été d'une très grande aide à ma formule, toutefois j'ai été obligé de changer plusieurs fois et maintenant ma formule comporte une erreur et malgré tout mes essaies à la modifier, rien ne fonctionne.

' Ajout formule R10 Oui
    If Target.Count > 1 Then Exit Sub
    If Target.Address = "$Q$10" Then
    If Target.Value = "Oui" Then
    Range("R10").Select
        Dim R10_Oui As String
        R10_Oui = "_" & Range("F12") & "_" & Range("F10") & "_" & Range("H10") & "_" & Range("J10") & "_" & Replace(Range("L10"), "/", "") & "_" & Replace(Replace(Range("N10"), "/", ""), " ", "") & "_" & Range("P10") & "_" & Range("Q10")
        With Range("R10").Validation
            .Delete
            .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:="=" & R10_Oui
        End With
        With Selection
        .HorizontalAlignment = xlCenter
        .VerticalAlignment = xlCenter
        .WrapText = False
        .Orientation = 0
        .AddIndent = False
        .IndentLevel = 0
        .ShrinkToFit = False
        .ReadingOrder = xlContext
        .MergeCells = True
        End With
  End If
 End If

Mon problème est au niveau que j'ai mis en surligné, j'explique un peu plus en détail.

Lorsque je fais une sélection en "P10", "Q10" change en validation de donnée et une fois ma sélection faite je désire que "R10" change en validation de donnée lui aussi indirect à ma sélection précédente. J'ai tenté de changer les ", = et les & de place pour voir si cela n'affecterais la phrase et semblerais que la méthode écrit ci-haut est la bonne, mais cela ne fonctionne toujours pas.

Malheureusement mon fichier est rendu trop volumineux et je n'ai aucun moyen de le zipper suffisamment pour l'attaché à ce courriel.

Par contre, je pourrais créer un lien de partage pour le téléchargé si quelqu'un peu m'aider.

Un grand merci de votre aide et bonne journée

Bonjour Buddypaint,

A la main, es-ce que tu arrives à créer la bonne validation des données?

Si la réponse est oui, as-tu essayé l'enregistreur de macros?

Si oui, es-ce que tu peux copier/coller le code généré automatiquement? (qui contiendra ta solution !!)

Si non, je t'invite à l'utiliser: https://www.excel-pratique.com/fr/vba/premiere_macro.php

Si non, dur dur.

J'attends ton retour =)

Bonsoir,

C'est déjà du code en grande partie enregistré, donc mauvais ! Il serait judicieux lorsqu'on enregistre du code de le passer vraiment au peigne fin, pour savoir ce qu'on a écrit, pour l'épurer d'abord puis pour apprendre à écrire le code dont on a besoin directement en sachant ce qu'on écrit...

La ligne de création du filtre :

.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:="=" & R10_Oui

par la méthode Add : 5 arguments, le premier obligatoire les 4 autres facultatifs ; validation par liste indique le premier, il faut donc fournir la liste (Formula1) et on peut négliger Operator et Formula2, on ne touche par à l'alerte par défaut, on peut donc négliger aussi.

On n'est pas obligé de suivre l'enregistreur dans le passage d'arguments par nom, le passage par position s'avérant plus pratique dans la grande majorité des cas.

.Add xlValidateList, , , R10_Oui

Voilà la ligne optimisée, qui fonctionnera à condition que la liste insérée par la variable R10_Oui soit reconnue valide...

Il s'agit d'une liste passée sous forme de chaîne. Pour l'épuration de la ligne que nous venons de voir, l'Aide suffisait à fournir l'information claire pour y procéder après quelques minutes de lecture, là un peu d'expérience s'avère utile (mais en tâtonnant un peu, on arrive au but).

Lorsque l'on le fait manuellement, on tape les éléments de la liste séparés par des point-virgules.

Mais contrairement aux formules de formats conditionnels que l'on passe en français en VBA, pour la validation il faut les passer en anglais pour que ça marche [pourquoi ces différences... ça c'est pas à ma portée de répondre !] , donc le séparateur fonctionnel sera la virgule.

Il faut donc rectifier la ligne concernée :

R10_Oui = Range("F12") & "," & Range("F10") & "," & Range("H10") & "," & Range("J10") & "," _
 & Replace(Range("L10"), "/", "") & "," & Replace(Replace(Range("N10"), "/", ""), " ", "") & "," _
 & Range("P10") & "," & Range("Q10")

Voilà qui devrait donc fonctionner...

Dernière remarque : les déclarations de variables se font en début de procédure et non au milieu !

Et j'encourage vivement à épurer le reste du code...

Cordialement.

Rechercher des sujets similaires à "validation indirect"