Podstawy programowania VBA

Download Report

Transcript Podstawy programowania VBA

Podstawy
programowania w VBA
Microsoft Office Excel 2003
Edytor VBA

Skrót Alt+F11
2/20
Opcje edytora VBA
3/20
Najważniejsze opcje edytora VBA
 Auto Syntax Check

 Auto Syntax Check
 Auto List Members
 Auto Quick Info
! Zaznaczenie opcji działa od nowo otwartego modułu
 Auto Data Tips
4/20
Okienko Immediate

Skrót Ctrl + G
Sub procSub(arg)
a = arg + arg
Debug.Print a
End Sub
Function procFunc(arg)
procFunc = arg + arg
End Function
5/20
Hierarchia obiektów
Excel
Application
Zeszyt1.xls
Workbook
Arkusz1
WorkSheet
Arkusz2
WorkSheet
6/20
Komórki A1, A2, …, IV65536
Range
Komórki A1, A2, …, IV65536
Range
…
WorkSheets
Zeszyt2.xls
Workbook
…
Workbooks
Arkusz1
Arkusz2
…
WorkSheets
Application.Workbooks(„Zeszyt1.xls”).WorkSheets(„Arkusz1”).Range(„A1”)
Objekty aktywne
7/20
Wartosc = Application.Workbooks(„Zeszyt.xls”). _
Workbook
Worksheets(„Arkusz1”).Range(„A1”).Value
Worksheet
Jeżeli Zeszyt.xls jest aktualnie otwartym dokumentem
Wartosc = Worksheets(„Arkusz1”).Range(„A1”).Value
Wartosc = ActiveWorkbook. _
Worksheets(„Arkusz1”).Range(„A1”).Value
•
oraz Arkusz1 jest aktualnie otwartym arkuszem
Wartosc = Range(„A1”).Value
Wartosc = ActiveSheet.Range(„A1”).Value
•
Określenie argumentów dla metod
i właściwości
8/20
Object.Protect([Password],[Structure],[Windows])
ActiveWorkbook.Protect „abc”, True, False
ActiveWorkbook.Protect
, True, False
ActiveWorkbook.Protect Structure:=True
• Gdy metody i właściwości zwracają wartość
Object.Adress([RowAbsolute],[ColumnAbsolute]…) As String
adres = ActiveCell.Adress(False, True);
adres = ActiveCell.Adress(ColumnAbsolute:=True);
Obiekt Range
9/20
Istnieją 3 możliwości uzyskania objectu Range.
• Właściwość Range obiektu Worksheet lub obiektu klasy Range
• Właściwość Cells obiektu Worksheet lub obiektu klasy Range
• Właściwość Offset obiektu Range
Odwołanie do komórki może być
• bezwzględne
• względne
Obiekt Range
I. Właściwość Range
10/20
Właściwość Range zwraca obiekt Range
• obiekt.Range(komórka1)
• objekt.Range(komórka1,komórka2)
Właściwość Range obiektu Worksheet (przykłady)
ActiveSheet.Range(”A1”).Value=1
ActiveSheet.Range(”A3:B5”).Value=2
ActiveSheet.Range(”A3”,”B5”).Value=3
ActiveSheet.Range(”C1,E3,F2”).Value=4
Właściwość Range obiektu Range (przykład)
ActiveCell.Range(”B2”) = 5
‘odwołanie względne
Obiekt Range
II. Właściwość Cells
11/20
Właściwość Cells zwraca obiekt Range
• obiekt.Cells(idRow,idColumn)
• obiekt.Cells(idRow)
• obiekt.Cells
Właściwość Cells obiektu Worksheet (przykłady)
ActiveSheet.Cells(1,1).Value=1
ActiveSheet.Cells(520).Value=2
ActiveSheet.Cells.ClearContents
Właściwość Cells obiektu Range (przykłady)
ActiveCell.Cells(3,2).Value=3
Range(”B1:C10”).Cells(5).Value=4
‘odwołanie względne
‘odwołanie względne
Obiekt Range
III. Właściwość Offset
12/20
Właściwość Offset zwraca objekt Range
• obiekt.Offset(idRow, idColumn)
Właściwość Offset obiektu Range
ActiveCell.Offset(0,0).Value=3
ActiveCell.Offset(-1,2).Value=3
‘odwołanie względne
‘odwołanie względne
Obiekt Range
13/20
Odwołanie względne i bezwzględne
ActiveSheet.Range(”A7”).Value = ”abc”
WorkSheets(”Ark1”).Cells(1,1).Value = 123
WorkSheet
ActiveCell.Range(”A3”).Value = ”range”
Range(”D6”).Cells(1,1).Value = ”cells”
ActiveCell.Offset(0,0).Value = ”offset”
Range
B
C
A
1
2
3
odwołanie
bezwzględne
odwołanie
względne
123
offset
Odwołanie względem aktywnej komórki
range
cells
abc
Odwołanie względem
komórki D6
Procedury Sub i Function
14/20
Sub procSub(arg)
arg = arg*2
End Sub
Function procFunc(arg)
procFunc = arg*2
End Function
zm=5
Call procSub(zm)
MsgBox zm
zm=5
nie zwraca wartości
 wymaga słowa kluczowego call
