VB4, BAZY DANYCH


zmienne tablicowe

deklaracja zmiennych tablicowych

Tablica jednowymiarowa

Dim nazwa_tablicy(wymiar) As typ_elementów

wymiar:

indeks_początkowy To indeks_końcowy

indeks_końcowy

Elementy tablicy domyślnie numerowane są od 0

Jeśli użytkownik chce, aby wszystkie tablice numerowane były od jedynki, w obszarze declarations powinien użyć instrukcji:

Option Base 1

Uwaga:

Excel kontroluje zakres indeksów. Jeśli w programie następuje przekroczenie zakresu tablicy pojawia się błąd:

0x01 graphic

Przykłady:

Dim tab(100) As Integer

istnieje element tab(0), tab(100), nie ma elementu tab(101)

Dim tab(1 To 100) As Integer

istnieje element tab(1), tab(100), nie ma elementu tab(101), czy tab(0)

Option Base 1

...........

Dim tab(100) As Integer

Tablice wielowymiarowe

Deklaracja tablicy dwuwymiarowej:

Dim nazwa_tablicy(wymiar1,wymiar2) As typ_elementów

wymiarn:

indeks_początkowyn To indeks_końcowyn

indeks_końcowyn

Przykłady:

Dim tab(5, 4) As Double

Dim tab(1 To 10, 1 To 2) As String * 5

Option Base 1

...........

Dim tab(13, 4) As Integer

Dim tab(5, 6, 7) As Long

wykorzystanie zmiennych tablicowych

Sub num()

Dim A(2) As Integer

A(0) = 1

A(1) = 3

A(2) = 19

MsgBox "wartości elementów tablicy" & vbCrLf _

& A(0) & "," & A(1)& "," & A(2)

End Sub

0x01 graphic

Sub wek()

Dim A(1 To 5) As Integer

For i = 1 To 5

A(i) = i

Next

kom = "tablica="

For i = 1 To 5

kom = kom & A(i) & ","

Next

MsgBox kom

End Sub

0x01 graphic

Sub naj()

Dim A(1 To 5) As Integer

For i = 1 To 5

A(i) = Worksheets("Arkusz1").Range("A1").Offset(i - 1, 0)

Next

Max = A(1): j = 1

For i = 2 To 5

If A(i) > Max Then Max = A(i): j = i

Next

MsgBox "Największy element zapisany jest w " & j & "-tym wierszu i _

jest równy " & Max

End Sub

0x01 graphic

0x01 graphic

Sub iloczyn()

'oblicza iloczyn macierzy

Dim A(1 To 3, 1 To 4) As Integer, B(1 To 4, 1 To 2) As Integer

Dim C(1 To 3, 1 To 2) As Integer

' wczytanie macierzy A

For i = 1 To 3

For j = 1 To 4

A(i, j) = Worksheets("Arkusz1").Range("A1").Offset(i - 1, j - 1)

Next j

Next i

' wczytanie macierzy B

For i = 1 To 4

For j = 1 To 2

B(i, j) = Worksheets("Arkusz1").Range("F1").Offset(i - 1, j - 1)

Next j

Next i

' mnożenie

For i = 1 To 3

For j = 1 To 2

C(i, j) = 0

For k = 1 To 4

C(i, j) = C(i, j) + A(i, k) * B(k, j)

Next k

Next j

Next i

' wyniki

kom = "Iloczyn macierzy" & vbCrLf

For i = 1 To 3

kom = kom & C(i, 1) & "," & C(i, 2) & vbCrLf

Next i

MsgBox kom

End Sub

0x01 graphic

0x01 graphic

Tablice dynamiczne

Tablica dynamiczna nie ma z góry określonej liczby elementów.

Dim nazwa_tablicy() As typ_elementów

Przed użyciem tablicy musi zostać określony jej rozmiar

ReDim nazwa_tablicy(wymiary) [As typ_elementów]

Sub tabl_dyn()

Dim A() As Integer

i = 2

j = 3

ReDim A(1 To i, 1 To j)

A(2, 2) = 7

MsgBox A(2, 2)

k = 11

ReDim A(1 To k)

A(7) = 8

MsgBox A(7)

End Sub

Rozmiar tabeli może być określony przez użytkownika programu:

Sub tabl_dyn()

Dim A() As Integer

i = InputBox("podaj liczbę wierszy tabeli")

j = InputBox("podaj liczbę kolumn tabeli")

ReDim A(1 To i, 1 To j)

MsgBox "Macierz ma wierszy - " & i & " i kolumn - " & j

End Sub

sortowanie wektora

Sub sort1()

