Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[Rozwiązano] VBA - listy rozwijane z warunkiem.

kubala009 19 Kwi 2018 12:16 552 13
  • #1 19 Kwi 2018 12:16
    kubala009
    Poziom 4  

    Witam, mam problem z operacją na listach rozwijanych, możliwe że w ogóle się za to źle zabrałem i takie coś nie ma miejsca.
    Mam stworzone dwie listy rozwijane i chcę aby w tej drugiej wybierała się opcja w zależności co wybiorę z listy pierwszej np. mam jakąś tam baze z 6 słowami.

    Lista 1
    biały
    zielony
    żółty
    czarny
    czerwony
    brązowy

    Lista 2
    biały
    zielony
    żółty
    czarny
    czerwony
    brązowy

    Teraz potrzebuje zrobić warunek, że jezeli przykładowo wybiore z listy 1 biały to w liście 2 ustawi sie na czarny itp. Problem mam taki, że nie wiem jak odczytać wartość jaka aktualnie się znajduje w liście ;/ Proszę o jakiś prosty przykład na jednym czy 2 warunkach.

    0 13
  • #2 19 Kwi 2018 15:01
    marcinj12
    Poziom 40  

    Jak zrobiłeś te listy?

    0
  • #3 19 Kwi 2018 21:32
    kubala009
    Poziom 4  

    marcinj12 napisał:
    Jak zrobiłeś te listy?


    poprawność danych

    0
  • Pomocny post
    #4 19 Kwi 2018 21:55
    marcinj12
    Poziom 40  

    Może coś w tym stylu, jedynie o poprawność danych na drugiej liście musisz zadbać samemu: /pierwsza lista w A2, druga w B2/

    Kod: vbscript
    Zaloguj się, aby zobaczyć kod

    0
  • #5 20 Kwi 2018 06:34
    kubala009
    Poziom 4  

    marcinj12 napisał:
    Może coś w tym stylu, jedynie o poprawność danych na drugiej liście musisz zadbać samemu: /pierwsza lista w A2, druga w B2/
    Kod: vbscript
    Zaloguj się, aby zobaczyć kod


    A w jaki sposób mógłbym to jeszcze wykonać ? bo nie widzę problemu aby edytować lub stworzyć listy od nowa jeżeli miałoby mi to w przyszłości pomóc w innych sprawach.

    Dodatkowo teraz wpadłem na pomysł, że te listy moge z czasem powiększać, więc może mógłbym zrobić coś w stylu że jeżeli w liście 1 pokaże się wartość z komórki A2 to w drugiej liście A1 jeżeli w pierwszej A3 to w drugiej A5 itp. Może być na Case tylko nie mam pojęcia jak pobrać wartość komórki z danej listy.

    0
  • Pomocny post
    #6 20 Kwi 2018 10:01
    marcinj12
    Poziom 40  

    Zależy, czego potrzebujesz od listy.
    Poprawność danych tworzy trudną do zarządzania listę, za to łatwo ją powielić na wiele komórek.
    Znacznie lepiej zarządza się listami z zakładki Developer - lista jest dostępna jako kontrolki formularza lub ActiveX. Osobiście najczęściej korzystam z tej ostatniej.
    Jeżeli chodzi o synchronizację list to - ponownie - zależy od tego, czy jest pomiędzy nimi jakaś zależność, którą można oprogramować.
    Przykład z Select Case jest najbardziej łopatologiczny i pozwala oprogramować dowolne zależności.

    0
  • #7 20 Kwi 2018 10:32
    kubala009
    Poziom 4  

    marcinj12 napisał:
    Zależy, czego potrzebujesz od listy.
    Poprawność danych tworzy trudną do zarządzania listę, za to łatwo ją powielić na wiele komórek.
    Znacznie lepiej zarządza się listami z zakładki Developer - lista jest dostępna jako kontrolki formularza lub ActiveX. Osobiście najczęściej korzystam z tej ostatniej.
    Jeżeli chodzi o synchronizację list to - ponownie - zależy od tego, czy jest pomiędzy nimi jakaś zależność, którą można oprogramować.
    Przykład z Select Case jest najbardziej łopatologiczny i pozwala oprogramować dowolne zależności.



    Rozumiem, Teraz się dopatrzyłem, że potrzebuje jeszcze jednego warunku w tym wszystkim. Jeżeli w liście A28 występuje A lub B to przyjmuje lista 2 inne wartości. Czy poniższy sposób jest ok ?

    Dodatkowo w przyszłości chciałbym dodać jeszcze jedna listę która będzie zależna z lista 1. Przykładowo jeżeli w liście 1 i w liście 3 będzie niebieski to w liście 2 będzie czerwony. Taka sama zasada działania jak dotychczas tylko z tym że jest brane pod uwagę dwa warunki. Próbowałem to robić na Case z And ale nie wychodziło mi. Jest w ogóle taka możliwość ?

    Kod: vbscript
    Zaloguj się, aby zobaczyć kod

    0
  • Pomocny post
    #8 20 Kwi 2018 11:10
    marcinj12
    Poziom 40  

    Niestety, to nie tak.
    Jeżeli zrobiłeś listę jako poprawność danych, to tak naprawdę odwołujesz się do niej jak do pojedynczej komórki - możesz w VBA odczytać lub ustawić jej wartość, to ostatnie nawet bez sprawdzania, czy wartość jest na liście. Lista rozwijalna to nijako "dodatek" dla użytkownika.

    W przykładzie, który podałeś, jeżeli w A14 będzie "A", to w A16 będzie "czerwony", jeżeli w A14 będzie "B", to w A16 będzie "niebieski". Nie zmieniasz w ten sposób zawartości listy.

    Radzę albo zastosować kontrolkę listy typu ActiveX - i poszukać na necie przykładów jej użycia - albo modyfikować źródło listy.
    Źródło listy poprawności danych możesz ustawić albo wpisując wartości z palca, albo jako funkcję np. ustalającą dynamicznie zakres listy, albo jak nazwany zakres.
    Jeżeli ustawisz np. nazwany zakres, to z VBA możesz modyfikować wartości w danym zakresie.

    0
  • #9 20 Kwi 2018 12:37
    kubala009
    Poziom 4  

    Spróbuje tym sposobem co napisałem i zobaczę jak to wyjdzie bo jak na razie działa mi to. Nie zrozumiałeś chyba mojego zamysłu ten kod co podałem to tam głównie chodziło mi o listę 3 w komórce A28. Jeżeli jest tam produkcja to w zależności co jest w liście 1 A lub B będzie czerwony lub niebieski w innym przypadku czerwony n i niebieski n.

    Teraz jeszcze pytanko co do tego kodu. Dałem rade zrobić tak aby po wyborze z listy 1 A wypełniały się dwie inne listy jednocześnie czy to jest poprawnie zapisane ?

    Kod: vbscript
    Zaloguj się, aby zobaczyć kod


    Mógłbym prosić o jakiś przykład najlepiej z załącznikiem aby zrobić tą opcje ze sprawdzeniem 2 warunków dla jednego wyniku ?

    0
  • #10 20 Kwi 2018 12:47
    marcinj12
    Poziom 40  

    Listę w A14 masz na tym samym arkuszu, co A16 i C16? Jeśli tak, możesz wszystkie pominąć Sheets("porównanie ceny produkcji"). Bez tych dodatkowych dwykropków bym wpisał:

    Kod: vbscript
    Zaloguj się, aby zobaczyć kod


    Lepiej, gdyby warunek
    Kod: vbscript
    Zaloguj się, aby zobaczyć kod
    był pierwszym warunkiem w zdarzeniu. Jeżeli chcesz rozróżniać warunek Produkcja w A28, to raczej wewnątrz tego warunku zrób if.

    0
  • Pomocny post
    #11 20 Kwi 2018 12:53
    lanzul
    Poziom 27  

    kubala009 napisał:
    dwie listy rozwijane i chcę aby w tej drugiej wybierała się opcja w zależności co wybiorę z listy pierwszej

    Sprawdź np. tutaj, może się coś nada:
    https://www.elektroda.pl/rtvforum/viewtopic.php?p=16550597
    https://www.elektroda.pl/rtvforum/viewtopic.php?p=16768408
    To pewnie tylko jedne z wielu miejsc, gdzie można coś znaleźć o listach zależnych, musisz więc trochę poszukać przez wyszukiwarkę forumową.
    Poza tym, jak napisał marcinj12, lista poprawności nie jest najwdzięczniejszym rozwiązaniem do takich operacji.
    To bardzo proste "narzędzie", które trudno zmienić pod "zaawansowane" potrzeby.

    0
  • #12 24 Kwi 2018 17:22
    kubala009
    Poziom 4  

    Mam jeszcze jedno pytanko związane z listami poprawność danych.
    Mam 10 list w nich dodane od 15 do 20 wartości ii co jakiś czas dochodzi mi kilka wartości do rożnych list, więc za każdym razem muszę zmieniać zakres. Próbowałem robić tak aby robić zakres już na przód przykładowo o 5 komórek więcej ale wtedy zostają w liście puste pole i brzydko to wygląda.

    Jest możliwośc napisania makra aby lista powiększała się jeżeli komórka się zapełni lub też aby schować te puste pola w liście dopóki nie będzie tam wartości ?

    0
  • Pomocny post
    #13 25 Kwi 2018 17:56
    lanzul
    Poziom 27  

    Nie trzeba makra, np. jeśli w kolumnie 'A' arkusza 'Arkusz1' chcemy mieć "dynamiczną" listę "czegoś tam", to tworzymy sobie nazwę zdefiniowaną:

    Nazwy zdefiniowane => jakaś_nazwa_zdefiniowana => Odwołuje się do => =ADR.POŚR("Arkusz1!$A$2:$A$" & ILE.NIEPUSTYCH(Arkusz1!$A:$A))

    i tę nazwę wstawiamy do listy sprawdzania poprawności jako 'Źródło'.

    Oczywiście makrem też można to zrobić, trzeba użyć obiektu 'Validation'.

    0
  • #14 26 Kwi 2018 09:59
    kubala009
    Poziom 4  

    Dziękuje za pomoc w rozwiązaniu problemu.

    0