Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem Rozevírací seznam závislý na jiném rozevíracím seznamu v excelu

Dobrý den,

potřebuju vytvořit rozevírací seznam (který bude vypadat jako příloha 1) a bude nabízet hodnoty v závislosti na hodnotě v jiném otevíracím seznamu, vím že se to dá udělat přes ověření dat, ale když vytvořím seznam přes ověření dat vznikne mi jen šipka (viz příloha 2) a já potřebuji aby vypadal jako tabulka se šipkou (příloha 1).
Jaký je vůbec rozdíl mezi přílohou 1 a 2?

Děkuji

Předmět Autor Datum
http://office.lasakovi.com/excel/data/propojene-seznamy-overeni-dat-excel/
robert13 27.11.2017 10:54
robert13
Děkuji za odpověď, nicméně já vím jak to udělat přes ověření dat, ale potřebuji a by výsledný seznam…
RickSanchez 27.11.2017 11:32
RickSanchez
Špatně se vyjadřuji, potřebuji vytvořit na sebe navazující rozbalovací seznamy ve ''Formulář'' stej…
RickSanchez 27.11.2017 15:47
RickSanchez
dyť jo. V prílohe prikladám ukážkový príklad z Lasákových stránok. V stĺpci A si vyberieš zo zoznamu…
robert13 27.11.2017 15:57
robert13
Aha, ve Formulár? Tak potom to už nie je Overovanie údajov ale vo VBA
robert13 27.11.2017 15:58
robert13
To je můj problém, já to chápu jak to vytvořit ve ověření dat, ale nevím jak to udělat ve formuláři,…
RickSanchez 27.11.2017 16:01
RickSanchez
Uz nie som na pc, ale ak si dobre spominam, tak na Lasakovych stranke je i dalsi vzorovy subor, kde…
robert13 27.11.2017 18:23
robert13
Koukni do přiloženého souboru. Jedná se o prvky ActiveX. Data jsem si "vypůjčil ze souboru od Lasáka…
Siki83 27.11.2017 21:10
Siki83
Mockrát děkuji.
RickSanchez 28.11.2017 07:37
RickSanchez
Dá sa to aj s ovládacími prvkami formulára (bez overovania údajov), avšak len pomocou pomocných tabu…
robert13 28.11.2017 09:59
robert13
Děkuji za další možnost, ale už jsem začal se Sikiho variantou která fungoval na všechny 3tabulky, n…
RickSanchez 29.11.2017 10:09
RickSanchez
Narazil jsem na problem, potřebuju vytvořit podmínku pro 3 box, box 1 = typ potrubí (8možností), box…
RickSanchez 29.11.2017 12:48
RickSanchez
To je presne to, na čo som myslel, keď som vravel, že sa to začne nabaľovať, akonáhle budeš potrebov…
robert13 29.11.2017 13:43
robert13
Private Sub ComboBox30_Change() Dim x As Byte Dim y As Byte On Error Resume Next x = ComboBox30.Lis…
RickSanchez 29.11.2017 14:14
RickSanchez
V podstate by to šlo poriešiť i takto ale máš tam chaos v Select Case. Musíš dôsledne odlišovať Case…
robert13 29.11.2017 14:47
robert13
Díky
RickSanchez 29.11.2017 14:54
RickSanchez
akurát som to ešte upravoval, keď mi znemožnila Tvoja reakcia zmeniť pôvodný príspevok, takže ešte z…
robert13 29.11.2017 14:56
robert13
super funguje, teď už jenom v tomto stylu udělám zbylých 7řádku a je to. díky
RickSanchez 29.11.2017 15:22
RickSanchez
pohoda, klídek, tabáček :puff::beer:
robert13 29.11.2017 15:24
robert13
Až budu mít hotový kód pro box 3 ta ho sem dám
RickSanchez 29.11.2017 15:26
RickSanchez
:-D Hlavne to otestuj, či neexistujú kombinácie, ktoré ostali neošetrené a týmpádom vedú do nezmyslo…
robert13 29.11.2017 15:29
robert13
Private Sub ComboBox30_Change() Dim x As Byte Dim y As Byte On Error Resume Next x = ComboBox2.List…
RickSanchez 29.11.2017 15:29
RickSanchez
Síce asi odsádzaš, ale sem si to vložil tak, že to nie je vidieť. Ak sem vkladáš kód, najprv si v ik…
robert13 29.11.2017 15:33
robert13
No a keďže sa Ti tam u viacerých Case x opakujú tie isté delenia pre Case y, môžeš to spriahnuť a vý…
robert13 29.11.2017 20:35
robert13
A keďže je tam čiastočná zhoda medzi blokmi x=2, 6 a x=4, 8, dá sa to ešte zjednodušiť a celý kód bu…
robert13 29.11.2017 20:54
robert13
No a ešte môžeme vyňať ComboBox58: Private Sub ComboBox30_Change() Dim x As Byte Dim y As Byte On E… poslední
robert13 30.11.2017 10:09
robert13

