Question rapide sur les liste en VBA

nicolase78

XLDnaute Junior
Bonjour à tous,

Je voudrai créer une liste de validation en vba mais mon problème se porte sur les données de cette liste. En effet cette liste est variable et je me demande comment l'intégrer dans le code ci-dessous qui accepte seulement une plage (ici $A$24:$A$29). Y'a t-il un moyen pour qu'elle accepte un tableau ???

Code:
Sub Macro3()
'


    With Selection.Validation
        .Delete
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
        xlBetween, Formula1:="=$A$24:$A$29"
        .IgnoreBlank = True
        .InCellDropdown = True
        .InputTitle = ""
        .ErrorTitle = ""
        .InputMessage = ""
        .ErrorMessage = ""
        .ShowInput = True
        .ShowError = True
    End With
 
End Sub

Merci par avance!
 

Dull

XLDnaute Barbatruc
Re : Question rapide sur les liste en VBA

Salut nicolase78, le Forum

essaye cela

Sub Macro3()
'
Dim DerLig As Long
DerLig = Feuil1.Range("A" & Rows.Count).End(xlUp).Row
With Selection.Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:="=$A$24:$A$" & DerLig
.IgnoreBlank = True
.InCellDropdown = True
.InputTitle = ""
.ErrorTitle = ""
.InputMessage = ""
.ErrorMessage = ""
.ShowInput = True
.ShowError = True
End With
End Sub

DerLig te permet de trouver la dernière ligne de la Col A renseignée

Bonne Journée
 

job75

XLDnaute Barbatruc
Re : Question rapide sur les liste en VBA

Bonjour nicolase78, salut Dull :)

Pour définir une liste de validation, il n'y a que 2 possibilités :

- soit une plage de cellules comme la vôtre ou celle proposée par Dull

- soit une liste de type String avec la virgule comme séparateur :

Code:
Sub ListeValidation()
Dim liste As String
liste = "a,b,c,d,e,f"
With Selection.Validation
  .Delete
  .Add xlValidateList, Formula1:=liste
End With
End Sub
A+
 

nicolase78

XLDnaute Junior
Re : Question rapide sur les liste en VBA

Merci Dull. En fait moi je voudrai prendre les données d'une plage mais sans les doublons c'est là la difficulté. Donc je me suis dis je vais passer par un tableau qui va virer les doublons et transmettre ce tableau mais ça ne marche pas...

Job, tu me confirmes qu'il n'y a pas moyen de faire ce que je veux alors. Puisque si je prends un string qui comprend "a,b,c,d", la liste n'aura qu'une seule entrée qui sera "a,b,c,d" ?
 

ROGER2327

XLDnaute Barbatruc
Re : Question rapide sur les liste en VBA

Bonjour à tous


À défaut de support, un essai sans plage auxiliaire...
  • ... sans classement :
    VB:
    Sub Liste1()
    Dim i%, v$, oCel As Range, oPlg As Range, Coll As New Collection
        Set oPlg = Range("B5:B19") 'plage de données à définir à sa convenance.
        On Error Resume Next
        For Each oCel In oPlg.Cells
            Coll.Add oCel.Value, CStr(oCel.Value)
        Next
        Set oPlg = Nothing
        On Error GoTo 0
        For i = 1 To Coll.Count
            v = v & Coll.Item(i) & ","
        Next
        With [B1].Validation 'ou autre adresse...
            .Delete
            .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:=Left$(v, Len(v) - 1)
            .IgnoreBlank = True
            .InCellDropdown = True
            .InputTitle = ""
            .ErrorTitle = ""
            .InputMessage = ""
            .ErrorMessage = ""
            .ShowInput = True
            .ShowError = True
        End With
    End Sub
  • ... avec classement :
    VB:
    Sub Liste2()
    Dim i%, v$, dPlg, oCel As Range, oPlg As Range, Coll As New Collection
        Set oPlg = Range("B5:B19") 'plage de données à définir à sa convenance.
        dPlg = oPlg.Value
        With oPlg.Parent.Sort
            .SortFields.Clear
            .SortFields.Add Key:=oPlg.Range("A1"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
            .SetRange oPlg
            .Header = xlNo 'à adapter
            .MatchCase = False
            .Orientation = xlTopToBottom
            .Apply
        End With
        On Error Resume Next
        For Each oCel In oPlg.Cells
            Coll.Add oCel.Value, CStr(oCel.Value)
        Next
        oPlg.Value = dPlg
        Set oPlg = Nothing
        Erase dPlg
        On Error GoTo 0
        For i = 1 To Coll.Count
            v = v & Coll.Item(i) & ","
        Next
        With [B1].Validation 'ou autre adresse...
            .Delete
            .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:=Left$(v, Len(v) - 1)
            .IgnoreBlank = True
            .InCellDropdown = True
            .InputTitle = ""
            .ErrorTitle = ""
            .InputMessage = ""
            .ErrorMessage = ""
            .ShowInput = True
            .ShowError = True
        End With
    End Sub


ROGER2327
#5534


Dimanche 1er Pédale 139 (Erection du Surmâle - fête Suprême Tierce)
5 Ventôse An CCXX, 1,5863h - bouc
2012-W08-5T03:48:26Z
 

BOISGONTIER

XLDnaute Barbatruc
Repose en paix
Re : Question rapide sur les liste en VBA

Bonjour,


>soit une liste de type String avec la virgule comme séparateur :


Il faut préciser que ce genre de liste ne peut pas dépasser 200 caractères, ce qui en limite l'utilisation.

Avec un formulaire

Code:
Private Sub UserForm_Initialize()
  Set mondico = CreateObject("Scripting.Dictionary")
  a = [Noms].Value  ' tableau a(,)
  For Each c In a
    mondico(c) = ""
  Next c
  Me.ComboBox1.List = mondico.keys
  SendKeys "{F4}"
End Sub

Private Sub ComboBox1_Change()
  ActiveCell = Me.ComboBox1
  Unload Me
End Sub

Avec tri des noms

Code:
Private Sub UserForm_Initialize()
  Set mondico = CreateObject("Scripting.Dictionary")
  a = [Noms].Value  ' tableau a(,)
  For Each c In a
    If c <> "" Then mondico(c) = ""
  Next c
  temp = mondico.keys
  Call tri(temp, LBound(temp), UBound(temp))
  Me.ComboBox1.List = temp
  SendKeys "{F4}"
End Sub

JB
 

Pièces jointes

  • DVFormChamp.xls
    49.5 KB · Affichages: 52
Dernière édition:

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
312 453
Messages
2 088 550
Membres
103 881
dernier inscrit
malbousquet