Discussion:
Wypełnianie liczbami losowymi - VBA
(Wiadomość utworzona zbyt dawno temu. Odpowiedź niemożliwa.)
Servant
2007-10-16 14:50:17 UTC
Permalink
Excel

W komórce C8 mam liczbe przykładowo 5,50.
Chciałbym aby następne dwie komórki D8 i E8 (taka jakby para) zostały
wypełnione liczbami losowymi. Komórka D8 z zakresu od 5,45 do 5,49
a komórka E8 z zakresu od 5,01 do 5,54.
Takich par komórek w wierszu mam pięć a wierszy ponad 20.
W każdym wierszu wartości wejściowe są różne.

Zrobiłem to z wykorzystaniem funkcji LOS, ale nie jestem zadowolony z
działania, Wartości losowe zmieniaja się przy każdym przeliczeniu arkusza, a
ja chciałbym aby raz wyliczone nie zmieniały się i były wyliczane na żadanie
- najlepiej każdy wiersz oddzielnie. Np. jakies makro podpięte pod przycisk.

Myślę, że coś takiego dałoby sie zrobić za pomoca VBA, ale nie mam pomysłu
jak się do tego zabrać.
--
Pozdrawiam
Servant
Cynio
2007-10-17 07:58:25 UTC
Permalink
Post by Servant
Myślę, że coś takiego dałoby sie zrobić za pomoca VBA, ale nie mam pomysłu
jak się do tego zabrać.
skorzystaj z funkcji RND() w VBA i zastosuj taką funkcję:

function losowa()
losowa= (górnagranica-dolnagranica)*RND()+dolnagranica
end function

--
Pozdr.
Cynio
Cynio
2007-10-19 07:00:14 UTC
Permalink
Post by Cynio
function losowa()
losowa= (górnagranica-dolnagranica)*RND()+dolnagranica
end function
dodam iz mozesz gorna i dolna granice wrzucic jako argument funkcji
czyli np.


function losowa(gornagranica as long, dolnagranica as long)
losowa= (gornagranica-dolnagranica)*RND()+dolnagranica
end function

jesli będziesz chciał wylosować tylko i wyłącznie liczby całkowite,
wrzucasz cos takiego:

function losowa(gornagranica as long, dolnagranica as long)
losowa= INT((gornagranica-dolnagranica)*RND()+dolnagranica)
end function

--
Pozdr.
Cynio
Servant
2007-10-20 09:10:48 UTC
Permalink
Cynio <***@piaseczno.com.pl> napisał(a) w wiadomosci do grupy
dyskusyjnej
Post by Cynio
dodam iz mozesz gorna i dolna granice wrzucic jako argument funkcji
czyli np.
function losowa(gornagranica as long, dolnagranica as long)
losowa= (gornagranica-dolnagranica)*RND()+dolnagranica
end function
Dzięki.
Ale dalej nie bardzo rozumiem jak na podstawie danych z komórki C8 wypełnić
kolejnych 20 komórek w wierszu na przemian wartościami minimalnymi i
maksymalnymi. Chciałbym też podpiąć wykonanie funkcji do przycisku.