To je můj problém, já to chápu jak to vytvořit ve ověření dat, ale nevím jak to udělat ve formuláři, protože potřebuji aby ten seznam graficky vypadal jak formulář, proto jsem dával v příloze ty dva obrázky, vysup musí vypadat jako obr1 ne jak 2

Uz nie som na pc, ale ak si dobre spominam, tak na Lasakovych stranke je i dalsi vzorovy subor, kde su pouzite tvoje graficke prvky.
Samozrejme ze si ich usporiadas podla svojich potrieb, ide o pouzitie principu sucinnosti.
Ak ti to do zajtra nikto neporadi, alebo na to neprides sam, mozeme sa na to zajtra cca o 9:00 pozriet.

Koukni do přiloženého souboru. Jedná se o prvky ActiveX. Data jsem si "vypůjčil ze souboru od Lasáka".
Karta Vzorce -> Definované názvy -> Správce Názvů = Obsahuje definované názvy jednotlivých voleb (použito ve VBA).
Combobox1 -> Vlastnosti -> ListFillRange -> oblast buněk A2:A4
Combobox2 = jednotlivé hodnoty se načítají pomocí VBA do kterého se dostaneš pomocí klávesové zkratky ALT+F11.

Dá sa to aj s ovládacími prvkami formulára (bez overovania údajov), avšak len pomocou pomocných tabuliek. Viď príloha. To je zjednodušená ukážka druhého vzorového súboru Lasákových, čo som spomínal.
Pomocné tabuľky sú skryté v stĺpcoch G÷N.

Rozhodne elegantnejšie je riešenie Sikiho.

V oboch prípadoch sa situácia začne komplikovať, akonáhle bude tretí zoznam podmienený kombináciou prvých dvoch. Bude to len obsiahlejšie, nie však nemožné.

Narazil jsem na problem, potřebuju vytvořit podmínku pro 3 box, box 1 = typ potrubí (8možností), box 2 = průměr potrubí (22možností), box3 výrobní rozměry (2možnosti), př. když box 1 = 1 a zároveň box 2 = 1 až 10 potom box 3 = možnost 1 (možnost1= 6m, možnost 2 = 100m)

jak to udělat?

To je presne to, na čo som myslel, keď som vravel, že sa to začne nabaľovať, akonáhle budeš potrebovať 3. box v závislosti od stavov prvého a druhého... Pre univerzálne riešenie musíš vytvoriť toľko zdrojov 3. zoznamu, koľko kombinácií 1. a 2. zoznamu bude vyžadovať koľko rôznych ponúk pre 3. box. Každému zdroju zoznamu 3. boxu priradiť meno a každej kombinácii výberu z 1. a 2. boxu musíš priradiť príslušné meno zoznamu.
Bez pomocnej bunky (pomocných buniek), kde sa Ti excelovskými vzorcami bude vyskladávať meno zdroja pre zoznam 3. boxu, to nepôjde.
3. box bude naviazaný na túto bunku, takže podľa toho, čo sa ti na základe výberu z 1. a 2. boxu vyskladá v tejto bunke, taký zdroj sa natiahne pre 3. box
Jasné? :-D
Mimochodom, práve tento typ úlohy rieši ten druhý ukážkový súbor Lasákových, na ktorý som odkazoval, ale treba ho najprv hĺbkovo preštudovať, pochopiť a potom aplikovať pre svoj prípad...

Private Sub ComboBox30_Change()
Dim x As Byte
Dim y As Byte

On Error Resume Next
x = ComboBox30.ListIndex
y = ComboBox2.ListIndex
On Error GoTo 0

Select Case x

Case Is = 0
Select Case y
Case Is = 0
ComboBox58.ListFillRange = ""
End Select
Case Is = 1
Select Case y
Case Is = 1 Or 2 Or 3 Or 4 Or 5 Or 6 Or 7 Or 8 Or 9 Or 10
ComboBox58.ListFillRange = "vera"
End Select
Case Is = 1
Select Case y
Case Is = 11 Or 12 Or 13 Or 14 Or 15 Or 16 Or 17 Or 18 Or 19 Or 20 Or 21 Or 22
ComboBox58.ListFillRange = "verb"
End Select
End Sub

Nešlo by jen nějak todle upravit, kdby to bylo v Pascalu tak použi ''if'' a ''then''

