Avatar billede floffi_d Nybegynder
23. juni 2010 - 15:07 Der er 6 kommentarer og
1 løsning

Flere afhængige dropdown menuer

Jeg arbejder på et ark hvor jeg skal bruge flere (lige nu 4) afhængige dropdown menuer.
Først lavede jeg det med =INDIREKTE(liste navn) dropdowns.
Men da nogle af under menuerne har samme titel kom det ikke til at virke.
Så har jeg været ved at lave det med =SAMMENLIGN og FORSKYDNING funktioner. Men der er det et problem at forskyde matrixen så den passser.
Er den en der har en god ide til en løsning, evt med noget VB.

Opbygningen af arket med opslags data er sådan (ikke rigtig indhold)

    A      B      C    D    E      F
1    Butik  | Frugt  | Æble  | Rød    | Grøn  | Gul  |
2                            | Pære  | Rund  | Lang  |
3                            | Drue    | Sød    | Sur    |
4                | Slik    |Bonbon| Pind  | Pose |
5                            |Haribo| Pose  | Pakke |
6    Lager | Frugt | Æble  | Rød | Gul    |
7                            | Pære | Rund| Lang | Sød |
8                            | Drue | Sød  | Sur  | Grøn| Blå |
9                | Slik  |Bonbon| Pind| Pose | Pakke|
10                          |Haribo| Pose| Pakke| Kasse|


Så skal jeg bruge en Drop Til kolonne A
En dropdown til B en til C
Og en sidste til kolonner der står noget i udfra det valg man er nået frem til.
Hvis man vælger 1. "LAGER"  2. "SLIK" 3. "HARIBO" så skal man i den sidste kunne vælge "POSE" "PAKKE" "KASSE"

Jeg er ikke sikker på dette er en nem opgave så den gir 150 Point.
Avatar billede supertekst Ekspert
23. juni 2010 - 17:17 #1
Kunne det være i en Userform(dialogboks), der henter data fra selve Excel-arket og leverer resultatet i arket igen?
Avatar billede japping Nybegynder
23. juni 2010 - 17:51 #2
Du kan også anvende et filter, hvis du udfylder alle felterne i hver linie, hvilket kommer til at se således ud:

1    Butik  | Frugt  | Æble  | Rød    | Grøn  | Gul  |
2    Butik  | Frugt  | Æble | Pære  | Rund  | Lang  |
3    Butik  | Frugt  | Æble | Drue    | Sød    | Sur    |

osv...

Ved automatisk filter får du en dropdown knap, hvor man kan vælge til og fra på hver enkelt kolonne.

Du skriver ikke noget om kravet til brugerinterface, så jeg går ud fra at du kan anvende denne metode.
Avatar billede floffi_d Nybegynder
24. juni 2010 - 09:08 #3
@japping
Jeg skulle gerne bruge et ark som "input" ark og så have alle opslags dataene på et separat ark. så filter er ikke muligt at bruge.

@supertekst
Jeg har ikke arbejdet med userforms før, så ved ikke om det er muligt. Men vil lige kigge på mulighederne.

Det skal siges Data arket har ca 200 Rækker og op til 25 kolonner

Ved ikke om det gør nogen forskel
Avatar billede supertekst Ekspert
24. juni 2010 - 11:22 #4
Har du mulighed for at sende filen? @-adr. under profil.
Avatar billede supertekst Ekspert
25. juni 2010 - 09:40 #5
Vba-kode i Userform - en listbox viser de udført valg:

Dim ddTabel(4, 3) As Integer
Dim errorData As Worksheet, inputData As Worksheet

Dim niveauNr As Byte, maxRæk As Integer, maxKol As Integer, maxNiveau As Byte
Dim kol As Integer, rækStart As Integer, rækSlut As Integer
Dim niveauTekst As String, spinFlag As Boolean
Private Sub SpinButton1_spinUp()
    If niveauNr + 1 <= 4 Then
        niveauNr = niveauNr + 1
        spinResult
       
        ajfLabel niveauNr, Me.ListBox1.List(ddTabel(niveauNr, 1))
    End If
