Discussion:
przenoszenie wartości zmiennej z USERFORM do Modułu
(Wiadomość utworzona zbyt dawno temu. Odpowiedź niemożliwa.)
Krzysiek
2005-03-12 10:15:49 UTC
Permalink
witam,

Napisałem krótki kod w excelu w VBA. Po otwarciu pliku xls otwiera się
formularz do wprowadzenia kilku danych od użytkownika. Nastepnie użytkownik
klika akceptuj i dane te są meilone w kodzie.

Ale mam problem: nie umiem przenieść tych danych z formularza użytkownika
dalej do kodu w module! teraz robie to troche nieelegancko bo dane z userform
są zapisywane gdzieś głęboko w arkuszu w komórkach:

sub CMDakcpteuj_Click()
range("a100").value="2004"
range("a101").value="1 kwartał"
.....
end sub

a potem w kodzie już w module są odzyskiwane z tych komórek i przetwarzane:

sub kod_główny()
a=range("a100").value
b=range("a101".value
....
end sub

Czy znacie sposób żeby wartość zmiennych z userform przenieiść bezpośrednio do
modułu z kodem? tzn. w zdarzeniu click przypisać np. a="2004" a potem to
jakość odzyskać w sub kod_główny()?

Experymentowałem z deklaracjami globalnymi declarations ale to nie pomogło -
to tylko działa jak przenosze dane pomiędzy procedurami w module.

Uprzejmie prosze o pomoc!

pozdrawiam,
Krzysiek (***@tlen.pl)
--
Wysłano z serwisu OnetNiusy: http://niusy.onet.pl
pxd74
2005-03-12 10:55:13 UTC
Permalink
U?ytkownik "Krzysiek" <***@tlen.pl> napisa? w wiadomo?ci news:***@newsgate.onet.pl...
(...)
Post by Krzysiek
Czy znacie sposób żeby wartość zmiennych z userform przenieiść
bezpośrednio do modułu z kodem? tzn. w zdarzeniu click przypisać np.
a="2004" a potem to jakość odzyskać w sub kod_główny()?
Experymentowałem z deklaracjami globalnymi declarations ale to nie pomogło
- to tylko działa jak przenosze dane pomiędzy procedurami w module.
Zmienną musisz zadeklaować jako globalną i publiczną w module standartowym.
Globalną to znaczy przed wszystkimi innymi procedurami na samej górze w
sekcji Declaration.
Publiczną to znaczy poprzedzoną słowem kluczowym Public, np.:

Public a As Long
--
Pozdrowienia
pxd74
Krzysiek
2005-03-12 11:08:42 UTC
Permalink
Post by pxd74
(...)
Post by Krzysiek
Czy znacie sposób żeby wartość zmiennych z userform przenieiść
bezpośrednio do  modułu z kodem? tzn. w zdarzeniu click przypisać np.
a="2004" a potem to  jakość odzyskać w sub kod_główny()?
Experymentowałem z deklaracjami globalnymi declarations ale to nie pomogło
-  to tylko działa jak przenosze dane pomiędzy procedurami w module.
Zmienną musisz zadeklaować jako globalną i publiczną w module standartowym.
Globalną to znaczy przed wszystkimi innymi procedurami na samej górze w
sekcji Declaration.
Public a As Long
--
Pozdrowienia
pxd74
PXD74 dzięki za info ale chyba się pogubiłem bo dalej nie działa. Zrobiłem tak:


formularz użytkownika:


Sub TextBox1_Change()

a = TextBox1.Value

MsgBox ("zmienna w formularzu =" & a)
start 'idz do modułu głównego

End Sub


a teraz moduł:


Public a As String 'też na górze w sekcji declarations
-----------------------
Sub start()

MsgBox ("w module zmienna ma wartość" & a) ' sprawdzam czy w module widać tą
zmienną

End Sub


Ale niestety dalej nie działa :(((
--
Wysłano z serwisu OnetNiusy: http://niusy.onet.pl
pxd74
2005-03-12 12:02:14 UTC
Permalink
U?ytkownik "Krzysiek" <***@tlen.pl> napisa? w wiadomo?ci news:***@newsgate.onet.pl...
(...)
Post by Krzysiek
Ale niestety dalej nie działa :(((
Może sprecyzuj co nie działa: czy wyświetla Ci jakiś błąd - jak tak to jaki?
czy może drugi msgbox wyświetla Ci nieprawidłową watość - jak tak to jaką?
Sprawdziłem u mnie: wpisałem tak jak u Ty i wszystko jest w porządku.
Podejrzewam, że możesz mieć jakieś podwójne deklarację zmiennej a. Sprawdź
czy na pewno nie ma takiej deklaracji (np. Dim) w sekcji Declaration w
module UserForm albo w procedurze TextBox1_Change.
--
Pozdrowienia
pxd74
Krzysiek
2005-03-12 13:02:59 UTC
Permalink
Post by pxd74
(...)
Post by Krzysiek
Ale niestety dalej nie działa :(((
Może sprecyzuj co nie działa: czy wyświetla Ci jakiś błąd - jak tak to jaki?
czy może drugi msgbox wyświetla Ci nieprawidłową watość - jak tak to jaką?
Sprawdziłem u mnie: wpisałem tak jak u Ty i wszystko jest w porządku.
Podejrzewam, że możesz mieć jakieś podwójne deklarację zmiennej a. Sprawdź
czy na pewno nie ma takiej deklaracji (np. Dim) w sekcji Declaration w
module UserForm albo w procedurze TextBox1_Change.
--
Pozdrowienia
pxd74
Drogi PXD74,

niestety wygląda na to że to jakiś inny problem niż podwójne deklaracje-
próbowałem zarówno podwójne jak i pojedyncze deklaracje i nic nie pomogło.
Pozwoliłem sobie przesłać Tobie mały pliczek excela zawierającym ten problem.
Może w ten sposób łątwiej uda się ten problem rozwiązać?

pozdrawiam,
Krzysiek
--
Wysłano z serwisu OnetNiusy: http://niusy.onet.pl
pxd74
2005-03-12 14:22:48 UTC
Permalink
Post by Krzysiek
Drogi PXD74,
niestety wygląda na to że to jakiś inny problem niż podwójne deklaracje-
próbowałem zarówno podwójne jak i pojedyncze deklaracje i nic nie pomogło.
Zmień nazwę zmiennej na taką jakiej na pewno jeszcze nie użyłeś zarówno w
procedurze TextBox1_change jak i w module standartowym w sekcji Decrations.
Jak nie pomoże włącz okno Watch i dodaj zmienną do tego okna, a nastepnie
obserwuj jej wartość w czasie działania procedury.
Post by Krzysiek
Pozwoliłem sobie przesłać Tobie mały pliczek excela zawierającym ten
problem. Może w ten sposób łątwiej uda się ten problem rozwiązać?
Ale napisz co nie działa? Są jakieś błędy?
--
Pozdrowienia
pxd74
Krzysiek
2005-03-12 15:50:07 UTC
Permalink
Post by pxd74
Post by Krzysiek
Drogi PXD74,
niestety wygląda na to że to jakiś inny problem niż podwójne deklaracje-
próbowałem zarówno podwójne jak i pojedyncze deklaracje i nic nie pomogło.
Zmień nazwę zmiennej na taką jakiej na pewno jeszcze nie użyłeś zarówno w
procedurze TextBox1_change jak i w module standartowym w sekcji Decrations.
Jak nie pomoże włącz okno Watch i dodaj zmienną do tego okna, a nastepnie
obserwuj jej wartość w czasie działania procedury.
Post by Krzysiek
Pozwoliłem sobie przesłać Tobie mały pliczek excela zawierającym ten
problem.  Może w ten sposób łątwiej uda się ten problem rozwiązać?
Ale napisz co nie działa? Są jakieś błędy?
--
Pozdrowienia
pxd74
Dzięki za kolejne wksazówki. Czujka Watxh niestety nie pomaga- pokazuje
prawidłową wartość zmiennej ale jak wykonanie kodu przechodzi z userform do
modułu to nie zmienia się a mimo wszystko widzi pusty ciąg "" zamiast
pierwotnej wartości.
Co do pomysłu zmiany nazwy zmiennej to w przypadku mojego prościutkiego
przykłądu nie ma znaczenia bo tam jest tylko 1 zmienna.
Konkretnie co nie działa: Po otwarciu formularzu wproadzama jakąkowliek
wartośc (np literkę). Dalej userform komendą msgbox informuje mnie co
wprowadziłem i na razie wszystko gra. A teraz kod skacze do procedury w module
i jeszcze raz wyskakuje komunikat msgbox który mnie informuje o wartości
zmiennej (tej samej co była przed chwilą nadan i sprawdzona w formularzu) i
niestety pokazuje wartość "". CZyli zgubił zmienną :( Niby prosta sprawa a
jednak :((
--
Wysłano z serwisu OnetNiusy: http://niusy.onet.pl
pxd74
2005-03-13 07:35:02 UTC
Permalink
A jednak były to podwójne deklaracje zmiennej a.
W module UserForm miałeś:

Public a As String

Powinieneś usunąć tą linię z kodu.
--
Pozdrowienia
pxd74
Krzysiek
2005-03-13 09:19:40 UTC
Permalink
Post by pxd74
A jednak były to podwójne deklaracje zmiennej a.
Public a As String
Powinieneś usunąć tą linię z kodu.
--
Pozdrowienia
pxd74
Uprzejmie dziękuje za pomoc!!!! już działa! swoją drogą to chyba miałem
potrójną deklarację bo jeszcze
Dim A as String
z userform trzeba było wywalić inaczej dalej nie działało jak powinno!

No to teraz ruszy długa praca nad meritum aplikacji!
--
Wysłano z serwisu OnetNiusy: http://niusy.onet.pl
Piglet
2005-03-14 09:18:05 UTC
Permalink
Post by Krzysiek
witam,
Napisałem krótki kod w excelu w VBA. Po otwarciu pliku xls otwiera się
formularz do wprowadzenia kilku danych od użytkownika. Nastepnie użytkownik
klika akceptuj i dane te są meilone w kodzie.
Inne pomysl jest taki aby po wprowadzeniu danych do formularza nie zamykac
go, tylko ukryc (metoda Hide).
Wtedy mozna odwolywac sie do pol formularza z dowolnego miejsca np
a=UserForm1.TextBox1

Pozdrawiam
Piglet

Loading...