V podstate by to šlo poriešiť i takto ale máš tam chaos v Select Case.
Musíš dôsledne odlišovať Case pre x v rámci ktorého budeš mať množiny Case pre y.
Musíš prebrať všetky prípady x a všetky prípady y.
V rámci jedného Case pre x musíš prebrať všetky prípady pre y, t.j. nemôžeš pre jedno x prebrať len jednu množinu y a druhú množinu y dať do ďalšieho case x keď sa jedná o to isté x.
Významne sa Ti kód sprehľadní, ak budeš jednotlivé bloky odsadzovať aby na prvý pohľad bolo jasné, kde začína blok pre x a kde pre y... a pod...

Takže Tvoj kód po úprave:

Private Sub ComboBox30_Change()
Dim x As Byte
Dim y As Byte

On Error Resume Next
x = ComboBox30.ListIndex
y = ComboBox2.ListIndex
On Error GoTo 0

Select Case x
    Case Is = 0
        Select Case y
            Case Is = 0
                ComboBox58.ListFillRange = ""
        End Select
    Case Is = 1
        Select Case y
            Case Is = 1 Or 2 Or 3 Or 4 Or 5 Or 6 Or 7 Or 8 Or 9 Or 10
                ComboBox58.ListFillRange = "vera"
            Case Is = 11 Or 12 Or 13 Or 14 Or 15 Or 16 Or 17 Or 18 Or 19 Or 20 Or 21 Or 22
                ComboBox58.ListFillRange = "verb"
        End Select
End Select
End Sub

P.S. Nie som si istý, či ListIndex môže byť 0 ale prikladám Ti link z ktorého vyčítaš možnosti a spôsoby použitia Select Case:
http://office.lasakovi.com/excel/vba-teorie-zaklady/select-case-excel-vba/
A myslím, že budeš musieť poošetrovať i ďalšie možné stavy: Case Else (záleží, či vylúčiš napr možnosť voliť v boxe 2 ak box 1 nie je navolený priradením prázdnej množiny ako zdroja pre box 2, alebo budeš musieť použiť Case Else)

akurát som to ešte upravoval, keď mi znemožnila Tvoja reakcia zmeniť pôvodný príspevok, takže ešte zjednodušenejšie:

Private Sub ComboBox30_Change()
Dim x As Byte
Dim y As Byte

On Error Resume Next
x = ComboBox30.ListIndex
y = ComboBox2.ListIndex
On Error GoTo 0

Select Case x
    Case 0
        Select Case y
            Case 0
                ComboBox58.ListFillRange = ""
        End Select
    Case 1
        Select Case y
            Case 1 To 10
                ComboBox58.ListFillRange = "vera"
            Case 11 To 22
                ComboBox58.ListFillRange = "verb"
        End Select
End Select
End Sub

Private Sub ComboBox30_Change()
Dim x As Byte
Dim y As Byte

On Error Resume Next
x = ComboBox2.ListIndex
y = ComboBox30.ListIndex
On Error GoTo 0

Select Case x
Case 0
Select Case y
Case 0
ComboBox58.ListFillRange = ""
End Select
Case 1
Select Case y
Case 1 To 10
ComboBox58.ListFillRange = "vera"
Case 11 To 22
ComboBox58.ListFillRange = "verb"
End Select
Case 2
Select Case y
Case 1 To 5
ComboBox58.ListFillRange = ""
Case 6 To 7
ComboBox58.ListFillRange = "vera"
Case 8 To 22
ComboBox58.ListFillRange = "verb"
End Select
Case 3
Select Case y
Case 1 To 7
ComboBox58.ListFillRange = "vera"
Case 8 To 22
ComboBox58.ListFillRange = "verb"
End Select
Case 4
Select Case y
Case 1 To 5
ComboBox58.ListFillRange = "verb"
Case 6 To 7
ComboBox58.ListFillRange = "vera"
Case 8 To 22
ComboBox58.ListFillRange = "verb"
End Select
Case 5
Select Case y
Case 1 To 10
ComboBox58.ListFillRange = "vera"
Case 11 To 22
ComboBox58.ListFillRange = "verb"
End Select
Case 6
Select Case y
Case 1 To 5
ComboBox58.ListFillRange = ""
Case 6 To 7
ComboBox58.ListFillRange = "vera"
Case 8 To 22
ComboBox58.ListFillRange = "verb"
End Select
Case 7
Select Case y
Case 1 To 7
ComboBox58.ListFillRange = "vera"
Case 8 To 22
ComboBox58.ListFillRange = "verb"
End Select
Case 8
Select Case y
Case 1 To 5
ComboBox58.ListFillRange = "verb"
Case 6 To 7
ComboBox58.ListFillRange = "vera"
Case 8 To 22
ComboBox58.ListFillRange = "verb"
End Select
End Select
End Sub

