Discussion:
VBA Pytanie.
(Wiadomość utworzona zbyt dawno temu. Odpowiedź niemożliwa.)
Lem87
2006-10-18 20:54:06 UTC
Permalink
Witam,

mam kilka pytań odnosnie pewnych zapisów w VBA oraz wykorzystywania
bibliotek w VBA.

1. Czym sie rozni deklarowanie zmiennych (z BvVal od bez ByVal)
np. 'Function strFunkcja33(ByVal strFullPath As String) as
String'

2. Za co odpowiada ponizszy kod:

Declare Function GetOpenFileName Lib "comdlg32.dll" Alias _
"GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Boolean

3. Co to sa tak naprawde te biblioteki i co mozna z nich wyciagnac, w
jaki sposob moga byc przydatne przy programowaniu w VBA?

Z gory dzieki za odpowidz.
Pozdrowienia
Snake Plissken
2006-10-19 07:30:08 UTC
Permalink
| 1. Czym sie rozni deklarowanie zmiennych (z BvVal od bez ByVal)
| np. 'Function strFunkcja33(ByVal strFullPath As String) as
| String'

W przypadku funkcji oczekujemy, ze jej kod zwroci nam po przetworzeniu jakas
wartosc tekstowa, liczbowa, logiczna - a zatem musi dostac jakas wartosc na
wejscie. Wartosc wejsciowa mozna przekazac do funkcji w rozny sposob.
ByVal - "poprzez wartosc" - oznacza, ze przekazujemy ja w postaci konkretnej
wartosci przenoszonej z zewnatrz przez zmienna. ByRef - "poprzez
odwolanie" - oznacza zas, ze wywolujac funkcje odwolujemy sie do jakiegos
zakresu, np adresu komorki

| 2. Za co odpowiada ponizszy kod:
|
| Declare Function GetOpenFileName Lib "comdlg32.dll" Alias _
| "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Boolean

to deklaracja ze funkcja "GetOpenFileName " wywolywana ma byc z biblioteki
comdlg32.dll a jej "swojska nazwa"
ktora od tego momentu bedzie obowiazywala w Twoim kodzie to
"GetOpenFileNameA". Funkcja zwraca wartosc logiczna

| 3. Co to sa tak naprawde te biblioteki i co mozna z nich wyciagnac, w
| jaki sposob moga byc przydatne przy programowaniu w VBA?

biblioteki to zasobniki skompilowanego kodu, ktory jest przywolywany przez
program gdy tylko jest to konieczne (np wysyla sie z glownego kodu programu
jakies dane by przywolana funkcja z biblioteki to przeliczyla i zwrocila
wynik itp) - stad dll = "dynamic linked library"
w jaki sposob moga byc przydatne? Pytanie o filozoficznej wrecz glebi...
Jesli wiesz jaka biblioteka co zawiera to mozesz uzyc jej jako "fragmentu"
swojego programu porzez odwolywanie sie do jej mozliwosci. Wiedza na temat
funkcjonalnosci i zawartosci bibliotek roznych programow to cos w rodzaju
wspolczesnej alchemii :-)
To po krotce, bo ja nie jestem najlepszym zrodlem wiedzy w biezacym watku.
Tajan
2006-10-19 08:47:57 UTC
Permalink
Witam!
Post by Snake Plissken
Post by Lem87
1. Czym sie rozni deklarowanie zmiennych (z BvVal od bez ByVal)
np. 'Function strFunkcja33(ByVal strFullPath As String) as
String'
W przypadku funkcji oczekujemy, ze jej kod zwroci nam po przetworzeniu jakas
wartosc tekstowa, liczbowa, logiczna - a zatem musi dostac jakas wartosc na
wejscie. Wartosc wejsciowa mozna przekazac do funkcji w rozny sposob.
ByVal - "poprzez wartosc" - oznacza, ze przekazujemy ja w postaci konkretnej
wartosci przenoszonej z zewnatrz przez zmienna. ByRef - "poprzez
odwolanie" - oznacza zas, ze wywolujac funkcje odwolujemy sie do jakiegos
zakresu, np adresu komorki
To nie tak. Jeżeli do funkcji (lub procedury) przekazujemy argument poprzez
wartość (ByVal), to tego modyfikacja argumentu wewnątrz procedury/funkcji nie
wpływa na wartość rzeczywistej zmiennej, która posłuzyła nam jako ten argument.
Przekazanie przez referencję powoduje, że modyfikacja argumentu jest w
rzeczywistości modyfikacją zmiennej. Dla przykładu:

Sub test()

a = "Ala"
b = "Ala"

proc1 a
proc2 b

MsgBox a
MsgBox b

End Sub

Sub proc1(ByVal arg)
arg = "Ola"
End Sub

Sub proc2(ByRef arg)
arg = "Ola"
End Sub

Po uruchomieniu procedury Test MsgBox'y wyświetlą teksty "Ala" i "Ola", bowiem
zmienna b jest przekazywana przez referencję i modyfikacja argumentu wewnątrz
procedury Proc2, jest w rzeczywistości modyfikacja tej zmiennej, bowiem do
procedury został przekazany tylko adres(referencja) tej zmiennej w pamieci
komputera. W przypadku przekazywania przez wartość, w pamięci komputera jest
tworzona nowa zmienna o wartości odpowiadającej wartości argumentu i tylko ona
jest modyfikowana. Domyślnie zmienne w VBA przekazywane sa przez referencję.


Tajan
Snake Plissken
2006-10-19 08:56:57 UTC
Permalink
Podpisuje sie pod tym wszystkimi czlonkami ;-)
Rzeczywiscie - nieco splaszczylem wypowiedz.
pxd74
2006-10-26 19:10:19 UTC
Permalink
Post by Snake Plissken
|
| Declare Function GetOpenFileName Lib "comdlg32.dll" Alias _
| "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Boolean
to deklaracja ze funkcja "GetOpenFileName " wywolywana ma byc z biblioteki
comdlg32.dll a jej "swojska nazwa"
ktora od tego momentu bedzie obowiazywala w Twoim kodzie to
"GetOpenFileNameA". Funkcja zwraca wartosc logiczna
Chyba odwrotnie! Funkcja w bibliotece nazywa się GetOpenFileNameA a w kodzie
używasz pod nazwą GetOpenFileName.
--
Pozdrowienia
pxd74
Loading...