Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno Excel: rozevírací seznam s předvolenou hodnotou

Mám excelový sešit v příloze. Sesit-2007.xlsm

Na listu konstanty jsou hodnoty, které chci povolit zadávat ve sloupci C na listu List1. Mám tam ale přidanou podmínku (ta byla vlastně vytvořena jako první!), že když v příslušném řádku sloupce A nic nebude (""), nebude se ani vyplňovat/vybírat hodnota ve sloupci C. A pokud ve sloupci A bude cokoliv napsáno, ve sloupci C bude moje defaultní hodnota, tedy "jedna".
=KDYŽ(A3="";"";"jedna")

Po vytvoření této podmínky jsem ve sloupci C dodal "Ověření hodnot" a nastavil povolenou oblast jako =konstanty!$B$3:$B$6

[90534-overeni-dat-png]

Takže to funguje tak:
- pokud ve sloupci A není nic, ve sloupci C stejného řádku také nic
- pokud je ve sloupci A cokoliv, ve sloupci C je uvedena hodnota "jedna" (bez úvozovek)
- pokud hodnotu "jedna" nechci, vyberu ze seznamu jinou (dvě, tři, čtyři). Tím dojde ke smazání té původní podmínky (vazba na sloupec A), to mi ale nevadí.

Takto to funguje v Excelu 2007.

Funguje to i po nakopírování do Excelu 2019.

Pokud to v Excelu 2019 uložím a otevřu v Excelu 2007, z celého listu se ztratilo jakékoliv ověření hodnot (všechny rozevírací seznamy). Opět toto uložím v Excelu 2007 a otevřu v Excelu 2019 - a tam to opět funguje jak má. V příloze je to jako sesit-2019b.xlsm, funguje to v Excelu 2019, v 2007 ne.

Absolutně netuším, proč a jak to tedy donutit fungovat i v Excelu 2007 (po úpravě v Excelu 2019). Prostě po uložení v Excelu 2019 ověření hodnot není v Exelu 2007 patrné, ale někde tam musí být, protože v 2019 to funguje.

---

Nad rámec tohoto problému hledám tedy jinou, možná jednodušší možnost, jak nastavit rozevírací seznam tak, aby to splňovalo ty mé požadavky, minimálně tu defaultní hodnotu "jedna", která platí pro 99% případů. Plus nevyplňovat ve sloupci C nic, když je příslušná řádek prázdný.

Celé to má ve skutečnosti několik tisíc řádků, v příkladu jsem to hodně zjednodušil.

Díky za rady.