Funkcje co prawda podałeś, ale główny problem tkwi we wpisaniu wyników w
odpowiednie komórki.
--
Pozdrawiam
Servant
Cynio
2007-10-22 07:06:02 UTC
Permalink
Post by Servant
dyskusyjnej
Post by Cynio
dodam iz mozesz gorna i dolna granice wrzucic jako argument funkcji
czyli np.
function losowa(gornagranica as long, dolnagranica as long)
losowa= (gornagranica-dolnagranica)*RND()+dolnagranica
end function
Dzięki.
Ale dalej nie bardzo rozumiem jak na podstawie danych z komórki C8 wypełnić
kolejnych 20 komórek w wierszu na przemian wartościami minimalnymi i
maksymalnymi. Chciałbym też podpiąć wykonanie funkcji do przycisku.
Funkcje co prawda podałeś, ale główny problem tkwi we wpisaniu wyników w
odpowiednie komórki.
jeśli wrzucisz funkcję do modułu, to możesz z niej korzystać tak jak z
każdej innej funkcji w excelu (będzie w grupie "użytkowników", wiec
również argumenty podajesz jak w każdej innej funkcji, z tym że górną
i dolną granice musisz mieć w oddzielnych komórkach.
Przykład
w komórce A1 masz dolna granicę, w komóce b1 masz góną granicę, wieć
uruchamiasz funkcję i wrzucasz argumenty (oczywiscie trzeba je wrzucic
z dolarkami co by nie zmieniały się podczas przeciagania formuły w
dół) i wszystko

--
Pozdr.
Cynio
Servant
2007-10-30 12:33:07 UTC
Permalink
Cynio <***@piaseczno.com.pl> napisał(a) w wiadomosci do grupy
dyskusyjnej

Witam ponownie po długiej przerwie.
jesli wrzucisz funkcje do modulu, to mozesz z niej korzystac tak jak z
kazdej innej funkcji w excelu (...)
Nie za dobrze Ciebie zrozumiałem, ale to chyba z racji tego, że nie bardzo
orientujesz się o co mi chodzi. I na odwrót. Zatem już tłumaczę. Po
pierwsze: każdy wiersz (a jest ich ponad 20) musiałby mieć swoj kod VBA
przypisany do przycisku. Właściwie to nawet dwa przyciski (i dwa kody) na
wiersz. Jeden przycisk powoduje wpisanie danych w pierwsze pięć par
komórek dolna_granica/górna_granica, drugi przycisk obsługuje drugie pięć
par komórek. W sumie 20 komórek wypełnione wartościami losowymi w dwóch
rzutach.

Po drugie: komórki, które będą wypełniane wartościami losowymi nie mogą
zawierać formuł. Można by w nie wpisać coś "z palca", ale po uruchomieniu
kodu VBA (przyciskiem), zostają wypełnione wartościami losowymi na
podstawie danych znajdujących się w dwóch innych komórkach, zawierających
dolną i górną granicę. Myślę, że teraz jaśniej, ale trochę się boję, że to
jest niewykonalne.
--
Pozdrawiam
Servant
Cynio
2007-11-05 11:21:32 UTC
Permalink
Post by Servant
jesli wrzucisz funkcje do modulu, to mozesz z niej korzystac tak jak z
kazdej innej funkcji w excelu (...)
Nie za dobrze Ciebie zrozumiałem, ale to chyba z racji tego, że nie bardzo
orientujesz się o co mi chodzi. I na odwrót. Zatem już tłumaczę. Po
pierwsze: każdy wiersz (a jest ich ponad 20) musiałby mieć swoj kod VBA
przypisany do przycisku.
nie, nie potrzeba żadnych przycisków, kod który podałem jako drugi
czyli:

function losowa(gornagranica as long, dolnagranica as long)
losowa= (gornagranica-dolnagranica)*RND()+dolnagranica
end function

powoduje że gdy chcesz skorzystac z funkcji losowa musisz jej podać
dwa parametry gornagranica i dolnagranica (które możesz miec w innych
komórkach).
Post by Servant
Po drugie: komórki, które będą wypełniane wartościami losowymi nie mogą
zawierać formuł.
no ale przeciez sam korzystałes z funckji LOS i ona nieodpowiadał Ci
ale tylko dlatego, że co otwarcie arkusza to miałes inne liczby, a o
samej formule nic nie pisałeś
Post by Servant
Można by w nie wpisać coś "z palca", ale po uruchomieniu
kodu VBA (przyciskiem)
ten kod (czyli funkcja) działa tylko raz (po zatwierdzeniu enterem
formuły) podobnie jak inne funkcje excela.
Proponuję abyś wrzucił tą funkcje w moduł VBA (jesli nie jesteś pewien
gdzie dokładnie daj znać opisze to dokładnie), w komórkę D1 wpisał
dolną granicę, w komórkę E1 górną, a w komórkę F1 formułę
"=losowa(e1;d1)", jak dla mnie powinno byc ok

--
Pozdr.
Cynio
Servant
2007-11-05 19:17:18 UTC
Permalink
Cynio <***@piaseczno.com.pl> napisał(a) w wiadomosci do grupy
dyskusyjnej

Dzieki za cierpliwosc.

Funkcja mi zadzialala. Wszelako mialem problem, bo uzywam liczb z dwoma
miejscami po przecinku, a tu w wynikach tylko liczby calkowite.
Rozwiazalem to przez zamiane "As Long" na "As Single".

Wiem, ze przyciski nie sa potrzebne do działania calej tej procedury, ale
problem wyszedl z czasem i teraz potrzebuje.

Probowalem to robic z wykorzystaniem arkusza posredniego. Tym arkuszem
pośrednim (Arkusz1) jest ten w ktorym funkcja dziala. W innym arkuszu
(Arkusz2) makro polaczone z przyciskiem pobieraloby dane z konkretnej
komórki z Arkusz1 i wklejalo do konkretnej komorki w Arkusz2.

Konkretnie to chciałem wczytac dane z komorki do zmiennej, a potem z niej
wkleic do innej komorki.

Popełnilem takie makro:

Sub los01p(ByVal Celss As Range, P01 As Single)
P01 = Worksheets("Arkusz1").Celss(8, 5)
Worksheets(“Arkusz2”).Cells(8, 5).Value = P01
End Sub

Na razie tyle do testowania. Docelowo pod jednym przyciskiem zmiennych
będzie 5.

Niestety, jest blad

"Nieprawidlowa liczba argumentow lub nieprawidlowe przypisanie do
wartosci".

Nie umiem sobie z tym poradzic.
--
Pozdrawiam
Servant
Cynio
2007-11-06 13:47:40 UTC
Permalink
Post by Servant
Funkcja mi zadzialala. Wszelako mialem problem, bo uzywam liczb z dwoma
miejscami po przecinku, a tu w wynikach tylko liczby calkowite.
Rozwiazalem to przez zamiane "As Long" na "As Single".
no tak oczywiscie long dotyczy długich liczb typu integer czyli
całkowitych
Post by Servant
Probowalem to robic z wykorzystaniem arkusza posredniego. Tym arkuszem
pośrednim (Arkusz1) jest ten w ktorym funkcja dziala. W innym arkuszu
(Arkusz2) makro polaczone z przyciskiem pobieraloby dane z konkretnej
komórki z Arkusz1 i wklejalo do konkretnej komorki w Arkusz2.
a bez przycisku nie możesz poprostu w konkretnej komórce w arkuszu2
wpisac formuły odwołującej sie do komórki w arkuszu1??
np. w arkusz2 w komórce A1 wpisac formułę =arkusz1!a1
Post by Servant
Konkretnie to chciałem wczytac dane z komorki do zmiennej, a potem z niej
wkleic do innej komorki.
Sub los01p(ByVal Celss As Range, P01 As Single)
P01 = Worksheets("Arkusz1").Celss(8, 5)
Worksheets("Arkusz2").Cells(8, 5).Value = P01
End Sub
nie zadziałało bo po nazwie procedruy w nawiasach podaje sie parametry
które należy przekazac procedurze (np. z innej procedury lub funkcji)
aby mogła byc wykonywana. W Twoim przypadku jest to niepotrzebne,
skasuj wszystko co masz w nawiasach i zostaw je puste czyli ().
Swoja drogą nie musisz kopiować zawartości poprzez zmienną (choc
oczywiście możesz). Aby skopiować wartość jednej komórki do drugiej
(lub całych zakresów) wystarczy np. kod:
Sub kopiowanie()
sheets("Arkusz1").Range("b2").Copy Sheets("Arkusz2").Range("b2")
End Sub

oczywiscie wiedząc że w momencie uruchamiania makra aktywny jest
arkusz 2 możesz skrócic kod do:
sheets("Arkusz1").Range("b2").Copy Range("b2")

--
Pozdr.
Cynio
Servant
2007-11-06 19:57:01 UTC
Permalink
Cynio <***@piaseczno.com.pl> napisał(a) w wiadomosci do grupy
dyskusyjnej
Post by Cynio
a bez przycisku nie możesz poprostu w konkretnej komórce w arkuszu2
wpisac formuły odwołującej sie do komórki w arkuszu1??
np. w arkusz2 w komórce A1 wpisac formułę =arkusz1!a1
Cała rzecz polega na tym, że komórki nie mogą zawierać formuł. Chodzi o
to, żeby raz w tych komórkach można było samemu pisać, a innym razem ma to
się zrobić "automagicznie". Stąd ten mój pomysł z wklejaniem ze zmiennej.

A tak w ogóle to czy można w zmiennej przechowywać wynik funkcji, a potem
na zyczenie wkleic go do konkretnej komórki (oczywiście nie zawierającej
żadnej formuły)? Na poczatku właśnie o tym pomyślałem, ale nie znalazłem
nigdzie żadnego przykładu pasującego do mojej sytuacji.
Post by Cynio
Sub kopiowanie()
sheets("Arkusz1").Range("b2").Copy Sheets("Arkusz2").Range("b2")
End Sub
Dzięki, wypróbuję.
Nie rozłączaj się ;)
--
Pozdrawiam
Servant
Cynio
2007-11-07 07:36:54 UTC
Permalink
Post by Servant
A tak w ogóle to czy można w zmiennej przechowywać wynik funkcji, a potem
na zyczenie wkleic go do konkretnej komórki (oczywiście nie zawierającej
żadnej formuły)?
tak ponieważ funkcja jest taką specyficzną procedurą, której wynikiem
generalnie jest wartość (choc Tajan i inni zara mnie zbesztaja że
niekoniecznie ale o wyjatkach nie mówimy:-))