Dim x() As Integer, y() As Integer

m = 4

ReDim x(1 To m), y(1 To m)

For i = 1 To m

x(i) = ActiveSheet.Range("a1").Offset(i - 1, 0)

Next i

For i = 1 To m

Min = x(1): k = 1

For j = 2 To m

If x(j) < Min Then Min = x(j): k = j

Next j

x(k) = 1000

y(i) = Min

Next i

For i = 1 To m

ActiveSheet.Range("a1").Offset(i - 1, 1).Value = y(i)

Next i

End Sub

0x01 graphic

0x01 graphic

Sub sort2()

Dim x() As Integer

m = 5

ReDim x(1 To m)

For i = 1 To m

x(i) = ActiveSheet.Range("a1").Offset(i - 1, 0)

Next i

If x(1) > x(2) Then pom = x(1): x(1) = x(2): x(2) = pom

For i = 3 To m

j = i - 1

b = x(i)

Do Until (j = 1 Or b > x(j))

x(j + 1) = x(j)

x(j) = b

j = j - 1

Loop

If x(1) > b Then x(2) = x(1): x(1) = b

Next i

For i = 1 To m

ActiveSheet.Range("a1").Offset(i - 1, 1).Value = x(i)

Next i

End Sub

0x01 graphic

0x01 graphic

obiekty i kolekcje

zmienne obiektowe

Zmienna obiektowa reprezentuje obiekt Microsoft Excel.

Deklaracja - Dim lub Public

Przykłady

WorkSheets(”Arkusz1”).Range(”A1”).Value = 567

WorkSheets(”Arkusz1”).Range(”A1”).Font.Bold = True

WorkSheets(”Arkusz1”).Range(”A1”).Font.Italic = True

Wykorzystanie zmiennej obiektowej:

Dim Kom As Range

Set Kom = WorkSheets(”Arkusz1”).Range(”A1”)

Kom.Value = 567

Kom.Font.Bold = True

Kom.Font.Italic = True

Dim ark As Worksheet

Set ark = Application.ActiveSheet

ark.Range("A1:C3").Interior.ColorIndex = 2

ark.Range("A1:C3").Borders.ColorIndex = 6

ark.Range("A1:C3").Font.ColorIndex = 7

Przykładowe kody kolorów:

1-black 2-white 3-red 4-green 5-blue 6-yellow

predefiniowane stałe

vbBlack vbWhite

instrukcja with

Składnia:

With obiekt

instrukcje wykonywane na obiekcie

(nazwy metod i właściwości poprzedzone kropką)

End With

With WorkSheets(”Arkusz1”).Range(”A1”)

.Value = 567

.Font.Bold = True

.Font.Italic = True

End With

With Application.ActiveSheet

.Range("A1:C3").Interior.ColorIndex = 2

.Range("A1:C3").Borders.ColorIndex = 6

.Range("A1:C3").Font.ColorIndex = 7

End With

instrukcja for each-next

Składnia:

For Each element In grupa

[instrukcje]

[Exit For]

[instrukcje]

Next [element]

Pętla wykonuje operacje dla wszystkich elementów grupy

Wypełnienie tablicy wartościami losowymi z przedziału 0-1 i wypisanie ich w oknach dialogowych:

Dim Tabl(5) As Single

Randomize

For i = 0 to 5

Tabl(i) = Rnd

Next i

For Each t In Tabl

MsgBox t

Next t

lub

Next

Wypisanie w oknach dialogowych nazw arkuszy w aktywnym skoroszycie:

Dim ark As Worksheet

For Each ark In ActiveWorkbook.Worksheets

MsgBox ark.Name

Next ark

Zamykanie nieaktywnych skoroszytów:

Dim SK As Workbook

For Each SK In Workbooks

If SK.Name <> ActiveWorkbook.Name Then SK.Close

Next SK

Zamiana we wszystkich komórkach zaznaczonego obszaru liter na duże:

Dim kom As Range

For Each kom In Selection

kom.Value = UCase(kom.Value)

Next kom

typy danych użytkownika

Typy użytkownika definiowane są w obszarze declaration

Składnia:

Type nazwa_typu

nazwa_zm1 As type_zm1

nazwa_zm21 As type_zm2

.....

End Type

Odwołanie do elementów

Dim nazwa_zmiennej As nazwa_typu

nazwa_zmiennej.nazwa_zm1

nazwa_zmiennej.nazwa_zm2

Przykład

0x01 graphic

Type rach

cena As Currency

ilosc As Single

wartosc As Currency

End Type

Sub rachunek()

Dim dane As rach, i As Integer, ob As Range

