GRY-Online.pl --> Archiwum Forum

Visual Basic w Excelu

02.01.2009
14:54
smile
[1]

frer [ God of Death ]

Visual Basic w Excelu

Próbuję napisać sobie małe makro w VB do Excela i natrafiłem na mały problem. Chodzi o to, że jednym z zadań makra ma być obliczenie wartości różnych funkcji dwóch zmiennych.
Problem tkwi w tym, że nie mam jak wczytać równania funkcji w inny sposób niż przez wpisanie go do kodu makra, a jednak zależy mi na tym, żeby zrobić to z najlepiej jakiegoś formularza. Tylko, że formularz traktuje wpisane dane jako zmienną, która musi mieć przypisany jakiś typ (równanie można by wczytać chyba tylko jako string albo variant) i nie mam pojęcia jak to zamienić na równanie, na którym VB mógłby wykonać obliczenia.
Miałby ktoś może jakiś sposób na to ??

02.01.2009
15:25
[2]

albz74 [ Legend ]

Spróbuj 'umówić się' sam ze sobą, w jaki sposób chcesz dać znać VBA, gdzie jest miejsce na zmienną. I tak wprowadzaj dane do formularza. Wtedy w kodzie możesz zapisać podmianę tego zapisu na zmienną VBA i gotowe (np pierwiastek kwadratowy z a wprowadzać jako sqrt('ZMIENNA A'). Musiałbyś mieć wtedy chyba 2 formularze - jeden do podawania zmiennych a drugi do wprowadzania/zapamiętywania funkcji.

Do czego konkretnie miałoby służyć takie makro ?

02.01.2009
15:38
[3]

frer [ God of Death ]

W ogóle cały arkusz (którego częścią jest makro) ma służyć do tworzenia pliku, który będzie wykorzystywany jako skrypt do AutoCada. Makr planuję kilka, a akurat to miało w zamyśle służyć do rozwiązania zadanej funkcji przypisując wartości "z" dla konkretnych zmiennych "x" i "y" na zadanym przedziale.
Początkowo planowałem coś takiego, żeby zaraz po otwarciu wyskakiwało okienko z polami tekstowymi, w które by się wpisywało funkcję i pozostałe parametry (jak przedział x i y, a także ilość punktów na tym przedziale). O ile w przypadku wczytania konkretnych liczb nie ma żadnego problemu, to nie miałem jak wczytać funkcji (póki co znalazłem tylko jak można wczytać formułę Excela, ale to i tak nie przekłada się wprost na równanie.
Podsumowując, chodzi o to, że arkusz ma działać na tej zasadzie, żeby każdy był w stanie w nim podać dowolną funkcję dwóch zmiennych, ale bez grzebania w jakichkolwiek skryptach VB, a najlepiej przez wyłącznie wpisanie do formularza w okienku. :)

02.01.2009
15:41
[4]

albz74 [ Legend ]

To może formularz zbędny - to zabawa z oprogramowaniem tego i potem obsługą - ja bym wprowadził dedykowane komórki, do których można tekstowo wpisać funkcję, jaką chcesz obliczyć i obrabiać to w kodzie VBA wg np zapropowanej konwencji (podmieniać część tego tekstu zmienną, z innego miejsca w arkuszu albo z formularza)

02.01.2009
15:51
[5]

frer [ God of Death ]

Problem póki co tkwi głównie w tym, że nie wiem jak sprawić, żeby VB rozpoznawał wpisany tekst jako swoje równanie. Tak, żeby mógł w jakiejś pętli potem wykonywać na nim obliczenia.

02.01.2009
15:59
[6]

albz74 [ Legend ]

Tak jak pisałem - musisz wymyślić konwencję oznaczania zmiennych. Weźmy np funkcję cosinus.
W VB podajesz ją jako cos('zmienna_1'). Więc możesz przyjąć np zasadę że tak będziesz zapisywać kod funkcji. A w VB string 'zmienna_1 zamieniać na faktyczną zmienną. Jeżeli tak sobie to zapiszesz, to zawsze możesz podmienić treść wpisanego wzoru na wzór ze zmienną VB

02.01.2009
16:10
[7]

frer [ God of Death ]

Szczerze mówiąc nie do końca rozumiem. Co jak mam funkcję np. f(x,y)=x^3+xy^2+y-12 ?? Jak wpiszę coś takiego (samo "x^3+xy^2+y-12") Excelowi i VB będzie to musiał odczytać z okienka (czy nawet komórki) to potraktuje to jako String, ewentualnie jako formułę Excela, ale już chyba nie jako własne równanie. Tu właśnie chodzi o to, żebym mógł sobie wpisać dowolną funkcję i żeby mi to VB był w stanie przeliczyć. Kwestia nazewnictwa samych zmiennych ma drugorzędne znaczenie.

02.01.2009
16:33
[8]

albz74 [ Legend ]

'zmienna_1'^3+('zmienna_1'*'zmienna_2')^2+'zmienna_2'-12

A teraz lepiej ? :) następnie deklarujesz zmienną wynik, podmieniasz stringi 'zmienna_1' i 'zmienna_2' i gotowe.