Jsou zobrazeny jen nové odpovědi. Zobrazit všechny
Předmět Autor Datum
Ak sa dobre pamätám, zdroj pre rozbaľovací zoznam musel byť v dávnejších verziách Excelu na rovnakom…
robert13 25.06.2020 12:10
robert13
No, je to nějaké divné :-) A dá se nějak přednastavit defaultní hodnota, abych v těch 99% případech…
L-Core 25.06.2020 12:16
L-Core
A prečo nevyhovuje ten vzorec?
robert13 25.06.2020 12:16
robert13
Teď jsem to zkusil udělat v 2019, seznam přímo v ověření a v 2007 to funguje. Zkuaím tedy laborovat…
L-Core 25.06.2020 12:38
L-Core
Tak jo, je to tím... Zdroj dat pro ověření musí být na stejném listu, pak po uložení v Excelu 2019 j…
L-Core 25.06.2020 12:56
L-Core
Tohle omezení Excelu 2007 se dá obejít přes Správce názvů, stačí vytvořit definovaný název se "sezna…
Siki83 25.06.2020 13:25
Siki83
A ještě k tomu "když" a "ověření dat" společně: Nejprve se musí zadat "když", až pak do stejné buňky…
L-Core 25.06.2020 15:00
L-Core
A ešte k Tvoj,u postu zo 14:58 o tom, že to už máš čiastočne zaplnené dátami: - Ak už chceš definov…
robert13 25.06.2020 21:03
robert13
Díky, za tipy, vyzkouším. Ono bohužel ta skutečnost je oproti tomu mému příkladu mnohem složitější…
L-Core 25.06.2020 21:12
L-Core
Uviedol som len princíp, na zváženie použiteľnosti pre Tvoje potreby. Len sa mi zdalo, že si sa obáv…
robert13 25.06.2020 21:20
robert13
Ono je to hlavně složitější v tom, že na jednom listu mám třeba 4 sloupce, kde tohle musím řešit 1)…
L-Core 25.06.2020 22:16
L-Core
Myslím, že ani tak by to nemal byť problém. Rieš, ako považuješ za vhodné a kdyby něco, tak sme tu..…
robert13 26.06.2020 05:58
robert13
No, takže myslíš, že pro více oblastí, kde potřebuju vybírat hodnotu či zadávat default či nechat "n…
L-Core 26.06.2020 07:10
L-Core
Prikladám Ti ukážkový súbor, kde som kvôli otestovaniu nastavil prípustný rozsah riadkov od 10 do 20…
robert13 26.06.2020 09:57
robert13
Aha :i: No, vždycky se to posuzuje podle toho, zda ve sloupci A je nějaký text. Pokud ano, nastává…
L-Core 26.06.2020 10:18
L-Core
Tak počkať! To je iná situácia! Pokiaľ sa majú v troch rôznych stĺpcoch nastavovať defaulty len na z…
robert13 26.06.2020 12:52
robert13
Klucí a co k tomu přidat rovnou i to ověření dat?
Siki83 26.06.2020 13:53
Siki83
Klidně :-D Výborný nápad, veď rozbaľovací zoznam tam stačí mať len vtedy, keď to má význam... :beer:
robert13 26.06.2020 14:04
robert13
Hoši, máte u mě oba virtuální 12° Plzeň. A až někdy pojedete do Vídně, tak se cestou stavte na pohár…
L-Core 26.06.2020 14:46
L-Core
Trochu sem se v tom ještě povrtal a udělal nějaký úpravy, při případném přepisu existující hodnoty v… poslední
Siki83 26.06.2020 23:32
Siki83

Ak sa dobre pamätám, zdroj pre rozbaľovací zoznam musel byť v dávnejších verziách Excelu na rovnakom hárku ako rozbaľovací zoznam.

Máš dve možnosti:

1 zdroj premiestni do toho istého hárka (a môžeš ho vhodne ukryť)

2 nadefinuj si zoznam priamo v nástroji overenia údajov, potom nemusíš mať zdroj nikde v podobe pomocnej tabuľky.
Do políčka "Zdroj" rovno napíš: jedna; dvě; tři; čtyři

Síce hovoríš, že Ti to v 2007 pôvodne fungovalo, ale možno si len zabudol napísať, že medzitým si presunul konštanty do iného hárka...(?)
Alebo že by to bola podmienka len do Excelu 2003? Neviem...Skús... Možno pomôže už ten priamy zdroj... Zatiaľ si neviem predstaviť inú príčinu...

A ešte k Tvoj,u postu zo 14:58 o tom, že to už máš čiastočne zaplnené dátami:

- Ak už chceš definovať ten vlastný názov: definuješ ho len raz pre oblasť zdroja pre rozbaľovací zoznam a aplikuješ naraz na celú oblasť, kde majú byť rozbaľovacie zoznamy.
- Na vzorce zabudni, prelep celý stĺpec C hodnotami, tým sa zachová natvrdo všetko, čo tam doteraz máš (aj so zmenenými defaultnými hodnotami) a o ostatné sa Ti namiesto tých vzorcov postará to makro. Takže to nemusíš aplikovať až od prvej prázdnej hodnoty...

Uviedol som len princíp, na zváženie použiteľnosti pre Tvoje potreby. Len sa mi zdalo, že si sa obával o uchovanie jestvujúcich dát po zmenených defaultoch... alebo ich porušení po zmene definovania zdroja pre rozbaľovacie zoznamy... a zopakoval si nezlúčiteľnosť vzorca s overením údajov...
Tak veľa zdaru! :beer:

Ono je to hlavně složitější v tom, že na jednom listu mám třeba 4 sloupce, kde tohle musím řešit

