Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Computer Controls
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[Solved] VBA excel Pojawiający się i znikający CommandButton

magdabar 05 Dec 2019 22:18 720 12
  • #1
    magdabar
    Level 5  
    Z góry uprzedzam że jestem kompletnym laikiem w VBA – brakuje mi podstaw. W pracy miałam do czynienie z arkuszem obliczeniowym napisanym x lat temu w VBA w excelu który musiałam przystosować do zmieniających się przepisów i norm. Sprawiło mi to wiele frajdy, ale było to – najpierw delikatne grzebanie w cudzym kodzie, później pisanie na tej podstawie własnego przy pomocy forów internetowych i fragmentów kodów z podręczników wypatrzonych w internecie. Potem napisałam jeszcze coś swojego a było to…. jakieś 6 lat temu. Podsumowując wstęp – dawno i nieprawda ;) ale do rzeczy.
    Postanowiłam napisać „grę” pomagającą dziecku w nauce tabliczki mnożenia. Gra miała polegać na tym, że pojawiają się kolejne pytania – głównie typu: „Ile to jest 9 x 9?” itp. Delikwent ma wpisać odpowiedź. Jeśli jest ona poprawna – pojawia się kolejna literka hasła wskazująca gdzie jest ukryty skarb. Jeśli odpowiedź jest niepoprawna wymazują się wszystkie do tej pory odgadnięte literki hasła i gra zaczyna się od początku – tak żeby w kółko powtarzać tabliczkę mnożenia ;)
    Zaczęłam pisać – i pewnie dla znawców to co napisałam to jakiś koszmar, bo można to było zrobić lepiej, ale jakiś tam efekt jest, niestety pojawił się problem nie do przejścia dla mnie stąd prośba o pomoc.
    Sprawa wygląda tak – mam 2 arkusze: jeden nazywa się „dane” – tam są wszystkie pytania i odpowiedz, drugi nazywa się „dialog” – tam się gra. Po pierwsze – wymusiłam każdorazowe otwieranie pliku na arkuszu „dialog” – to działa. Po otwarciu pojawia się InputBox – który nakazuje wpisać imię gracza – imię pokazuje się w odpowiednim miejscu arkusza „dialog” – więc to też działa.
    Następnie gracz powinien przeczytać – wyłuszczony napis w „dialog” że jeśli chce znaleźć skarb to musi odpowiedzieć na pytania stworka dzięki czemu odgadnie hasło i dowie się gdzie skarb. Zrobiłam CommandButton z napisem GRAJ!, którego naciśnięcie powoduje pojawienie się w TextBox2 pierwszego pytania – to też działa. Następnie gracz wpisuje – w normalnej komórce excel (może nie do końca normalnej bo scalonej co też gdzieś tam było problemem, ale już rozwiązanym) – odpowiedź na pytanie. Ponieważ nie umiem tego zrobić w żaden inny sposób – żeby sama odpowiedź wywoływała dalsze pytania – zrobiłam przycisk „CommandButton_SPRWDZ1” po naciśnięciu, którego następuje weryfikacja odpowiedzi. Jeśli odpowiedź jest dobra – pojawia się pierwsza literka hasła, a w TextBox2 ukazuje się pytanie nr 2 – i do tej pory wszystko działa.
    Jeśli odpowiedź jest błędna – pojawia się MsgBox z napisem „BŁAD!BŁĄD! i dwoma przyciskami „Ponów próbę” i „Anuluj” (w sumie nie wiem po co ten „anuluj”, ale…. jakieś znaczenie jak się później okazało – zaskakujące – ma). Naciśnięcie przycisku „Ponów próbę” miało likwidować wszystkie do tej pory trafione literki hasła i rozpoczynać grę od początku – tak jakby znów nacisnąć przycisk „GRAJ!” - tu pojawił się drobny problem: nie wiem jak to zrobić automatycznie więc po naciśnięciu „Ponów próbę” ukazuje się kolejny MsgBox informujący że należy wcisnąć przycisk „GRAJ!” – i to działa. No i przechodzę (w końcu) do mojego problemu:
    Jeśli odpowiedź na pytanie nr 1 jest poprawna w TextBox2 pojawia się drugi pytanie. Niestety odpowiedzi wciąż są weryfikowane tym samym „CommandButton_SPRWDZ1” więc jakiejkolwiek odpowiedzi na pytanie 2 gracz by nie wpisał (jeśli nie będzie to 81 – czyli odpowiedź na pytanie nr 1) to zawsze odpowiedź zostanie potraktowana jako błędna i pojawi się MsgBox z napisem „BŁAD!BŁĄD! i dwoma przyciskami „Ponów próbę” i „Anuluj” i tak w kółko….. i w związku z tym ze nie umiem sprawić żeby przycisk „CommandButton_SPRWDZ1” weryfikował wszystkie pytania – bo w kodach pojawia mi się informacja że taka akcja już istnieje, dopisałam kolejne przyciski: „CommandButton_SPRWDZ2”, „CommandButton_SPRWDZ3” itd. Chciałam wymusić ich widzialność lub niewidzialność zależnie do numeru pytania, które jest aktualnie w TextBox2, ale nie udało się, więc próbowałam uzależnić to od kolejnej literki w haśle – czyli jeśli mamy już literkę pierwszą to pojawia się przycisk sprawdzający pytanie nr 2, jeśli mamy literkę drugą w haśle – pojawia się przycisk sprawdzający pytanie nr 3 itd. – ale to też nie działa.
    Ze zdziwieniem odkryłam że wciśnięcie na MsgBox z napisem „BŁAD!BŁĄD! i dwoma przyciskami „Ponów próbę” i „Anuluj” przycisku „Anuluj” powoduje że znika przycisk „CommandButton_SPRWDZ1” i pojawia się „CommandButton_SPRWDZ2” – czyli coś tam działa ale kompletnie nie w tej kolejności – bo poprawna odpowiedź na pytanie nr 2 i tak (za pomocą „CommandButton_SPRWDZ1”) zostaje zweryfikowana jako błędna i skasowana literka nr 1 w haśle więc co z tego że anulowanie sprawia że w końcu pojawia się „CommandButton_SPRWDZ2” i możliwość poprawnego sprawdzenia odpowiedzi nr 2 jeśli i tak brakuje już pierwszej literki hasła….
    Nie wiem czy ktokolwiek zrozumiał mój wywód… poniżej mój kod - na razie dla 4 pytań:

    Code: vbnet
    Log in, to see the code

    itd.
    Proszę o podpowiedź czy „CommandButton_SPRWDZ1” może weryfikować wszystkie 39 odpowiedzi na 39 kolejnych pytań pojawiających się w TextBox2 albo czy można sprawić że kolejne 39 przycisków „CommandButton_SPRWDZ” będzie pojawiało się i znikało w odpowiednich momentach umożliwiając poprawną weryfikację kolejnych pytań?
    Ethernet jednoparowy (SPE) - rozwiązania w przemyśle. Szkolenie 29.09.2021r. g. 11.00 Zarejestruj się za darmo
  • Computer Controls
  • Helpful post
    #2
    PRL
    Level 39  
    Z wypracowań na języku polskim miałeś pewnie piątkę.;)
    Możesz powyższe napisać w 3 zdaniach?
  • Computer Controls
  • Helpful post
    #3
    lanzul
    Level 30  
    magdabar wrote:
    CommandButton z napisem GRAJ!,

    Poszedłbym raczej w kierunku formatki użytkownika (UserForm), niż bawiłbym się w z przyciskami w arkuszu.
    Łatwiej zapanować nad aspektem wizualnym "zabawki", no i miejsca więcej w arkuszu na inne rzeczy.

    magdabar wrote:
    czy „CommandButton_SPRWDZ1” może weryfikować wszystkie 39 odpowiedzi

    Prosto odpowiadając - można - np. poprzez przypisywanie do niego zmiennych zawierających wzrastający licznik, odwołujący się z kolei do czegoś tam ... itp.

    magdabar wrote:
    w odpowiednich momentach umożliwiając poprawną weryfikację kolejnych pytań

    Przede wszystkim nieznana jest konstrukcja tej "zabawki" - na tę chwilę można by to zrobić w ten sposób, że pytania zgarnięte zostałyby do tablicy i stąd odbywałaby się ich weryfikacja ...

    Podsumowując widzę to tak:
    Do makra przypisanego do jakiegoś przycisku wstawiamy zmienną na licznik kolejnych wciśnięć (podejrzewam, że najlepiej sprawdzi się zmienna statyczna), która sterować będzie pobieraniem ze zmiennej tablicowej (lub arkusza) kolejnych pytań, a następnie porównywać z zapisem w tablicy (arkuszu) poprawnych odpowiedzi.
    Można by do tego podłączyć jakąś "dopracowaną kolorystycznie" formatkę.

    Jeśli ma to być tylko tabliczka mnożenia, to nie powinno być to trudne do wykonania.

    Schemat - przykład:
    Code: vbscript
    Log in, to see the code
  • #4
    magdabar
    Level 5  
    PRL wrote:
    Z wypracowań na języku polskim miałeś pewnie piątkę.;)
    Możesz powyższe napisać w 3 zdaniach?


    Za czasów szkolnych umiałam wszystko napisać w 3 zdaniach – zarówno charakterystykę Boryny jak i rozprawkę o tym czy warto chodzić do szkoły – więc piątki z polskiego zawsze mnie omijały, ale mniejsza z tym.
    W 3 zdaniach – chcę żeby:
    W TextBox2 ukazywały się kolejno pytania od 1 do 39 (zapisane z arkuszu „dane”)
    Po wpisaniu odpowiedzi „z ręki” przez gracza były 2 możliwe następstwa:
    - w przypadku poprawnej odpowiedzi – w kolejnych komórkach excela pojawiała się kolejna literka hasła a w TextBox2 tym samym kolejne pytanie
    - w przypadku błędnej odpowiedzi – ukazywał się komunikat o błędzie, znikały wszystkie dotychczas odgadnięte literki hasła a gra zaczynała się od początku – czyli w TextBox2 pojawiało się znów pierwsze pytanie.
    Spróbowała coś napisać - i nie działa. Pytam więc czy mógłby mi ktoś wskazać drogę.
    Teraz prościej? (bo na pewno krócej)

    Dodano po 5 [minuty]:

    lanzul wrote:
    magdabar wrote:
    CommandButton z napisem GRAJ!,

    Poszedłbym raczej w kierunku formatki użytkownika (UserForm), niż bawiłbym się w z przyciskami w arkuszu.
    Łatwiej zapanować nad aspektem wizualnym "zabawki", no i miejsca więcej w arkuszu na inne rzeczy.

    magdabar wrote:
    czy „CommandButton_SPRWDZ1” może weryfikować wszystkie 39 odpowiedzi

    Prosto odpowiadając - można - np. poprzez przypisywanie do niego zmiennych zawierających wzrastający licznik, odwołujący się z kolei do czegoś tam ... itp.

    magdabar wrote:
    w odpowiednich momentach umożliwiając poprawną weryfikację kolejnych pytań

    Przede wszystkim nieznana jest konstrukcja tej "zabawki" - na tę chwilę można by to zrobić w ten sposób, że pytania zgarnięte zostałyby do tablicy i stąd odbywałaby się ich weryfikacja ...

    Podsumowując widzę to tak:
    Do makra przypisanego do jakiegoś przycisku wstawiamy zmienną na licznik kolejnych wciśnięć (podejrzewam, że najlepiej sprawdzi się zmienna statyczna), która sterować będzie pobieraniem ze zmiennej tablicowej (lub arkusza) kolejnych pytań, a następnie porównywać z zapisem w tablicy (arkuszu) poprawnych odpowiedzi.
    Można by do tego podłączyć jakąś "dopracowaną kolorystycznie" formatkę.

    Jeśli ma to być tylko tabliczka mnożenia, to nie powinno być to trudne do wykonania.

    Schemat - przykład:
    Code: vbscript
    Log in, to see the code


    Dzięki za odpowiedź lanzul
    Zdaję sobie sprawę, że skomplikowałam to na maksa, ale właśnie dlatego zwracam się do Was - żeby to uprościć. Twoja odpowiedź póki co wymaga z mojej strony bardzo, bardzo, bardzo głębokiej analizy (zanim zrozumiem poszczególne słowa ;) ), spróbuję, sprawdzę czy się nada i dam znać
    dzięki jeszcze raz za chęć pomocy
    magdabar
  • #6
    lanzul
    Level 30  
    magdabar wrote:
    odpowiedź póki co wymaga z mojej strony bardzo, bardzo, bardzo głębokiej analizy

    To wcale nie jest trudne, trzeba sobie tylko wszystko zaprojektować - bierzesz kartkę papieru i rozpisujesz sobie co gdzie ma się dziać. Przede wszystkim jednak musi być jakiś zamysł w arkuszu, dopiero potem makra.
    Poniżej przykład do szkieletu z #3:
    wciskan...zip Download (10.29 kB)
  • #7
    magdabar
    Level 5  
    lanzul wrote:
    magdabar wrote:
    odpowiedź póki co wymaga z mojej strony bardzo, bardzo, bardzo głębokiej analizy

    To wcale nie jest trudne, trzeba sobie tylko wszystko zaprojektować - bierzesz kartkę papieru i rozpisujesz sobie co gdzie ma się dziać. Przede wszystkim jednak musi być jakiś zamysł w arkuszu, dopiero potem makra.
    Poniżej przykład do szkieletu z #3:


    Dzięki :)
    oczywiście, na karteczce było wszystko rozpisane, narysowane i ...... cóż, zaczęłam do "grafiki" choć to chyba słowo na wyrost, ale może przez to właśnie, że na siłę próbuję dopasować kody do obrazka - zabawka nie działa.
    VBA excel Pojawiający się i znikający CommandButton

    Gra miała być cała przygotowana dla jednego jedynego "delikwenta", więc poza tym że miała wyglądać trochę jak z jego ulubionej gry to dodatkowo poza pytaniami typowo z tabliczki mnożenia, pojawiają się również takie, które sam "delikwent" układał (jako te najtrudniejsze ;) ). Jednym słowem miało to być takie wspólne dzieło i tym bardziej nie chciałabym nawalić.... ale póki co od tygodnia kręcę się w kółko i wciąż potrafię zweryfikować poprawnie tylko odpowiedź na pierwsze pytanie
    Dzięki za podpowiedzi.
    Kombinuję dalej :)

    Dodano po 2 [minuty]:

    PRL wrote:
    Link

    Warto wyważać otwarte drzwi?
    Może i warto byłoby, gdyby to miała być nauka VBA. Ale skoro pytasz o rozwiązanie na forum, to ani to nauka, ani dobre rozwiązanie. Tak myślę.:)


    Dzięki za podpowiedź. Spróbuję zastosować do mojej zabawki

    Dodano po 3 [godziny] 16 [minuty]:

    lanzul wrote:
    magdabar wrote:
    odpowiedź póki co wymaga z mojej strony bardzo, bardzo, bardzo głębokiej analizy

    To wcale nie jest trudne, trzeba sobie tylko wszystko zaprojektować - bierzesz kartkę papieru i rozpisujesz sobie co gdzie ma się dziać. Przede wszystkim jednak musi być jakiś zamysł w arkuszu, dopiero potem makra.
    Poniżej przykład do szkieletu z #3:


    Po analizie Twojego arkusza dochodzę do wniosku, że może doprecyzuję moje oczekiwania odnośnie klikania. W sumie - zależy mi, żeby było jak najmniej klikania. W zupełności wystarczy mi 1 przycisk - ten rozpoczynający grę (i tu bliższy jest mi arkusz użytkownika PRL). Pozostałe są zupełnie niepotrzebne - tylko, że nie umiem wywołać kolejnych zdarzeń bez przycisków - stąd tyle ich użyłam. Po wpisaniu odpowiedzi na pytanie 1 ma się rostrzygać czy to dobra odpowiedź czy zła i zależnie od tego zaczynać gra od nowa (jeśli zła odpowiedź) lub pojawiać pytanie nr 2 i pierwsza litera hasła (jeśli odpowiedź dobra)
  • #8
    lanzul
    Level 30  
    Do wywołania reakcji na wprowadzane do arkusza dane (odpowiedzi na pytania) wykorzystaj procedurę zdarzeniową arkusza:
    Code: vbscript
    Log in, to see the code

    Target - Komórka podlegająca zmianie. W konstrukcji z ".Cells(1,1)" odnosi się do komórek scalonych
    Intersect - Sprawdza czy "Target" i komórka mająca wywoływać określoną reakcję, to jedna i ta sama komórk, czy też nie
    Jeśli ta sama (i niepusta), to następuje wywołanie procedury (z argumentem) sprawdzającej poprawność wprowadzanych danych, czyli mówiąc trywialnie do owej procedury zostanie przekazana sprawdzana wartość

    Do obsługi zeszytu na etapie otwierania (ustawienia wyjściowe) i zamykania (ustawienia m.in. czyszczące) zastosuj procedury zdarzeniowe zeszytu:
    Code: vbscript
    Log in, to see the code

    Do blokowania niepotrzebnego odwoływania się (zmiana zawartości komórek, usuwanie danych np. "Delete") do "Worksheet_Change" używaj:
    Code: vbscript
    Log in, to see the code


    Odpowiednim kształtom (chmurki dialogów Stworka i Gracza) nadaj konkretne nazwy, jednoznacznie je identyfikujące.
    Pojawianiem się i znikaniem kształtów steruj poprzez:
    Code: vbscript
    Log in, to see the code

    Skorzystaj z:
    Code: vbscript
    Log in, to see the code

    do sterowania przypisywaniem określonych procedur do przycisków i kształtów na kolejnych etapach wykonywania kodu.
    Będziesz mieć jeden przycisk z możliwością wykonywania różnych procedur w zależności od wymagań

    Makro inicjujące grę - przycisk "GRAJ" - mogłoby mieć (ale nie musi) taki kształt:
    Code: vbscript
    Log in, to see the code

    Wydaje mi się, że zmodyfikowany poniżej szkielet poprzedniej konstrukcji dość dobrze by się tu sprawdził:
    Code: vbscript
    Log in, to see the code
  • #9
    magdabar
    Level 5  
    Wow! Ale się Chłopie napracowałeś (choć może "Chłopie" jest niestosowne bo nie wiem czy "lanzul" to męskie czy żeńskie imię ;) )
    Dzięki!
    zaraz spróbuję wprowadzić to w czyn.
    Dam znać jak się uda :)
  • #10
    lanzul
    Level 30  
    Lepiej jak się nie uda ... :)

    Ps.:
    Nie było tu dużo pracy ... raczej gapienia się na obrazek ... pracy to dużo będzie (sz mieć) przy formatowaniu kształtów i pól odpowiedzi i wyników.
  • #11
    magdabar
    Level 5  
    wstyd się przyznać, ale... debil ze mnie. Tak wszystko opisałeś a ja nie potrafię tego dostosować...
    Mam nadzieję, że pod koniec stycznia będę mieć trochę czasu na rozebranie tego na części pierwsze i zacznę od początku albo zaliczę jakiś kurs od podstaw z VBA, bo póki co to mi nie wychodzi :(
  • #12
    magdabar
    Level 5  
    PRL wrote:
    Link

    Warto wyważać otwarte drzwi?
    Może i warto byłoby, gdyby to miała być nauka VBA. Ale skoro pytasz o rozwiązanie na forum, to ani to nauka, ani dobre rozwiązanie. Tak myślę.:)


    Nie, nie warto ;)
    Choć początkowo mój zamysł był troszkę inny - dostrzegłam jednak walory "losowania" pytań zamiast przypasowywania właściwej kolejności liter tworzących hasło do kolejnych pytań. Dzięki Twojej podpowiedzi mogę po każdej "wygranej" wprowadzać nowe hasło dowolnej długości nie zmieniając żadnego z pytań (głównie działań z tabliczki mnożenia) - a o to właśnie chodziło - żeby w kółko wałkować tabliczkę mnożenia :) i mieć za każdym razem nową grę ;)

    Dziękuję bardzo za pomoc. "Gra" hula, że aż miło :)
    Tym samy zamykam ten temat.... choć z tematem nie ma to już nic wspólnego ;)

    Dodano po 3 [minuty]:

    magdabar wrote:
    wstyd się przyznać, ale... debil ze mnie. Tak wszystko opisałeś a ja nie potrafię tego dostosować...
    Mam nadzieję, że pod koniec stycznia będę mieć trochę czasu na rozebranie tego na części pierwsze i zacznę od początku albo zaliczę jakiś kurs od podstaw z VBA, bo póki co to mi nie wychodzi :(


    Nie udało mi się okiełznać tego w ten sposób. Skończyło się na wersji mniej skomplikowanej, ale dziękuję za pomoc. Na pewno będę próbowała wykorzystać te podpowiedzi jak już będę konstruować bardziej zaawansowane zabawki.
  • #13
    magdabar
    Level 5  
    PRL wrote:
    Link

    Warto wyważać otwarte drzwi?
    Może i warto byłoby, gdyby to miała być nauka VBA. Ale skoro pytasz o rozwiązanie na forum, to ani to nauka, ani dobre rozwiązanie. Tak myślę.:)


    Nie, nie warto ;)
    Choć początkowo mój zamysł był troszkę inny - dostrzegłam jednak walory "losowania" pytań zamiast przypasowywania właściwej kolejności liter tworzących hasło do kolejnych pytań. Dzięki Twojej podpowiedzi mogę po każdej "wygranej" wprowadzać nowe hasło dowolnej długości nie zmieniając żadnego z pytań (głównie działań z tabliczki mnożenia) - a o to właśnie chodziło - żeby w kółko wałkować tabliczkę mnożenia :) i mieć za każdym razem nową grę ;)

    Dziękuję bardzo za pomoc. "Gra" hula, że aż miło :)
    Tym samy zamykam ten temat.... choć z tematem nie ma to już nic wspólnego ;)

    Dodano po 3 [minuty]:

    magdabar wrote:
    wstyd się przyznać, ale... debil ze mnie. Tak wszystko opisałeś a ja nie potrafię tego dostosować...
    Mam nadzieję, że pod koniec stycznia będę mieć trochę czasu na rozebranie tego na części pierwsze i zacznę od początku albo zaliczę jakiś kurs od podstaw z VBA, bo póki co to mi nie wychodzi :(


    Nie udało mi się okiełznać tego w ten sposób. Skończyło się na wersji mniej skomplikowanej, ale dziękuję za pomoc. Na pewno będę próbowała wykorzystać te podpowiedzi jak już będę konstruować bardziej zaawansowane zabawki.

    Dodano po 2 [minuty]:

    Dzięki podpowiedziom Państwa z forum znikający przycisk okazał się zupełnie niepotrzebny. Wszystko można zrobić prościej i lepiej jak ma się odwagę zapytać bardziej doświadczonego i kumatego koleżeństwa z elektrody ;)