02.01.2009
16:38
[9]

frer [ God of Death ]

No i tu jest mój problem, bo ten przykład funkcji to był tak rzucony z powietrza, a co jak teraz będę chciał podać funkcję "3*x^4*y^2+x*y^3+5*x"? Zmiana zmiennych nic mi to wtedy nie daje, bo całe równanie ma inną konstrukcję. :P

02.01.2009
16:50
[10]

albz74 [ Legend ]

Jak to nie da, przecież VB rozpoznaje składnię działań matematycznych, więc jedyne co trzeba zrobić, to mu przemycić wzór, podmienić x czy y na zmienne i gotowe.

02.01.2009
17:32
[11]

frer [ God of Death ]

To chyba ja tu czegoś nie rozumiem.
Mam podać wzór, ale żeby się do niego odwołać muszę go przypisać do jakiejś zmiennej (tzn. zawartość formularza bądź komórki w której jest ten wzór). Tylko jak przypiszę go to zaraz mam problemy z type mismatch. To co w takim razie mam zrobić żeby Excel wczytane dane w ogóle potraktował jako działanie matematycznie ?? Pomijając póki co kwestię zamiany zmiennych.

02.01.2009
22:34
[12]

albz74 [ Legend ]

To, co masz zrobić to nie odwołać się do gotowego wzoru ale przechwycić tekst, podmienić jego część w locie i dopiero zrobić z tego działanie.

Zrób tak. Piszę z pamięci bez edytora ale chodzi o zasadę

do komórki A1 wpisz tekst funkcji dla przykładu x^2 + y^2 zapisane jako 'zmienna_1'^2 + 'zmienna_2'^2. Do komórek A2 i A3 wpisz wartości dla x i y.

public sub liczymy
dim a,b as Variant 'zmienne dla bezpieczeństwa albo nie deklaruj typu albo Variant czyli co kto chce ;)

dim c as String ' funkcja
dim wynik as Variant

a= range("A2").value
b= range("A3").value
c= range("A1").value

'tutaj przydałby mi się edytor bo nie pamiętam, jaka funkcja służy do podmiany części stringa na inny string - chodzi o to, żeby w c czyli naszym tekście podmienić

'zmienna_1'^2 + 'zmienna_2'^2

na

a^2+b^2

jak to zrobisz to wystarczy się odwołać do nowopowstałej funkcji

wynik = a^2 + b^2

end sub

Mam nadzieję, że rozjaśniłem :) Takie podmianki łatwe nie są, więc lepiej operować właśnie adresami komórek - pierwsza zmienna A1, druga A2, trzecia A3 etc - to już łatwo się używa.

02.01.2009
23:30
[13]

frer [ God of Death ]

Ok dzięki, jeszcze jutro nad tym pokombinuję trochę, bo dziś już nie mam do tego siły.
Poza tym widzę, że w podmianki jeszcze będę się musiał bawić, ale już w pliku tekstowym, bo muszę jeden arkusz zapisać w formacie text ms-dos, ale nawet gdy to zrobię to w pliku dostaję wszystkie wartości liczbowe w " ", a do tego niepotrzebne tabulacje i będę musiał znaleźć sposób żeby to pousuwać. :)

© 2000-2021 GRY-OnLine S.A.