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 !
Range("D17:D906").Select
With Selection.Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:="=indirect($C17)"
.IgnoreBlank = True
.InCellDropdown = True
.InputTitle = ""
.ErrorTitle = ""
.InputMessage = ""
.ErrorMessage = ""
.ShowInput = True
.ShowError = True
End With

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

Dim c As Range

'On Error Resume Next
For Each c In Sheets("Charges").Range("D17:D906")

c.Select
With Selection.Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:="=INDIRECT(""" & c.Address(0, -1) & """)"
.IgnoreBlank = True
.InCellDropdown = True
.InputTitle = ""
.ErrorTitle = ""
.InputMessage = ""
.ErrorMessage = ""
.ShowInput = True
.ShowError = True
End With
Next c

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
 

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