Set ob = ActiveSheet.Range("a1")

i = 1

Do Until ob.Offset(i, 0).Value = ""

dane.cena = ob.Offset(i, 1).Value

dane.ilosc = ob.Offset(i, 2).Value

ob.Offset(i, 3).Value = dane.cena * dane.ilosc

ob.Offset(i, 3).NumberFormat = "#0.00 zł"

i = i + 1

Loop

End Sub

Inne rozwiązanie:

Range("D2").Value = "=B2*C2"

Range("D2").Copy Destination:=Range("D3:D5")

Range("D2:D5").NumberFormat = "#0.00 zł"

Metoda Copy obiektu Range

zakres_kopiowany.Copy Destination := zakres_docelowy

gdzie:

zakres_kopiowany - zakres, którego zawartość zostanie skopiowana

Destination - parametr zawierający obszar, do którego kopiowany jest zakres_kopiowany

zakres_docelowy - zakres ten musi być zgodny z zakresem kopiowanym

0x01 graphic

funkcje i procedury wbudowane

Funkcje wbudowane:

Lista funkcji wywoływanych bezpośrednio w kodzie VBA:

Lista funkcji obiektu Application.WorksheetFunction:

Uwaga:

Pomoc na temat określonej funkcji podświetlić nazwę i F1

W przypadku funkcji obiektu Application.WorksheetFunction po kliknięciu F1 należy kliknąć List of Worksheet Functions Available to Visual Basic i wybrać funkcję z listy.

Przykłady

dzis = VBA.Now

kom = "numer miesiąca -" & VBA.Month(dzis)

MsgBox kom

kom = "rok -" & VBA.Year(dzis)

MsgBox kom

sss = "suma w obszarze jest równa ="

sss = sss & Application.WorksheetFunction.Sum(Range("b7:d9"))

MsgBox sss

sss = "średnia w obszarze jest równa ="

sss = sss & Application.WorksheetFunction.Average(Range("b7:d9"))

MsgBox sss

x = Application.WorksheetFunction.Pi()

MsgBox x

lub

x = Application.WorksheetFunction.Pi

i = Application.WorksheetFunction.CountBlank(Range("a1:b10"))

MsgBox i

procedury użytkownika

Procedura jest ciągiem instrukcji, którym nadawana jest nazwa.

Procedury napisane przez użytkownika mogą być wywoływane z innych procedur (również z poziomu arkusza).

Procedury mogą mieć parametry (argumenty), których wartość musi być określona w chwili wykonywania procedury.

Deklaracja procedury

[Private|Public |Static] Sub nazwa_procedury [(lista_param_form)]

[instrukcje]

[Exit Sub]

[instrukcje]

End Sub

gdzie:

Private - procedura jest dostępna tylko w obrębie danego modułu

Public - procedura jest dostępna we wszystkich otwartych skoroszytach (jeśli moduł zawiera instrukcję Option Private w obszarze Declaration, dostęp zostaje ograniczony do projektu) - Public jest zakresem domyślnym

Static - zmienne lokalne procedury zachowują wartości po jej zakończeniu

nazwa_procedury - nazwa musi spełniać warunki jak nazwy zmiennych. Dodatkowo musi być różna od adresów komórek (np. A3, B11, AA28)

Exit Sub - instrukcja powodująca natychmiastowe wyjście z procedury

lista_param_form - (lista parametrów formalnych) lista zmiennych oddzielonych przecinkami

nazwa_par

nazwa par As typ_parametru

ByVal nazwa_par

ByVal nazwa_par As typ_parametru

Jeśli typ parametru nie został określony, ma on typ Variant

Wywołanie procedury

Wywołanie procedury w innej procedurze

Call nazwa_procedury [(lista_parametrów_aktualnych)]

lub

nazwa_procedury [(lista_parametrów_aktualnych)]

gdzie:

parametr_aktualny - zmienna, tablica, wyrażenie

Wywołanie procedury z innego modułu

Application.Run ("Skoroszyt!Moduł.nazwa_procedury")

Przykład

Skoroszyt Zeszyt2:

Sub wywolanie()

Application.Run ("Zeszyt1.xls!Module1.proc1")

MsgBox "procedura wywołująca"

End Sub

Skoroszyt Zeszyt1, Module1:

Sub proc1()

MsgBox "procedura"

End Sub

Wywołanie procedury z poziomu arkusza

Narzędzia | Makro | Makra

0x01 graphic

Przekazywanie parametrów do procedury

Parametry mogą być przekazywane do procedury na dwa sposoby:

Przykłady

Parametry przekazywane przez referencje i przez wartość

