Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2013 VBA - Indirect - Validation de données

fil28

XLDnaute Nouveau
Bonjour Le forum

Cela fait très longtemps que j'ai pas posté de message
Peut être que vous pourrez m'aider sur ce point.
Je dois modifier une liste dans validation de données mais voilà les problèmes commencent !

Mais ca ne marche pas j'ai ensuite essayé une autre méthode mais sans succès non plus


Du coup je ne vois pas trop !
Si quelqu'un a une idée je suis bien évidemment preneur

Merci encore
Philippe
 

laurent950

XLDnaute Accro
Bonsoir fil28

VB:
Essayer avec pour Range("$C17") :
                              Range("C17").Address(True, False)
                              OU
                              c.Offset(0, -1).Address(True, False)
VB:
Sub test()
Dim c As Range
For Each c In Sheets("Charges").Range("D17:D906")

With c.Validation
    .Delete
    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
        xlBetween, Formula1:="=INDIRECT(""" & Range("$C17").Address(True, False) & """)"
    .IgnoreBlank = True
    .InCellDropdown = True
    .InputTitle = ""
    .ErrorTitle = ""
    .InputMessage = ""
    .ErrorMessage = ""
    .ShowInput = True
    .ShowError = True
End With
Next c
End Sub
 
Dernière édition:

fil28

XLDnaute Nouveau
Merci beaucoup Laurent !
C'est super gentil !

Afin d'étayer un peu mes connaissances et me coucher un peu moins bête ce soir:
- Sais tu à quoi sert de mettre True & False derrière Address?
- J'ai vu aussi qu'il existait Address.Local je crois quelle est la différence ?

Excellente journée à vous tous qui nous aider
Philippe
 

job75

XLDnaute Barbatruc
Bonjour fil28, laurent950,

Oui ce qu'il manquait surtout ce sont les guillemets pour encadrer l'adresse de la cellule.

Si l'on fait une boucle on peut garder les références absolues ce n'est pas gênant :
VB:
Sub a()
Dim c As Range
With [D17:D906]
    .Validation.Delete
    For Each c In .Cells
        c.Validation.Add xlValidateList, Formula1:="=INDIRECT(""" & c.Offset(0, -1).Address & """)"
    Next
End With
End Sub
Mais en fait on peut se passer de la boucle et de INDIRECT :
VB:
Sub b()
With [D17:D906].Validation
    .Delete
    .Add xlValidateList, Formula1:="=C17"
End With
End Sub
A+
 

FGV

XLDnaute Nouveau
Bonjour @fil28

Excusez-moi pour la langue, je ne suis pas francophone.
VB:
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:="=INDIRECT(""" & Range("$C17").Address(True, False) & """)"
Si la cellule C17 est vide, le résultat de Formula1 renvoie une erreur

Pour une cellule, vous pouvez essayer
Code:
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:="=IF($C17="""",$C17,INDIRECT($C17))"

Salutations, Fernando
 

job75

XLDnaute Barbatruc
Bonsoir FGV, bienvenue sur XLD,

Chez moi sur Excel 2019, avec les solutions du post #6, aucun problème si les cellules sont vides.

Simplement les listes de validation sont vides.

A+
 

laurent950

XLDnaute Accro
Bonsoir @fil28, Le Forum
Afin d'étayer un peu mes connaissances et me coucher un peu moins bête ce soir:
- Sais tu à quoi sert de mettre True & False derrière Address?
Msgbox Range("C17").Address(False, False) ' C17
Msgbox Range("C17").Address(False, True) ' $C17
Msgbox Range("C17").Address(True, False) ' C$17

C'est les $ Pour figer les positions en valeurs absolu pour (False = $) Ou (True = "Sans les $)

Comme l'exemple ci-dessus
 
Dernière édition:

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…