1) vzoreček na default nebo prázdnou hodnotu
2) ověření dat - tedy když default přepíšu hodnotou ze seznamu povolených textů
3) každý takový sloupec pracuje s jinými hodnotami, na sobě nijak nezávislými

Představ si dlouhý řádek. Na tom, zda je ve sloupci A cokoliv, závisí, jak se bude chovat buňka ve sloupcích E, K, R, S. A pro každý sloupec platí úplně odlišné seznamy příslušných hodnot (např. jedna,dvě,tři - 10,20,30 - N,A - Petr,Pavel). Některé mohou být prázdné (tam tedy ta podmínka není), někde musí být nějaká hodnota (přednastaví se default, ručně je to možno měnit).

Nedokážu si představit, jak tohle narvat do kódu listu.

S tím vzorcem a ověřením to bude asi schůdnější. Pro mě určitě :)

No, takže myslíš, že pro více oblastí, kde potřebuju vybírat hodnotu či zadávat default či nechat "nic" by to mohlo fungovat (konktétně) takto?
(změnil jsem si rovnou AktOblA a přidal celkem tři oblasti)

Private Sub Worksheet_Change(ByVal Target As Range)

Dim Oblast As Range
Set Oblast = Range("D10:D5000")

    If Application.Intersect(Target, Oblast) Is Nothing Then Exit Sub
    
    If Target = "" Then
        Range("D" & Target.Row) = ""
        Else
        Range("D" & Target.Row) = "tuzemsko"
    End If

Dim Rezim As Range
Set Rezim = Range("K10:K5000")

    If Application.Intersect(Target, Rezim) Is Nothing Then Exit Sub
    
    If Target = "" Then
        Range("K" & Target.Row) = ""
        Else
        Range("K" & Target.Row) = "1"
    End If

Dim Insolvence As Range
Set Insolvence = Range("U10:U5000")

    If Application.Intersect(Target, Insolvence) Is Nothing Then Exit Sub
    
    If Target = "" Then
        Range("U" & Target.Row) = ""
        Else
        Range("U" & Target.Row) = "N"
    End If

End Sub