Sub p1(a As Integer, ByVal b As Integer)

MsgBox a & " " & b '1 1

a = 15

b = 20

End Sub

Sub p2()

Dim w As Integer, z As Integer

w = 1

z = 1

Call p1(w, z)

MsgBox w '15

MsgBox z '1

End Sub

Wyrażenie jako parametr aktualny

Sub p1(a As Integer, ByVal b As Integer)

MsgBox a & " " & b '3 4

a = 15

b = 20

End Sub

Sub p2()

Dim w As Integer, z As Integer

w = 1

z = 1

Call p1(w + 2, z + 3)

MsgBox w '1

MsgBox z '1

End Sub

Parametr w postaci tablicy (musi być ostatnim parametrem)

Sub p1(Tabl() As Integer)

Sum = 0

For Each t In Tabl

Sum = Sum + t

Next t

MsgBox "Suma elementów tablicy " & Sum '10

End Sub

Sub p2()

Dim a(1 To 4) As Integer

a(1) = 1: a(2) = 2: a(3) = 3: a(4) = 4

Call p1(a)

End Sub

Tablica jest przekazywana przez zmienną

Sub p1(Tabl() As Integer)

Sum = 0

i = 0

For Each t In Tabl

i = i + 1

Sum = Sum + t

Next t

MsgBox "Suma elementów tablicy " & Sum '10

For j = 1 To i

Tabl(j) = Tabl(j) + 1

Next

End Sub

Sub p2()

Dim a(1 To 4) As Integer

a(1) = 1: a(2) = 2: a(3) = 3: a(4) = 4

Call p1(a)

MsgBox "Tablica " & a(1) & "," & a(2) & "," & a(3) & "," & a(4) '2,3,4,5

End Sub

Wykorzystanie zmiennych globalnych

Dim agl As Integer

Sub p1()

Dim a As Integer

a = 15

MsgBox "procedura p1, zmienna lokalna a=" & a & " zmienna globalna agl=" & agl

agl = 1000

End Sub

Sub p2()

a = 2: agl = 7

Call p1

MsgBox "procedura p2, zmienna lokalna a=" & a & " zmienna globalna agl=" & agl

End Sub

Przykład

Jakie komunikaty pojawią się na ekranie?

Dim glo As Integer

Sub p1(a As Integer, ByVal b As Integer)

a = 1: b = 20: glo = 300

MsgBox "W a=" & a & " b=" & b & " glo=" & glo

End Sub

Sub p2()

Dim i As Integer, j As Integer

i = 12: j = 14: glo = 123

MsgBox "Z i=" & i & " j=" & j & " glo=" & glo

Call p1(i, j)

MsgBox "Z i=" & i & " j=" & j & " glo=" & glo

End Sub

funkcje użytkownika

Funkcje zwracają wartość. Tak jak procedury mogą mieć parametry.

Deklaracja funkcji

[Private|Public |Static] Function nazwa_f [(lista_pf)][As typ]

[instrukcje]

[Exit Function]

[instrukcje]

End Function

gdzie:

nazwa_f - nazwa funkcji musi spełniać takie same warunki jak nazwa procedury

Exit Function - instrukcja powodująca natychmiastowe wyjście z funkcji

lista_pf - (lista parametrów formalnych) lista zmiennych oddzielonych przecinkami

nazwa_par

nazwa par As typ_parametru

ByVal nazwa_par

ByVal nazwa_par As typ_parametru

typ - opcjonalny, typ wartości zwracanych przez funkcję

End Function - koniec funkcji

Wywołanie funkcji

zmienna = nazwa_f [(lista_pa)]

Uwaga: Typ zmiennej musi się zgadzać z typem określonym w deklaracji

zmienna = Skoroszyt!nazwa_f [(lista_pa)]

Przykład

Funkcja zwracająca łańcuch w odwrotnej kolejności

Function odw(a As String) As String

Dim j As Long

n = Len(a)

odw = ""

For i = 0 To n - 1

j = n - i

p = VBA.Mid(a, j, 1)

odw = odw & p

Next i

End Function

Sub zew()

Dim a As String, b As String

a = "zajęcia z VBA"

b = odw(a)

MsgBox b `ABV z aicęjaz

End Sub

Funkcja VBA Mid

Mid (łańcuch, numer_poczatkowy, długość)

Zwraca łańcuch o długości długość, pobrany z łańcucha począwszy od znaku numer_poczatkowy

gdzie:

numer_poczatkowy - musi być typu long

długość - jeśli pominięty wycina znaki do końca łańcucha

1



Wyszukiwarka