Jesli chcesz dowiedzieć sie więcej o podstawach programowania w VBA
dla excela to gorąco polecam książkę Johna Walkenbacha "Excel2003
Programowanie w VBA Vademecum profesjonalisty" wyd. Helion

--
Pozdr.
Cynio

pxd74
2007-11-01 21:14:44 UTC
Permalink
Post by Servant
Excel
W komórce C8 mam liczbe przykładowo 5,50.
Chciałbym aby następne dwie komórki D8 i E8 (taka jakby para) zostały
wypełnione liczbami losowymi. Komórka D8 z zakresu od 5,45 do 5,49
a komórka E8 z zakresu od 5,01 do 5,54.
Takich par komórek w wierszu mam pięć a wierszy ponad 20.
W każdym wierszu wartości wejściowe są różne.
Zrobiłem to z wykorzystaniem funkcji LOS, ale nie jestem zadowolony z
działania, Wartości losowe zmieniaja się przy każdym przeliczeniu
arkusza, a ja chciałbym aby raz wyliczone nie zmieniały się i były
wyliczane na żadanie - najlepiej każdy wiersz oddzielnie. Np. jakies
makro podpięte pod przycisk.
Myślę, że coś takiego dałoby sie zrobić za pomoca VBA, ale nie mam
pomysłu jak się do tego zabrać.
Skoro nawet nie wiesz jak zrobić pętlę w VBA, to może w drugim arkuszu zrób
sobie szablon składający się formuł dla jednego wiersza odpowiednio
wykorzystujących funckję LOS, a następnie na żądanie wklejaj te formuły do
swojego arkusza używając polecenia "Wklej specjalnie jako -> wartości".
Będzie prościej, bez komplikacji i w razie jakichś zmian na pewno szybko
będziesz umiał dostosować to rozwiązanie do swoich potrzeb.
--
Pozdrowienia
pxd74
Loading...