otestováno, funguje perfektně

Síce asi odsádzaš, ale sem si to vložil tak, že to nie je vidieť.
Ak sem vkladáš kód, najprv si v ikonách nad textovým poľom vyber šiestu ikonu Code a medzi ne vlep schránku so svojim kódom... tak schválne... ešte raz...

A ak funguje, potom OK. A vidím, že si zbadal aj to zjednodušenie vo forme "n To m"

No a keďže sa Ti tam u viacerých Case x opakujú tie isté delenia pre Case y, môžeš to spriahnuť a výsledný kód sa zjednoduší cca na polovicu:

Private Sub ComboBox30_Change()
Dim x As Byte
Dim y As Byte

On Error Resume Next
x = ComboBox2.ListIndex
y = ComboBox30.ListIndex
On Error GoTo 0

Select Case x
    Case 0
        Select Case y
            Case 0
                ComboBox58.ListFillRange = ""
        End Select
    Case 1, 5
        Select Case y
            Case 1 To 10
                ComboBox58.ListFillRange = "vera"
            Case 11 To 22
                ComboBox58.ListFillRange = "verb"
        End Select
    Case 2, 6
        Select Case y
            Case 1 To 5
                ComboBox58.ListFillRange = ""
            Case 6 To 7
                ComboBox58.ListFillRange = "vera"
            Case 8 To 22
                ComboBox58.ListFillRange = "verb"
        End Select
    Case 3, 7
        Select Case y
            Case 1 To 7
                ComboBox58.ListFillRange = "vera"
            Case 8 To 22
                ComboBox58.ListFillRange = "verb"
        End Select
    Case 4, 8
        Select Case y
            Case 1 To 5
                ComboBox58.ListFillRange = "verb"
            Case 6 To 7
                ComboBox58.ListFillRange = "vera"
            Case 8 To 22
                ComboBox58.ListFillRange = "verb"
        End Select
End Select
End Sub

A keďže je tam čiastočná zhoda medzi blokmi x=2, 6 a x=4, 8, dá sa to ešte zjednodušiť a celý kód bude:

Private Sub ComboBox30_Change()
Dim x As Byte
Dim y As Byte

On Error Resume Next
x = ComboBox2.ListIndex
y = ComboBox30.ListIndex
On Error GoTo 0

Select Case x
    Case 0
        Select Case y
            Case 0
                ComboBox58.ListFillRange = ""
        End Select
    Case 1, 5
        Select Case y
            Case 1 To 10
                ComboBox58.ListFillRange = "vera"
            Case 11 To 22
                ComboBox58.ListFillRange = "verb"
        End Select
    Case 2, 4, 6, 8
        Select Case y
            Case 1 To 5
                If x = 2 Or x = 6 Then ComboBox58.ListFillRange = ""
                If x = 4 Or x = 8 Then ComboBox58.ListFillRange = "verb"
            Case 6 To 7
                ComboBox58.ListFillRange = "vera"
            Case 8 To 22
                ComboBox58.ListFillRange = "verb"
        End Select
    Case 3, 7
        Select Case y
            Case 1 To 7
                ComboBox58.ListFillRange = "vera"
            Case 8 To 22
                ComboBox58.ListFillRange = "verb"
        End Select
End Select
End Sub

No a ešte môžeme vyňať ComboBox58:

Private Sub ComboBox30_Change()

Dim x As Byte
Dim y As Byte

On Error Resume Next
x = ComboBox2.ListIndex
y = ComboBox30.ListIndex
On Error GoTo 0

With ComboBox58
    Select Case x
        Case 0
            Select Case y
                Case 0
                    .ListFillRange = ""
            End Select
        Case 1, 5
            Select Case y
                Case 1 To 10
                    .ListFillRange = "vera"
                Case 11 To 22
                    .ListFillRange = "verb"
            End Select
        Case 2, 4, 6, 8
            Select Case y
                Case 1 To 5
                    If x = 2 Or x = 6 Then .ListFillRange = ""
                    If x = 4 Or x = 8 Then .ListFillRange = "verb"
                Case 6 To 7
                    .ListFillRange = "vera"
                Case 8 To 22
                    .ListFillRange = "verb"
            End Select
        Case 3, 7
            Select Case y
                Case 1 To 7
                    .ListFillRange = "vera"
                Case 8 To 22
                    .ListFillRange = "verb"
            End Select
    End Select
End With

End Sub

a už fakt dosť :-D

Zpět do poradny Odpovědět na původní otázku Nahoru