End Sub
Private Sub SpinButton1_spinDown()
    If niveauNr - 1 >= 1 Then
        ajfLabel niveauNr, ""

        niveauNr = niveauNr - 1
        spinResult
    End If
End Sub
Private Sub spinResult()
        rækStart = ddTabel(niveauNr, 2)
        rækSlut = ddTabel(niveauNr, 3)
       
        If rækStart > 0 And rækSlut > 0 Then
            visNiveau niveauNr
           
            Me.ListBox1.ListIndex = ddTabel(niveauNr, 1)
        End If
End Sub
Private Sub UserForm_activate()
    Set inputData = ActiveWorkbook.Sheets("Input")
    Set errorData = ActiveWorkbook.Sheets("Error Data")
   
    maxNiveau = 0
   
    With errorData
        maxRæk = .Cells(1, 1).SpecialCells(xlLastCell).Row
        maxKol = .Cells(1, 1).SpecialCells(xlLastCell).Column
    End With
   
    niveauNr = 1
    rækStart = 2
    rækSlut = maxRæk
   
    visNiveau niveauNr
End Sub
Private Sub visNiveau(nr)
Dim ræk As Integer, kol As Integer, tekst As String
    Me.ListBox1.Clear
   
Rem Valg-mulighed i kolonnen
    If nr >= 1 And nr <= 3 Then
        kol = nr
        Me.ListBox1.Clear
       
        For ræk = rækStart To rækSlut
            If Trim(errorData.Cells(ræk, kol)) <> "" Then
                Me.ListBox1.AddItem errorData.Cells(ræk, kol)
            End If
        Next ræk
    Else
Rem Valg-mulighed i rækken
        If niveauNr = 4 And rækStart > 0 Then
            Me.ListBox1.Clear
       
            For kol = niveauNr To maxKol
                If Trim(errorData.Cells(rækStart, kol)) <> "" Then
                    Me.ListBox1.AddItem errorData.Cells(rækStart, kol)
                End If
            Next kol
        End If
    End If
   
    Me.ListBox1.ListIndex = -1
End Sub
Private Sub ListBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    If Me.ListBox1.ListIndex <> -1 Then
        niveauTekst = Me.ListBox1
        ddTabel(niveauNr, 1) = Me.ListBox1.ListIndex
        ddTabel(niveauNr, 2) = rækStart
        ddTabel(niveauNr, 3) = rækSlut

        ajfLabel niveauNr, niveauTekst
       
        If niveauNr > 0 And niveauNr < 4 Then
            findRækNr niveauTekst
           
            niveauNr = niveauNr + 1
            If niveauNr > maxNiveau Then
                maxNiveau = niveauNr
            End If
           
            visNiveau niveauNr
        End If
    End If
End Sub
Private Sub findRækNr(tekst)
Dim område As String, r As Integer
    område = Chr(64 + niveauNr) & CStr(rækStart) & ":" & Chr(64 + niveauNr) & CStr(rækSlut)
    With errorData.Range(område)
        Set c = .Find(tekst, LookIn:=xlValues, LookAt:=xlWhole)
        If Not c Is Nothing Then
            rækStart = c.Row
            rækSlut = maxRæk
           
            For r = rækStart + 1 To maxRæk
                If Range(Chr(64 + niveauNr) & CStr(r)) <> "" Then
                    rækSlut = r - 1
                    Exit For
                End If
            Next r
        Else
            rækStart = 0
        End If
    End With
End Sub
Private Sub ajfLabel(nr, indhold)
Dim cc As Control
    Set cc = UserForm1.Controls("Label" & CStr(nr))
    cc.Caption = indhold
End Sub
Avatar billede floffi_d Nybegynder
25. juni 2010 - 10:56 #6
Super godt.

Tusind tak for hjælpen.
Avatar billede supertekst Ekspert
25. juni 2010 - 14:11 #7
selv tak..
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi har et stort udvalg af Excel kurser. Find lige det kursus der passer dig lige her.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester