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.

jak dodać dane do konkretnego arkusza używając inputboxa w user form

marico77 22 Gru 2017 21:37 804 15
  • #1 22 Gru 2017 21:37
    marico77
    Poziom 4  

    Jak w temacie:
    jak dodać dane do konkretnego arkusza używając inputboxa w user form,
    Jak można dodać dane do konkretnego arkusza w momencie kiedy dostaje wiadomość o braku towaru na liście?

    0 15
  • #2 24 Gru 2017 14:48
    lanzul
    Poziom 23  

    marico77 napisał:
    jak dodać dane do konkretnego arkusza używając inputboxa w user form

    Np. tak:
    Kod: vba
    Zaloguj się, aby zobaczyć kod

    Tyle, że dość skutecznie "zablokowałeś" to sobie, z jednej strony poprzez ".MatchRequired = True", a z drugiej poprzez "If cbGra.ListIndex = -1 Then Cancel = True".
    Teraz bez wyboru, jakiejś wartości z listy, klawisz dodawania gier jest "nieaktywny", a nieistniejącej, na liście, gry nie wybierzesz.
    Możesz to zrobić "pośrednio", jak wyżej w kodzie, wybierając coś istniejącego na liście i wpisując nową nazwę.

    Poza tym, jeśli już, to kod:
    Kod: vba
    Zaloguj się, aby zobaczyć kod

    zmień na:
    Kod: vba
    Zaloguj się, aby zobaczyć kod

    lub na coś takiego, np.:
    Kod: vba
    Zaloguj się, aby zobaczyć kod

    lub inne jeszcze, np. z właściwością ".List()=", itd. - bardziej "elastyczne".

    Nie stosuj tego samego "cmb" na oznaczenie i 'CommandBox' i 'CommandButton' - łatwo o pomyłki w kodzie.

    marico77 napisał:
    Jak można dodać dane do konkretnego arkusza w momencie kiedy dostaje wiadomość o braku towaru na liście?

    Przemyśl swój kod jeszcze raz, bo sam sobie blokujesz pewne operacje.
    Po co ci właściwie to ".MatchRequired = True" ?

    0
  • #3 28 Gru 2017 21:06
    marico77
    Poziom 4  

    Dzieki za odpowiedz,
    MatchRequired = True potrzebuję ponieważ bardzo często przy tytułach gier zwłaszcza angielskojęzycznych wypadają literówki i muszę mieć pewność że tytuł gry jest dobrze wprowadzony,
    Lista tytułów będzie uzupełniana tylko przez jedą osobę natomiast zakupem czy sprzedażą gier mogą zajmować się np dwie czy trzy osoby (taki mały sklepik z grami w którym często zamiast mnie jest moja siostra, dziewczyna czy nawet mama- i wtedy jest największy Meksyk:)

    Wcześniej udało mi się wykombinować coś takiego (pewnie coś namieszałem, jest to mój pierwszy raz z userform i wsumie poza nagrywaniem makra pierwsza przygoda z VBA wię proszę o wyrozumiałość)

    0
  • Pomocny post
    #4 29 Gru 2017 19:09
    lanzul
    Poziom 23  

    W porządku, więc skoro dopiero zaczynasz, to:

    1. Utrzymuj porządek w kodzie - wcięcia, odstępy między blokami kodów, pozycjonowanie składni typu 'If ... End If', 'Select Case ... End Select', itd.

    Robisz to co prawda dla siebie, nie dla innych, ale im większy będziewsz mieć porządek, tym szybciej będziesz mógł coś zmienić, poprawić, przestawić, itp., a nie zawsze będziesz "w formie" żeby się nawet w "swoich bazgrołach" (od razu) połapać, zwłaszcza po jakimś czasie, kiedy "stracisz wątek", co też właściwie kiedyś chciałeś osiągnąć pisząc tak, a nie inaczej.

    2. Stosuj komentarze, zwłaszcza przy bardziej skomplikowanych fragmentach kodu - ku pamięci, jak wyżej.

    3. Unikaj słów zastrzeżonych dla poleceń języka vba, jak np.: 'Sheet', które stosujesz - 'Sheet' to właściwość obiektu 'PublishObject' i zwraca nazwę arkusza tegoż obiektu - jeśli już musisz, to stosuj jakieś przedrostki, typu np. 'oSheet', 'obiSheet', itp. i weryfikuj czy nie ma kolizji z zasobami vba.

    4. Korzystaj z pomocy podręcznej, dość często ci się przyda, np. w stosunku do "tego twojego" 'MatchRequired' ... :) ... dowiesz się, że właściwość ta dotyczy całej listy obiektu 'ComboBox', nie ma więc po co ujmować tego w pętli, powtarzając dziesiątki, czy nawet setki razy - wystarczy raz.

    5. Jeśli wypełniasz listę "jednorzutowo" (bez dodatkowej manipulacji danymi) jakimś "ciągłym obszarem", to nie stosuj '.AdItem', które "mozolnie", w pętli będzie się "zarzynać" owym wypełnianiem, wystarczy, np: '.RowSource = "Jakaś_lista"' lub '.List() = Range("A1:A20").Value' - i prościej, i szybciej.

    6. Tych formatek, to chyba aż tylu nie potrzeba ? Tak niewiele się różnią między sobą, że wystarczyłaby jakaś uniwersalna plus np. pola wyboru ('CheckBox') albo jakaś lista z wyborem kategorii ?

    7. Masz dwie procedury o takiej samej nazwie - 'cmbListItem_GotFocus' - jedna w module 'Arkusz5 (List)', a druga w module formatki 'Ps3Kupno'.

    8. Używaj 'Option Explicit' i deklaruj wszystkie zmienne, których używasz, nie zostawiaj tego kompilatorowi.

    9. Jeśli masz zmienne, które zawsze "robią to samo", np. liczniki wierszy (tu: 'nr', 'ostA', 'ostB'), i nie kolidują ze sobą w trakcie działania kodu z różnych procedur, to wyrzuć je na sam początek modułu jako jedną zmienną prywatną modułu - po co 2, 3, 4, czy więcej zmiennych typu 'ostatni wiersz' deklarowanych osobno w każdej procedurze ? Zajmują tylko niepotrzebnie pamięć - wpisz np. 'Private ostW As Long' (lub Dim zamiast Private), a w procedurach, w których będą występować wpisz ich początkową/wyjściową wartość (żeby nie przenosić do kodu bieżącej wartości, jaką ewentualnie uzyskały w czasie wcześniejszego przebiegu).

    10. Stosuj 'F8' do przeglądania działania kodu krok po kroku - zaobserwujesz wiele "ciekawych" rzeczy, np. wielokrotne przechodzenia przez te same procedury zdarzeniowe danej formatki - mimo że zakładałeś tylko jednokrotne przejście - które czasami potrafią wiele skopsać.

    11. Kiedy "czyścisz" jakieś pola tekstowe formatki, to chyba lepiej wstawiać pusty ciąg ("") niż odstęp " " ('Me.TextBox1 = " "'), tak mnie się wydaje, chyba że jest ci to "do czegoś potrzebne" ?

    12. Zamiast 'Call MsgBox("WPROWADZ DANE")' wystarczy tylko 'MsgBox("WPROWADZ DANE")'.

    13. Zmiennych 'wczesnej deklaracji' (early binding) - np. 'Dim sheet As Worksheet' - nie ma co "deklarować" w "środku" procedury. Po to stosujesz zapis 'As Worksheet', aby zmienna została utworzona na etapie kompilacji kodu, a nie jego odtwarzania, jak zwykłe 'As Object' (late binding).

    14. W pewnych miejscach masz jakieś "luźne" przypisania zmiennych, np. 'Set List = Nothing' (bez wcześniejszego przypisywania obiektu), to pozostałość po jakimś usuniętym fragmencie kodu ?

    15. W pewnych miejsach masz zapisy typu np. 'Cells(nr, 7) = Me.cmbListItem'
    'cmbListItem' to nazwa 'ComboBox'. Jeśli chcesz poprawnie wpisać do komórki wartość wybraną z listy tego obiektu, to stosuj zapis - 'Cells(nr, 7) = Me.cmbListItem.Text' lub 'Me.cmbListItem.Value' lub 'Me.cmbListItem.List(Me.cmbListItem.ListIndex)'

    0
  • #5 29 Gru 2017 23:51
    marico77
    Poziom 4  

    Dziękuję Ci bardzo za wszystkie wskazówki większość z nich udało mi się wprowadzić chyba z dobrym skutkiem oraz trochę "posprzątałem", ale utknąłem totalnie w momencie (w którym dodaję nową grę przy komunikacie o braku gry) kiedy UserForm1 przerzuca mnie spowrotem do Ps3Kupno. Nie działa żaden przycisk, a gry pomimo że są na liście są nie aktywne. Wszystko działa tak jak powinno jeśli użyję przycisku "Dodaj Grę" lub wyłączę i włączę od nowa

    0
  • Pomocny post
    #6 31 Gru 2017 13:41
    lanzul
    Poziom 23  

    1. Klawisze "blokowane" są w wyniku działania kodu procedury:

    Kod: vba
    Zaloguj się, aby zobaczyć kod

    Jeśli 'ComboBox = cmbGra3' nie ma zogniskowania (focus), to w/w procedura nie działa, jeśli ma to 'Cancel = True' blokuje możliwość opuszczenia 'Combobox'.

    2. W procedurze zdarzeniowej 'Private Sub cmbGra3_Change', kod:
    Kod: vba
    Zaloguj się, aby zobaczyć kod

    powoduje lekkie "zapętlenie" się kodu, trzeba by dać tu jakiś "omijacz powtórzeń", np. jakąś zmienną typu 'Boolean', która będzie chronić kod przed ponownym wywoływaniem.

    3. W procedurze 'Private Sub cmbGra3_Change' - gdy na pytanie: "Czy chcesz dodac nowa Gre" odpowiadasz 'Tak' - po co sprawdzasz istnienie duplikatów (pętla 'For ... Next') w procedurze 'Private Sub btnSubmit2_click' (UserForm1), skoro w tej, z której ją wywołujesz ('Private Sub cmbGra3_Change') masz klauzulę 'If Len(.Text) > 0 And .ListIndex = -1 Then' ? Zapis ten, jednoznacznie wskazuje, że na liście nie ma duplikatu, nawet w pomocy podręcznej masz zapis "If the value of Text does not match a row, ListIndex is set to –1"
    Chyba, że okno 'UserForm1' działa również niezależnie, wtedy poszukiwanie duplikatów miałoby sens, trzeba by tylko wprowadzić jakiś warunek rozgraniczający, skąd następuje wejście do tego okna, aby nie wykonywać dwukrotnie tych samych czynności.

    4. W procedurze UserForm1 - 'Private Sub btnSubmit2_click' - wpisy do komórki są dokonywane dwukrotnie, kod:
    Kod: vba
    Zaloguj się, aby zobaczyć kod


    5. W procedurze UserForm1 - 'Private Sub btnSubmit2_click' w dalszym ciągu stosujesz słowa zastrzeżone przez vba: 'Count' i 'Sheet'.

    6. Przy poszukiwaniu duplikatów (w takim prostym układzie, jaki masz) nie ma potrzeby korzystania z pętli przemiatającej komórki danego zakresu - można przecież skorzystać z metody 'Find', jest bardzo ładnie opisana w pomocy podręcznej, z bardzo ładnym przykładem. Poniżej inny przykład:
    Kod: vba
    Zaloguj się, aby zobaczyć kod


    7. Stosuj, w module formatek, chwytak zdarzenia zamykania danego okna:
    Kod: vba
    Zaloguj się, aby zobaczyć kod

    , będziesz mógł lepiej sterować mechanizmem wywoływania i zamykania okien.

    8. Klawisz 'F8' - śledzenie kodu krok po kroku i punkty przerwania, może być zwykłe 'Stop' - będą tu bardzo przydatne.

    Poza tym, spróbuj sobie wpierw zaprojektować: schematy mechanizmów działania i algorytmy blokowo, na kartce - na tę chwilę, jak dla mnie, to za bardzo tu "nadźgane" różnych pomysłów (np. tych okienek na każdą okazję, są przecież jeszcze takie obiekty jak 'TabStrip' i 'MultiPage' - wtedy wszystko mogłoby być w jednej formatce) ... :|

    0
  • #7 04 Sty 2018 01:45
    marico77
    Poziom 4  

    Po pierwsze chciałem Ci bardzo podziękować za zainteresowanie moim tematem

    3) moim zamysłem jest aby UserForm1 działał również niezależnie (przykładowo, będę mógł dodać grę do listy już w momencie premiery),

    4) mam nadzieję że poprawiłem prawidłowo,

    5) UserForm1 - 'Private Sub btnSubmit2_click - zostało poprawione,

    8) w załączniku coś na wzór algorytmu :)

    Jeśli chodzi o punkty 1 i 2 to próbowałem różnie, ale niestety nie podołałem z 6 walczę teraz natomiast kompletnie nie rozumiem co ma na celu chwytak zdarzenia zamykania jeżeli to samo mogę uzyskać za pomocą X lub formułą unload

    0
  • Pomocny post
    #8 06 Sty 2018 00:54
    lanzul
    Poziom 23  

    1. Procedury zdarzeniowe, takie jak ta poniżej:

    Kod: vba
    Zaloguj się, aby zobaczyć kod

    z klauzulami:
    Kod: vba
    Zaloguj się, aby zobaczyć kod

    skutecznie blokują ci większość działań na formatce.
    Przerzuć je (klauzule) do kodu przycisków zapisujących/zamykających formatki.
    Będą to fragmenty "decyzyjne": czy można coś zapisać i opuścić formatkę, czy też nie można zapisać, a tylko np. opuścić formatkę, itd.

    2. Wyszukiwanie duplikatów:
    Kod: vba
    Zaloguj się, aby zobaczyć kod

    zmień na konstrukcję tego typu:
    Kod: vba
    Zaloguj się, aby zobaczyć kod

    i sprawdź, czy sobie poradzi w różnych sytuacjach.
    W załączniku jest ona co prawda dłuższa, ale nie przemiata pętlą po arkuszu w sytuacji, w której wcale nie musi tak robić.

    3. Długie, wieloczłonowe konstrukcje typu:
    Kod: vba
    Zaloguj się, aby zobaczyć kod

    możesz zastąpić, np. tak:
    Kod: vba
    Zaloguj się, aby zobaczyć kod

    4. Nie deklarujesz większości zmiennych - w pewnej chwili to odczujesz, jak coś przestanie działać, albo będzie działać "na odwrót", bo np. pokryją się nazwy zmiennych.
    W załączniku reszta poprawek z drobnymi uwagami.
    Zeszyt10..2.zip Download (47.54 kB)

    0
  • #9 06 Sty 2018 02:05
    marico77
    Poziom 4  

    Dzięki bardzo za kolejne wskazówki, jutro od samego rana będę próbował je ogarnąć, w międzyczasie trochę pozmieniałem jeśli miałbyś ochotę spojrzeć bo pewnie znowu coś namieszałem (ale staram się :)), wszystkie twoje uwagi biorę sobie do serca i próbuję je wprowadzać jednak czasem nic nie rozumiem,

    0
  • #10 06 Sty 2018 23:56
    marico77
    Poziom 4  

    Kolejny spędzony dzień przed monitorem na przeczytywaniu różnego rodzaju blogów, tutoriali i innych minął (Kobieta zaczyna się wściekać :))

    a tu kolejne problemy się pojawiają

    '1) msgbox cmbGra3 nie aktualizuje sie po dodaniu nowej gry
    'a) w następstwie udzielenia pozytywnej odpowiedzi na pytanie "czy chcesz dodać nową grę?"
    'b) dodaję nową grę
    'c) wracam do UserForm4

    Nie ogarniam tego zupełnie bo po dodaniu nowej gry za pomoca przycisku wszystko jest OK

    '2) pojawia się problem kiedy chcę wyczyścić dane przy kupnie (i znowu przy sprzedaży działa a przy kupnie już nie)
    '3) jezeli wybiore co (np ps3 gra nowa) i wybiore cmbGra3 bez wybierania gry to nie moge nic zrobić (nie działa żaden przycsik, ani nie ma możliwości cofnięcia się)

    0
  • #11 08 Sty 2018 20:15
    lanzul
    Poziom 23  

    marico77 napisał:
    ... cmbGra3 nie aktualizuje sie po dodaniu nowej gry...

    W procedurze 'btnSubmit2_click' formatki 'UserForm1', w sekcji wewnętrznej 'Else', wstaw linię "UserForm4.cmbGra3.RowSource = "lista01"", jak niżej:
    Kod: vba
    Zaloguj się, aby zobaczyć kod


    marico77 napisał:
    ...jezeli wybiore co ... i wybiore cmbGra3 bez wybierania gry to nie moge nic zrobić (nie działa żaden przycsik, ani nie ma możliwości cofnięcia się)

    Tak działają blokady 'Cancel = True' w procedurach wyjścia '..._Exit'.

    0
  • #12 09 Sty 2018 15:26
    marico77
    Poziom 4  

    Czyli wszystkie poniższe problemy są spowodowane nieszczęsnym
    '1) msgbox cmbGra3 nie aktualizuje sie po dodaniu nowej gry
    'a) w następstwie udzielenia pozytywnej odpowiedzi na pytanie "czy chcesz dodać nową grę?"
    'b) dodaję nową grę
    'c) wracam do UserForm4

    Nie ogarniam tego zupełnie bo po dodaniu nowej gry za pomoca przycisku wszystko jest OK

    '2) pojawia się problem kiedy chcę wyczyścić dane przy kupnie (i znowu przy sprzedaży działa a przy kupnie już nie)
    '3) jezeli wybiore co (np ps3 gra nowa) i wybiore cmbGra3 bez wybierania gry to nie moge nic zrobić (nie działa żaden przycsik, ani nie ma możliwości cofnięcia się)


    'Cancel = True' które nie pozwala mi wyjść z comboboxa, SUPER.

    Jak moge to ominąć, ale tak żeby jednocześnie sprawdzało mi czy gra jest czy jej nie ma na liście (jest mi to naprawdę niezbędne) z możliwością przejścia do UserForm1

    0
  • #13 09 Sty 2018 19:01
    lanzul
    Poziom 23  

    marico77 napisał:
    ... Jak moge to ominąć, ale tak żeby jednocześnie sprawdzało mi czy gra jest czy jej nie ma na liście ...

    Jak pisałem wcześniej, spróbuj przerzucić to do jakiegoś klawisza, który będzie ostatecznie "akceptować" (lub nie) zmiany dokonywane w formatce.
    Przykładowo: nie wybrana gra na liście, to nie można niczego zapisać do arkusza po wciśnięciu klawisza "Wpisz", itp.
    Ustaw wtedy zogniskowanie (focus) na listę, żeby leniwy użytkownik mógł od razu rozwinąć listę i powinno wystarczyć.

    0
  • #14 09 Sty 2018 20:15
    marico77
    Poziom 4  

    Ianzul, dziękuję Ci za kolejna wskazówkę, ale tak jak pisałem na początku jestem kompletnym laikiem na początku drogi i szczerze Ci powiem, że to że nie zrobiłem tego co mi mówiłeś wcześniej to nie dlatego że to ignorowałem tylko dlatego iż nie mam pojęcia jak to zrobić :(
    (tak na marginesie to wyrazy szacunku za CIERPLIWOŚĆ (pewnie jest więcej takich expertów jak ja), chęci, i pomoc jakiej udzielasz innym

    0
  • #15 11 Sty 2018 12:05
    marico77
    Poziom 4  

    Ianzul nie mam pojęcia jak to zrobić, gdybyś mógł pomóc byłbym bardzo wdzięczny

    0
  • #16 14 Sty 2018 01:25
    marico77
    Poziom 4  

    Witam ponownie, mam 2 pytania:
    - czy jes mozliwosc zablokowania 2 comboboxa jezeli pierwszy nie jest wypełniony,
    - jaki kod musze wpisac zeby dropdown list w cmbGra nie pokazywała mi się automatycznie po zatwierdzeniu kupna

    ...a tak na marginesie z poprzednim tematem niestety poległem

    0