do wywołania procedury
 Argumenty przekazywane są
przez referencję


zm = procFunc(zm)
MsgBox zm
zwraca wartość (wartość
zwracana nazywa się tak samo
jak funkcja)
 argumenty przekazywane są
przez wartość
 dodaje się do funkcji użytkownika
(dostępne z poziomu formuły)
Procedury Sub
15/20
Sub procSub(arg)
arg = arg*2
End Sub
Sub procSub(byVal arg)
arg = arg*2
End Sub
Sub procSubMain()
zm = 5
MsgBox zm
Call procSub(zm)
MsgBox zm
End Sub
Sub procSubMain()
zm = 5
MsgBox zm
Call procSub(zm)
MsgBox zm
End Sub
Definiowanie typów danych
Dim
Dim
Dim
Dim
zm1
zm2
zm3
zm4
zm1
zm2
zm3
zm4
=
=
=
=
As
As
As
As
Intiger
Double
String*4
String
10
10,67
”abcd”
”abcd”
zm5 = 10
zm6 = 10,67
zm7 = ”abcd”
16/20
‘liczba całkowita
‘liczba rzeczywista
‘łańcuch znaków (stała długość)
‘łańcuch znaków (zmienna długość)
‘typ
‘typ
‘typ
‘typ
Intiger; 2 bajty
Double; 8 bajtów
String; 4 bajty
String; 14 bajtów
‘typ Variant; 16 bajtów
‘typ Variant; 16 bajtów
‘typ Variant; 26 bajtów
Instrukcje warunkowe i pętle
IF warunek Then
…
Else If
…
Else
…
End IF
Select Case opcja
Case 1
…
Case 2
…
Case Else
…
End Select
For Each i in tab
…
Next i
For i=1 To 5
…
Next i
Do While warunek
…
Loop
Do
…
Loop While warunek
17/20
Tablice
‘Deklarowanie tablicy o 5 elementach typu całkowitego
Dim tablicaInt(5) As Integer
‘Deklarowanie tablicy dynamicznej typu tekstowego
Dim tablicaStr() As String
‘Nadanie rozmiaru tablicy
n=5
ReDim tablicaStr(1 To n)
‘Przypisanie wartości pierwszemu elementowi tablicy
tablicaStr(1)= ”abcdef”
‘Wykorzystanie pętli for do wypełnienia tablicy
For i=1 To n
tablicaStr(i) = ”abcdef”
Next i
18/20
Właściwość Selection
objektu Application
19/20
Areas(1)
Selection
Areas(2)
obiekt Range
Areas(3)
Areas(4)
Areas(5)
Lob = Selection.Areas.Count
Lkom = Selection.Areas(1).Count
w = Selection.Areas(1).Row
k = Selection.Areas(1).Column
Lw = Selection.Areas(1).Rows.Count
Lk = Selection.Areas(1).Columns.Count
‘
‘
‘
‘
‘
‘
Lob=5
Lkom=4
w=1
k=1
Lw=2
Lk = 2
Wypełnianie tablicy wartościami
z zaznaczonych komórek arkusza
20/20
Sub Wypelnij()
Dim TabStr() As String
If TypeName(Selection) = "Range" Then
k = 1
For Each obszar In Selection.Areas
PwOb = obszar.Row
PkOb = obszar.Column
iW = obszar.Rows.Count
iK = obszar.Columns.Count
rozmiar = k - 1 + iW * iK
ReDim Preserve TabStr(rozmiar)
For i = PwOb To PwOb + iW - 1
For j = PkOb To PkOb + iK - 1
TabStr(k) = Cells(i, j).Value
k = k + 1
Next j
Next i
Next obszar
b1
b2
a1
a2
b4
End If
End Sub
c4
a6
d6
d7
d8
b7
obszar
PwOb
PkOb
iW
iK
rozm
i
i<=iW
j
J<=iK
d4
k
TabStr