Elektroda.pl
Elektroda.pl
X

Search our partners

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

[VBA, EXCEL] Wprowadzanie danych za pomoca inputbox itp - ruchome komórki

mysticmario 21 Apr 2017 13:41 4068 10
  • #1
    mysticmario
    Level 9  
    Witam,
    Przeszukałem forum, ale nie znalazłem rozwiązania.
    jestem nowym użytkownikiem VBA i nigdy wcześneij nie programowałem, ale skonstruowalem sobie program do faktur, wcześniej już ktos pomagał mi wyedytowac poprawnie kod, moze i tym razem ktoś oświeci mnie na przyszłość.

    Mam plik faktury, w którym po kliknięciu jedngo z przycisków, kolejno wyskakują okna do uzupełnienia kolejnych sekcji faktury.
    Niestety, w pewnym momencie zorientowałem się, że gdy użyje kodu do wprowadzenia danych do komórki np Range("C5"), dane będą wprowadzane zawsze do komórki C5, ale w przypadku faktur wiaodmo, - przy większej ilosci pozycji komórki sie przesuwają, ale moje inputboxy i cała reszta boxów dalej klepią dane "na sztywno". Ominąłem to jak widać w sprytny sposób, ale niestety zawiódł mnie, ponieważ oprócz klepania faktur.
    na koniec kopiuje te wszytskie dane do bazy faktur i tu problem, bo ctrl+f nie znajdzie mi rzeczy poumieszczanych w polach tekstowych
    oto mój kod:
    Jak mogę zrobić, zeby dane wpadąły do komórki C5, chyba, że sie przesunie w dół to wtedy ma wbić dane np do C6 czy tam C15
    Code: vbscript
    Log in, to see the code
  • #2
    adamas_nt
    Moderator of Programming
    Przypisania są zapewne w kodzie któregoś z UserForm. Wrzuć przykładowy plik z wszystkimi elementami (dane osobowe usuń lub zmień na fikcyjne).
  • #3
    mysticmario
    Level 9  
    Zmiana w kodzie będzie taka sama wszędzie.
    Postaram sie wyjasnic lepiej.
    Mam komórke C5 w której wpisuje numer zamówienia klienta, wykorzystując do tego inputbox. Wszystko działa świetnei do momentu, kiedy zamiast 6 produktów faktura ma 7 produktów, tak więc dodaje nową linie z produktem, co automatycznie przesuwa mi komórke C5, w której ma byc numer zamówienia jedna linie niżej czyli teraz mój inputbox musi wstawi numer zamówienia do komórki C6, a nie C5. Ale przy powyższym kodzie zawsze będzie wstawiał do C5 - jak uelsatycznic kod, aby brał pod uwage przesunięcia?
  • #4
    lanzul
    Level 30  
    mysticmario wrote:
    ... Mam komórke C5 w której wpisuje numer zamówienia klienta, wykorzystując do tego inputbox. Wszystko działa świetnei do momentu, kiedy zamiast 6 produktów faktura ma 7 produktów, tak więc dodaje nową linie z produktem, co automatycznie przesuwa mi komórke C5, w której ma byc numer zamówienia jedna linie niżej czyli teraz mój inputbox musi wstawi numer zamówienia do komórki C6, a nie C5. Ale przy powyższym kodzie zawsze będzie wstawiał do C5 - jak uelsatycznic kod, aby brał pod uwage przesunięcia?

    :?: tak może :?:
    mysticmari...eszyt1.zip Download (12.12 kB)

    Najprostsza poprawka jaką można wnieść, nie wiedząc nic więcej o arkuszu wprowadzania danych - tworzy się tam jakieś odwołanie cykliczne (?) ...

    Kolejne linie:
    "kolejny_wiersz = Application.CountA(Range("c:c"))"
    i
    "Range("c" & kolejny_wiersz + 1).Value = coś_tam"

    wyliczają dotychczas zajęte komórki w kolumnie 'C' i w pierwszej wolnej pod nimi dopisują kolejne dane.
    Code: vbscript
    Log in, to see the code
  • #5
    mysticmario
    Level 9  
    Wrzucam oskubanyz danych plik, na którym mam makra itp.
    zawiera odwołanei cykliczne, przy wprowadzeniu daty, aby sie nei zmeiniała co uruchomienie pliku.
    Prosze nie zważac na estetyke kodu, jak juz mówiłem to dzieło mojej nauki vba w 2tyg.
    Trzeba zmeinic rzszerzenie na xlsm.
    Mam nadzieję, ze to pomoże.
    Aby posługiwac się plikiem należy wyłączyc ochronę arkusza, lub kliknac "stwórz nowa faktuę" wtedy zrobi nowa kopie pliku i go odblokuje.
    Pozdrawiam,
    Mariusz Gola
  • #6
    Prot
    Level 38  
    mysticmario wrote:
    Mam komórke C5 w której wpisuje numer zamówienia klienta :?: , wykorzystując do tego inputbox. Wszystko działa świetnei :?: do momentu, kiedy zamiast 6 produktów faktura ma 7 produktów


    Czarno to widzę ten Twój projekt przy takiej "precyzji" działania i opisu :cry:
    We wszystkich wariantach faktur z Twojego pliku w komórce C5 masz albo "datę wystawienia faktury" albo "datę wydania towaru" :?: :D nie ma natomiast nigdzie na tych fakturach w/w "numeru zamówienia klienta" :!:

    Jeśli chodzi o specyfikację towarów i usług, gdzie może powstawać dylemat ilości wierszy potrzebnych w danej fakturze i przechodzenia z wpisami od pierwszego do następnego wiersza - to proponuje wykorzystanie formuł w konkretnych szablonach faktur np tak jak na zrzucie
    [VBA, EXCEL] Wprowadzanie danych za pomoca inputbox itp - ruchome komórki2017-04...png Download (41.54 kB)

    W kodzie makr musisz zapewnić wtedy tylko dynamiczne dostosowanie obszaru wydruku :!: do parametru tego szablonu =MAX(Lp).
    W Twoim projekcie wydaje się, że zupełnie o tym zapomniałeś: co będzie makro drukować czy zachowywać w pdf ?

    Zauważyłem także, że próbujesz dublować kody występujące w Twoim projekcie -
    tworzysz np kod dla UserForm3, a potem w "Twym ostatnim dziecku" - module10 ponownie kombinujesz nad innym wprowadzaniem nazwiska osoby wystawiającej fakturę :D Moim zdaniem ten kod UserForm jest wygodniejszy jeśli ten projekt robisz dla siebie, czy własnej firmy.
  • #7
    lanzul
    Level 30  
    mysticmario wrote:
    ... zawiera odwołanei cykliczne, przy wprowadzeniu daty, aby sie nei zmeiniała co uruchomienie pliku.

    Linię z kodem:
    Code: vbscript
    Log in, to see the code

    Należy zamienić na:
    Code: vbscript
    Log in, to see the code

    W komórki 'C5' i 'C6' nie będzie wprowadzana funkcja, tylko wynik formatowania tekstowego funkcji 'Dziś()'

    Dalej:
    mysticmario wrote:
    ...
    1. Mam komórke C5 w której wpisuje numer zamówienia klienta, wykorzystując do tego inputbox.

    2. Wszystko działa świetnei do momentu, kiedy zamiast 6 produktów faktura ma 7 produktów,
    3. dodaje nową linie z produktem, co automatycznie przesuwa mi komórke C5, w której ma byc numer zamówienia jedna linie niżej czyli teraz mój inputbox musi wstawi numer zamówienia do komórki C6, a nie C5. Ale przy powyższym kodzie zawsze będzie wstawiał do C5
    ...

    Ad 1.
    W komórkę 'C5', jak i w 'C6' są wprowadzane 'daty', co wynika z kodu makra, a nie 'nr zamówienia klienta'.
    Rozumiem tutaj, że ów 'nr zamówienia klienta', to w rzeczywistości 'nr faktury' (?)

    Ad 2. i Ad 3.
    hmm ... Cały szkopuł w tym, że żadne dane z okien dialogowych 'inputbox' nie są wpisywane w żadne komórki, lecz w pola tekstowe.
    Dodając nowy wiersz w tabeli z pozycjami faktury, np: na zakładce "waluta PLN, ENG 0%" jedyne co można 'przesunąć', to pola tekstowe znajdujące się poniżej tabelki: 'REF', 'REQ', 'PO', 'Opis ogólny' i 'Stawki VAT'
    [VBA, EXCEL] Wprowadzanie danych za pomoca inputbox itp - ruchome komórkimysticmari...ls_002.jpg Download (45.7 kB)

    Żeby uniknąć, 'pewnych niechcianych zachowań' pól tekstowych można im, w ich właściwościach, zaznaczyć odpowiednie opcje:
    [VBA, EXCEL] Wprowadzanie danych za pomoca inputbox itp - ruchome komórkimysticmari...ls_001.jpg Download (48.58 kB)

    lub

    pobawić się sterowaniem położenia tych pól tekstowych z poziomu kodu:
    Code: vbscript
    Log in, to see the code

    Natomiast, co się tyczy 'uelastycznienia kodu' w tym konkretnym przypadku, to powinna być brana pod rozwagę opcja całkowitego przerobienia formularzy, tak aby każda wpisywana dana miała swoją komórkę lub zakres w arkuszu. Łatwiej wtedy cokolwiek zrobić, niż przesuwać sobie pola tekstowe punkt po punkcie na ekranie monitora kodem makra, bo to raczej żmudna robota ... :|

    Ps: To przesuwanie 'programowe' pól tekstowych, to trochę tak jak dzierganie takiego formularza w pliku tekstowym, wykorzystując do tego znaki odstępu, tabulatora, itd.
  • #8
    lanzul
    Level 30  
    mysticmario wrote:
    ... działa świetnei do momentu, kiedy zamiast 6 produktów faktura ma 7 produktów, tak więc dodaje nową linie z produktem, co automatycznie przesuwa mi komórke C5, w której ma byc numer zamówienia jedna linie niżej czyli teraz mój inputbox musi wstawi numer zamówienia do komórki C6, a nie C5. Ale przy powyższym kodzie zawsze będzie wstawiał do C5 - jak uelsatycznic kod, aby brał pod uwage przesunięcia?

    hmm ... po zapoznaniu się bliżej z podesłanym 'zeszytem do faktur' stwierdzam, że rzeczywiście może on być wysoce 'upierdliwy' w codziennej obsłudze ... :| ...

    Proszę się zapoznać z poniższym przykładem 'lekkiego uzdatnienia' jego funkcjonalności ... może będzie w czymś przydatny.
    Copy of FA...TURA02.zip Download (66.63 kB)Points: 1.5 for user

    Poprawki bazują na:
    1. 'automatyzacji' wprowadzania danych w oparciu o 'punkty odniesienia' w arkuszu.
    Takimi są naglówki tabeli, czy pewne frazy występujące 'chyba' stale w arkuszu faktury: 'REF.', 'REQ.', 'PO:', 'Issued by', itp.

    2. wrzuceniu zawartości rozwijanych list formularzy do osobnego arkusza - znacznie łatwiej będzie w nim dopisywać nowe i odpisywać zbędne pozycje
    Jeśli coś nie pojawi się na którejś liście, to trzeba sprawdzić w danym formularzu UserForm, czy przypadkiem nie costał przekroczony zakres zarezerwowany na pozycje listy w arkuszu i odpowiednio go skorygować:
    Code: vbscript
    Log in, to see the code

    3. automatyzacji 'czyszczenia' arkusza faktury pod nowe wpisy

    4. opcji naprawy formuł liczących wartości kwot w tabeli

    Przykład oparty o fakturę 'waluta PLN, ENG 0%' - jeśli się sprawdzi, to trzeba będzie go dostosować do innej terminologii 'punktów odniesienia' w danej fakturze.
    Reszta 'uwag' w modułach ...

    Ps: Zostawiłem pola tekstowe gwoli porównania co i gdzie jest wprowadzane w nowej wersji arkusza
    :)
  • #9
    mysticmario
    Level 9  
    lanzul wrote:
    mysticmario wrote:
    ... zawiera odwołanei cykliczne, przy wprowadzeniu daty, aby sie nei zmeiniała co uruchomienie pliku.

    Linię z kodem:
    Code: vbscript
    Log in, to see the code

    Należy zamienić na:
    Code: vbscript
    Log in, to see the code

    W komórki 'C5' i 'C6' nie będzie wprowadzana funkcja, tylko wynik formatowania tekstowego funkcji 'Dziś()'

    Dalej:
    mysticmario wrote:
    ...
    1. Mam komórke C5 w której wpisuje numer zamówienia klienta, wykorzystując do tego inputbox.

    2. Wszystko działa świetnei do momentu, kiedy zamiast 6 produktów faktura ma 7 produktów,
    3. dodaje nową linie z produktem, co automatycznie przesuwa mi komórke C5, w której ma byc numer zamówienia jedna linie niżej czyli teraz mój inputbox musi wstawi numer zamówienia do komórki C6, a nie C5. Ale przy powyższym kodzie zawsze będzie wstawiał do C5
    ...

    Ad 1.
    W komórkę 'C5', jak i w 'C6' są wprowadzane 'daty', co wynika z kodu makra, a nie 'nr zamówienia klienta'.
    Rozumiem tutaj, że ów 'nr zamówienia klienta', to w rzeczywistości 'nr faktury' (?)

    Ad 2. i Ad 3.
    hmm ... Cały szkopuł w tym, że żadne dane z okien dialogowych 'inputbox' nie są wpisywane w żadne komórki, lecz w pola tekstowe.
    Dodając nowy wiersz w tabeli z pozycjami faktury, np: na zakładce "waluta PLN, ENG 0%" jedyne co można 'przesunąć', to pola tekstowe znajdujące się poniżej tabelki: 'REF', 'REQ', 'PO', 'Opis ogólny' i 'Stawki VAT'


    Żeby uniknąć, 'pewnych niechcianych zachowań' pól tekstowych można im, w ich właściwościach, zaznaczyć odpowiednie opcje:


    lub

    pobawić się sterowaniem położenia tych pól tekstowych z poziomu kodu:
    Code: vbscript
    Log in, to see the code

    Natomiast, co się tyczy 'uelastycznienia kodu' w tym konkretnym przypadku, to powinna być brana pod rozwagę opcja całkowitego przerobienia formularzy, tak aby każda wpisywana dana miała swoją komórkę lub zakres w arkuszu. Łatwiej wtedy cokolwiek zrobić, niż przesuwać sobie pola tekstowe punkt po punkcie na ekranie monitora kodem makra, bo to raczej żmudna robota ... :|

    Ps: To przesuwanie 'programowe' pól tekstowych, to trochę tak jak dzierganie takiego formularza w pliku tekstowym, wykorzystując do tego znaki odstępu, tabulatora, itd.


    Witam.
    Nie było mnie chwilę więc zarzuciłem projekt na chwilę.
    Postaram się w dniu dzisiejszym wykonac dokładny opis problemu w postaci wideo, inaczej nie jestem w stanie przekazać, istoty problemu.
    Po krótce:
    Komórka C5 w przypadku mojego opisu jest tylko i wyłącznie przykładem, nie ma faktycznego odniesienia w moim projekcie.
    Jeżeli chodzi o dane z okien dialogowych, Wpisywane są do pól tekstowych dlatego, że tylko w ten sposób mogłem 'ominąć' brak dynamicznych komórek.
    Utworzone pole tekstowe ma stały numer porządkowy, dzieki temu dając komende np. wprowadzenia numeru faktury w polu tekstowym 4, input box zawsze wprowadzi numer faktury do pola tekstowego 4, nie ważne gdzie to pole się znajduje. Jak zauważyłem, załączony przeze mnie plik praktycznie nie działa. Dzisiaj wieczorem usiąde do tego i nagram video opis - będzie łatwiej. Zależy mi na tym projekcie.
  • #10
    lanzul
    Level 30  
    mysticmario wrote:

    Postaram się w dniu dzisiejszym wykonac dokładny opis problemu w postaci wideo, inaczej nie jestem w stanie przekazać, istoty problemu.
    ...
    Komórka C5 w przypadku mojego opisu jest tylko i wyłącznie przykładem, nie ma faktycznego odniesienia w moim projekcie.
    ...
    Jak zauważyłem, załączony przeze mnie plik praktycznie nie działa. Dzisiaj wieczorem usiąde do tego i nagram video opis - będzie łatwiej. Zależy mi na tym projekcie.


    Proszę się zapoznać z plikiem zamieszczonym w odpowiedzi nr "#8".
    Jest tam przeróbka, która wpisuje dane w komórki arkusza, a nie w pola tekstowe, które są dość "sztywne", jeśli chodzi o ich przemieszczanie "dynamiczne" w arkuszu - jak się ten przykład sprawdza i czy w ogóle (?) ...
  • #11
    mysticmario
    Level 9  
    Pobrałem plik
    przyznam szcerze, z musze dobrze nad tym kodem posiedziec.
    Nie jestem tak biegły w VBA, wszystko mi się miesza jak to czytam. Co nie co zrozumiałem i chyba fundamentalnie źle się za to zabralem. Wydaje mi się, ze nie będę potrzebował dynamicznych komórek, aczkolwiek spróbuje tego rozwiązania z odp. #8