2010-11-02 19 views
2

J'ai le code VBA suivant (de MS Access 2007). Le code crée un nouveau classeur et ajoute une liste déroulante à une cellule. Ce petit extrait ajoute une liste déroulante à une cellule particulière et ajoute des éléments.Renvoyer le texte d'une liste déroulante plutôt que le numéro d'index

Dim myRng As Range 
Dim myDD As Dropdown 
Set myRng = wSheet.Cells(row, col) 
With myRng 
    Set myDD = .Parent.DropDowns.Add(Left:=.Left, Top:=.Top, Width:=.Width, Height:=.Height) 
    myDD.AddItem "msg1" 
    myDD.AddItem "msg2" 
    myDD.LinkedCell = .Parent.Cells(row, col + 2).Address(external:=True) 
End With 

Tout cela fonctionne très bien et quand j'ouvre la feuille de calcul je reçois une zone de liste déroulante où je veux et les éléments sont affichés. Toutefois, lorsque je sélectionne un élément dans la liste déroulante dans Excel, la cellule liée affiche 1 ou 2 (le numéro d'index). Je voudrais qu'il montre soit msg1 ou msg2.

Est-ce possible?

Répondre

3

Quelques options.

Vous pouvez placer une liste déroulante de validation de données dans la cellule plutôt qu'un objet Dropdown. Cela renvoie les résultats réels plutôt que l'index. Si vous avez besoin d'une cellule liée séparée, vous pouvez mettre une formule qui copie simplement la cellule dv

Sub MakeDv() 

    Dim wSheet As Worksheet 
    Dim myRng As Range 

    Set wSheet = ActiveSheet 

    Set myRng = wSheet.Cells(row, col) 
    myRng.Validation.Add xlValidateList, , , "msg1,msg2" 
    wSheet.Cells(row, col + 2).Formula = "=" & myRng.Address 

End Sub 

Une autre option est de ne pas utiliser la propriété LinkedCell et utiliser une macro pour écrire la valeur. Affecter cette macro dropDown

Sub ShowDDResult() 

    Dim dd As DropDown 

    Set dd = ActiveSheet.DropDowns(Application.Caller) 

    ActiveSheet.Cells(row, col + 2).Value = dd.List(dd.Value) 

End Sub 

Ce ne peut pas être si facile si vous créez la feuille de calcul à partir de zéro à partir d'Access parce que vous auriez à ajouter la macro. La dernière option consiste à utiliser la propriété ListFillRange pour remplir la liste déroulante. Mettez la liste dans une gamme et utiliser une formule hors du LinkedCell pour tirer la date de la liste

Sub testdd() 

    Dim wSheet As Worksheet 
    Dim myRng As Range 
    Dim myDD As DropDown 
    Dim rList As Range 
    Dim aList(1 To 2, 1 To 1) As String 

    Set wSheet = ActiveSheet 
    Set rList = wSheet.Range("D1:D2") 

    Set myRng = wSheet.Cells(row, col) 
    aList(1, 1) = "msg1": aList(2, 1) = "msg2" 
    rList.Value = aList 

    With myRng 
     Set myDD = .Parent.DropDowns.Add(Left:=.Left, Top:=.Top, Width:=.Width, Height:=.Height) 
     myDD.ListFillRange = rList.Address 
     myDD.LinkedCell = wSheet.Cells(row, col + 2).Address 
     wSheet.Cells(row, col + 3).Formula = "=INDEX(" & rList.Address & "," & myDD.LinkedCell & ",1)" 
    End With 

End Sub 
+0

Wow, merci pour cela, je vais avoir al ook et revenir à vous – Rippo

+0

Option1 le fait pour moi! Merci beaucoup pour une réponse détaillée – Rippo

1

je tentais de trouver un plus net moyen de le faire alors pourrait aussi bien ressusciter cette question :) Voici comment j'ai résolu ce problème. Je crée un tableau des éléments avec lesquels je veux remplir le menu déroulant. Ensuite, en utilisant ce tableau, vous pouvez retourner la chaîne associée à l'index que vous obtenez dans la liste déroulante.

d'abord créer une fonction pour retourner un tableau de chaînes:

' Returns a string array of drop down items 
function dditems() as string() 

    Dim array(2) As String 

    array(1) = "cats" 
    array(2) = "dogs" 

    dditems = array 

end function 

ensuite utiliser ce tableau pour remplir votre menu déroulant:

' To populate your drop down 
sub populatedd() 

    dim dd As DropDown 
    dim i As Integer 
    dim itemsArray() As String 

    ' Create the dd object and item array 
    set dd = Worksheets("Sheet1").DropDowns("Drop Down 1") 
    set itemsArray = dditems() 

    ' Loop through the array to populate the drop down 
    for i = 1 to UBound(itemsArray) 

     dd.AddItem (itemsArray(i)) 

    next i 
end 

Ensuite, en utilisant ce tableau à nouveau, vous pouvez utiliser les éléments suivants code pour obtenir la chaîne associée à l'index déroulant sélectionné:

' Get the string associated with the index 
sub showDDResult() 

    dim dd As DropDown 
    dim itemsArray() As String 

    ' Create the dd object and item array 
    set dd = Worksheets("Sheet1").DropDowns("Drop Down 1") 
    set itemsArray = dditems() 

    ' dd.ListIndex returns index, call to array returns correct string 
    MsgBox("Item selected is " & itemsArray(dd.ListIndex)) 
end