...jak na to koukám (teď to nemám jak vyzkoušet a za chvíli jedu pryč), tak netuším, zda je to takto poskládáno správně. Aby se po první části (tedy u mě nastavení toho "tuzemsko" - tedy default - to na řádku neukončilo (Then Exit Sub) a ve sloupcích K a U to neudělalo nic.

Možná nastavit ty Dim a Set hned nahoře?

A nad rámec tohoto konkrétního problému, jak by to bylo, kdybych na listu už nějaký VBA kód měl? Muselo by se to zkombinovat nějak dohromady nebo jen připlácnout na konec?
Dejme tomu, že to, co tu teď řeším, bych potřeboval přidat na list, kde už mám tento kód:


Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo Chyba
Application.EnableEvents = False
    If (Target.Column <> 6 _
        And Target.Column <> 7 _
        And Target.Column <> 8 _
        And Target.Column <> 12 _
        And Target.Column <> 16 _
        And Target.Column <> 20 _
        And Target.Column <> 24) _
        Or Target.Row < 5 Or Target > 311299 Or Target < 10100 Or Mid(Target, 6, 1) = "," Or Mid(Target, 7, 1) = "," Then
        Application.EnableEvents = True
        Exit Sub
    End If
    If Mid(Target, 5, 1) > 4 Then
        Stoleti = 19
        Else: Stoleti = 20
    End If
    Target = Left(Target, 2) & "." & Mid(Target, 3, 2) & "." & Stoleti & Right(Target, 2)
    
    Range("AG1:AG2").NumberFormat = ";;;"
    Range("AG1") = Target
    Range("AG2").FormulaR1C1 = "=IF(ISERROR(DATEVALUE(R[-1]C)),""Chyba"","""")"
    If Range("AG2") = "Chyba" Then
        Target.Select
        MsgBox "Zadané datum neexistuje!", vbCritical, "Pozor"
    End If
    Application.EnableEvents = True
    Exit Sub

Chyba:
    Application.EnableEvents = True
    Exit Sub
End Sub

To řešit nepotřebuji, to jsem teď jen vyhrabal z jiného souboru, jde mi jen o princip, jak to "spojit", když obě makra dělají něco jiného a mají platit v různých oblastech listu.

Prikladám Ti ukážkový súbor, kde som kvôli otestovaniu nastavil prípustný rozsah riadkov od 10 do 20 (v kóde v predchádzajúcej odpovedi som to nastavil po Tebou uvedený riadok 5000)
Napĺňanie "defaultami" som nechal podľa Teba v stĺpcoch D, K a U (tam prídu aj príslušné rozbaľovacie zoznamy) a teda ako testované stĺpce som dal vždy stĺpec pred nimi (pričom, samozrejme, to tak vôbec nemusí byť, ale podľa toho si musíš potom opraviť aj jednotlivé prípady Case. Napríklad ak sa má hodnota v stĺpci D naplniť podľa obsahu bunky v stĺpci A, tak namiesto Case 3 budeš musieť mať Case 1).
Case Else je miesto pre úkony, ktoré sa majú vykonať v prípade, že Target je síce v povolenom rozsahu riadkov, ale nie je ani v jednom zo stĺpcov ošetrených jednotlivými Case-mi.
Pozor! Obsah testovaných buniek môže byť napĺňaný len individuálne (nemôžeš vkladať naraz viac hodnôt, či už cez CTRL+ENTER, alebo kopírovaním oblasti a rovnako nemôžeš mazať naraz viac ako jednu bunku). Dá sa síce aj to ošetriť cez Target.Count ale už by kód geometricky narastal...

Aha :i:

No, vždycky se to posuzuje podle toho, zda ve sloupci A je nějaký text. Pokud ano, nastává rozhodování, co bude v těch dalších sloupcích (default nebo vybraná hodnota). Tohle bude IMHO taky špatně, nebo přinejmenším hloupě napsáno, to "case" je tam asi zbytečně, stačí prostě natvrdo nadefinovat "sloupec A":

Private Sub Worksheet_Change(ByVal Target As Range)

    If Target.Row < 10 Or Target.Row > 5000 Then Exit Sub
    
    Select Case Target.Column
        Case 1

            If Target = "" Then
                Range("D" & Target.Row) = ""
                Else: Range("D" & Target.Row) = "tuzemsko"
            End If

            If Target = "" Then
                Range("K" & Target.Row) = ""
                Else: Range("K" & Target.Row) = "1"
            End If

            If Target = "" Then
                Range("U" & Target.Row) = ""
                Else: Range("U" & Target.Row) = "N"
            End If

        Case Else

            Exit Sub
    End Select
    
End Sub

Tak počkať! To je iná situácia! Pokiaľ sa majú v troch rôznych stĺpcoch nastavovať defaulty len na základe obsahu bunky v stĺpci A, tak sa to všetko zjednoduší a Case je samozrejme zbytočné (súbor v prílohe):

Private Sub Worksheet_Change(ByVal Target As Range)

    If Target.Row < 10 Or Target.Row > 20 Or Target.Column <> 1 Then Exit Sub
    
    If Target = "" Then
        Range("D" & Target.Row) = ""
        Range("K" & Target.Row) = ""
        Range("U" & Target.Row) = ""
        Else:
            Range("D" & Target.Row) = "tuzemsko"
            Range("K" & Target.Row) = "1"
            Range("U" & Target.Row) = "N"
    End If
  
End Sub

Hoši, máte u mě oba virtuální 12° Plzeň. A až někdy pojedete do Vídně, tak se cestou stavte na pohárek.. :puff::beer:
Díky moc, s tím si už snadno poradím.

Značím vyřešeno a ukládám do archivu.

[6e36fda1a6273c0174352077e6b187a7.gif]

Akorát mi pořád hlodá v hlavě, proč se to tak divně chovalo v tom příkladě, co jsem uvedl (ten první soubor). Proč se funkčnost z 2007, fungující i v 2019 pak náhle v 2007 ztratí - a objeví se zase v 2019. Přitom je to pořád tentýž soubor.

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