You are on page 1of 14

Chng 5: Lp trnh VBA cn bn

CHNG 5
LP TRNH VBA CN BN
1. Mi trng lp trnh VBA
VBA Visual Basic for Application gip ngi dng c th to ra cc
tu bin mnh hn, thn thin hn vi trong cng vic ca mnh. Hn th na
VBA trn Access th hin tnh chuyn nghip trong lp trnh, phn no bin
c mt CSDL n gin tr thnh nhng sn phm ng gi thng mi.
Mn hnh lm vic ngn ng VBA thng c dng:

* H thng thc n v thanh cng c


Cng nh bt k mi trng lm vic no u c h thng thc n v
thanh cng c i km. Trn c cha cc lnh gi, thi hnh hoc thit lp
cc iu khin cn thit.
45

Chng 5: Lp trnh VBA cn bn

* Ca s Project Explorer
C rt nhiu cc thnh phn c th lp trnh c bi VBA nh: Forms,
Reports, Modules. Ca s Project Explorer l cy phn cp lp cc i tng c
cha m lnh VBA, ng thi gip lp trnh vin d dng trong vic vit
(coding) cng nh qun l cc m lnh VBA vit.
* Ca s vit lnh
Ca s vit lnh l ni son tho cc dng lnh VBA. Mi ca s s cha
ton b m lnh cho mt i tng nh: Forms, Reports, Modules. Trong mi
ca s c th c nhiu phn c vit lnh, mi phn c th l ni dung mt
khai bo, mt chng trnh con, ni dung mt th tc p ng s kin.
* Ca s Intermediate
Ca s Intermediate l ni gip thi hnh trc tip mt cu lnh no , rt
hu dng trong vic g li phn mm.
2. Kiu d liu - Bin - Hng
2.1 Kiu d liu c bn
a, Boolean
Kiu l gc, tng t kiu Boolean trn Pascal. Kiu ny chim 2 byte b
nh; ch nhn mt trong 2 gi tr l: Yes No hoc True False hoc i khi th
hin di dng s 0 tng ng vi False, True tng ng vi bt k s no
khc 0.
Khi lp trnh CSDL, kiu Boolean tng ng vi kiu Yes/No trong bng
d liu.
b, Byte
Kiu s nguyn dng trong phm vi t 0..255. Kiu ny chim 1 byte b
nh.
c, Integer
Kiu nguyn, c gi tr trong khong -32768...32767. Kiu ny chim 2
bytes b nh.
d, Long
Kiu s nguyn di, c gi tr trong khong 2,147,483,648 ..
2,147,483,647.
Kiu ny chim 4 bytes b nh.
e, Single
Kiu s thc, c gi tr trong khong 1.401298E-45 to 3.402823E38.
Chim 4 bytes b nh.

46

Chng 5: Lp trnh VBA cn bn

f, Double
Kiu s thc c ln hn kiu Single, c gi tr trong khong
4.94065645841247E-324 n 1.79769313486232E308.
Chim 8 bytes b nh.
g, Currency
Kiu tin t. Bn cht l kiu s, ln 8 bytes, c gi tr trong khong 922,337,203,685,477.5808 n 922,337,203,685,477.5807.
c bit, kiu ny lun c k hiu tin t i km.
h, String
Kiu xu k t. Kiu ny tng ng vi kiu String trong Pascal, tng
ng vi kiu Text trong cc trng CSDL Access. ln ti a 255 bytes
tng ng vi kh nng x l xu di 255 k t.
i, Variant
Variant l kiu d liu khng tng minh. Bin kiu ny c th nhn bt
k mt gi tr no c th.
Ngi ta thng khai bo bin kiu Variant trong nhng trng hp phi
x l bin mm do. Khi th bin nhn gi tr kiu ny, khi th nhn gi tr v
x l theo kiu d liu khc.
j, Object
Object l mt loi bin kiu Variant, chim dung lng nh 4 bytes, dng
tham chiu ti mt loi i tng (Object) no trong khi lp trnh. Tt
nhin mun khai bo bin Object kiu no, phi chc chn i tng c
ng k vo th vin tham chiu VBA bi tnh nng Tool | Reference. Chng ta
s cn tr li vn ny khi lp trnh CSDL.
2.2 Bin v cch s dng bin
a. Khai bo bin
Bin (Variable) l thnh phn ca mt ngn ng lp trnh, gip x l d
liu mt cch linh hot v mm do.
Thng thng trong cc ngn ng lp trnh, mi bin khi tn ti phi
c nh kiu, tc l phi nhn mt kiu d liu xc nh. Tuy nhin trong
VBA th khng, mi bin c th nh kiu (c khai bo trc khi s dng)
hoc khng nh kiu (khng khai bo vn s dng c). Trong trng hp
ny bin s t nhn kiu gi tr Variant.
Bin c th c khai bo bt k u trong phn vit lnh ca VBA. Tt
nhin, bin c hiu lc nh khai bo ch bt u t sau li khai bo v m bo
phm vi hot ng nh qui nh.
47

Chng 5: Lp trnh VBA cn bn

C php khai bo bin:


Dim <tn_bin> As <tn_kiu>
b. Phm vi bin
Nh chng ta bit, mi bin sau khi c khai bo n s nhn mt kiu
d liu v c mt phm vi hot ng, tc l li khai bo bin ch c tc dng
trong nhng vng c ch nh; ngoi vng ch nh bin s khng c tc
dng, nu c tc dng s theo ngha khc (bin cc b kiu Variant chng hn).
* Bin cc b:
Bin cc b c khai bo sau t kho Dim, n ch c tc dng trong mt
chng trnh con, cc b trong mt form hoc mt module no . Di y s
ch ra 3 trng hp bin cc b ny:
- Trong mt chng trnh con, nu n c khai bo trong chng trnh
con ;
- Trong c mt Form, nu n c khai bo trong phn Decralations ca
Form ;
- Trong c mt Reports, nu n c khai bo trong phn Decralations
ca Report ;
- Trong c mt Modules, nu n c khai bo trong phn Decralations
ca Modules ;
* Bin ton cc:
Bin ton cc c khai bo sau cm t kho Public, n c tc dng
trong ton b chng trnh ( bt k ch no c th vit lnh). Loi bin ny
lun phi c khi bo ti vng Decralations ca mt Module no .
Trn mt tp Access, khng c php khai bo trng tn bin ton cc.
Tuy nhin tn bin cc b vn c th trng tn bin ton cc, trong trng hp
VBA s u tin s dng bin cc b trong phm vi ca n.
2.3 Hng v cch s dng hng
a. Khai bo hng
Hng (Constan) l i lng c gi tr xc nh v khng b thay i trong
bt k hon cnh no. Tng ng vi tng kiu d liu, s c nhng hng tng
ng.
C php khai bo hng:
Const <tn_hng> = <gi_tr>
Sau y l cc v d v khai bo cc loi hng:
Const ngay = #24/12/2004#
Const phongban = "Ti v"
48

Chng 5: Lp trnh VBA cn bn

Const ok = True
b. Phm vi hng
Tng t nh bin, hng cng c nhng phm vi hot ng ca n. Hng
c khai bo trong th tc no, hoc cc b trong form, report hoc module
no s ch c tc dng trong phm vi .
Mun hng c phm vi ton cc, phi c khai bo sau t kho Public
Const, ti vng Decralations ca mt module no nh sau:
Public Const <tn_hng> = <gi_tr>
3. Cc cu trc lnh VBA
Cc cu trc lnh l thnh phn c bn ca mi ngn ng lp trnh. Thng
thng cc ngn ng lp trnh u c cc cu trc lnh nh nhau: lnh x l
iu kin, lnh lp bit trc s vng lp, lnh lp khng bit trc s vng
lp,.. Tuy nhin cch th hin (c php) mi cu trc lnh c th khc nhau tu
thuc vo mi ngn ng lp trnh. Hn na, mi ngn ng cng c th c mt
s im khc bit, c trng trong mi cu trc lnh.
Cng ging nh nhiu ngn ng lp trnh hin i khc, cc cu trc lnh
trong VBA u tun th cc nguyn tc:
- C cu trc: mi cu trc lnh u c t kho bt u v mt t kha
bo hiu kt thc.
- Thc hin tun t (loi tr trng hp c bit th tc Goto <Label>)
- C kh nng lng nhau.
3.1 Cu trc r nhnh
Cu trc r nhnh hay cn gi l lnh la chn. Tc l nu mt iu kin
no xy ra s l g, hoc tri li c th lm g.
C php:
If <iu kin> Then
<th tc 1>
[ Else
<th tc 2> ]
End If
ngha lnh trn l: nu <iu kin> = True th thc hin cc lnh trong
<th
tc1>. Tri li thc hin cc lnh trong <th tc 2>.
Phn trong cp du ngoc vung [..] c th c hoc khng c trong cu
lnh, tu

49

Chng 5: Lp trnh VBA cn bn

thuc vo mc ch x l.
3.2 Cu trc la chn
y l mt loi ca cu trc la chn. Thng thng hon ton c th s
dng If .. End If thc hin cc x l lin quan n kiu cu trc ny, nhng
trong nhng trng hp c bit, cu trc Select Case .. End Select th hin
c s tin dng vt tri.
C php
Select Case <biu thc>
Case <gi tr 1>
<th tc 1>
Case <gi tr 2>
<th tc 2>

Case <gi tr n>


<th tc n>
[Case Else
<th tc n+1>]
End Select
Trong : <Biu thc> lun tr v gi tr kiu v hng m c nh:
s nguyn, xu k t, kiu l gc,..
Vi cu trc ny, VBA hot ng nh sau:
(1) Tnh gi tr ca biu thc
(2) Kim tra <biu thc> = <gi tr 1> ?
- Nu ng thc hin <th tc 1> v kt thc lnh, thc hin
lnh tip theo sau t kho End Select.
- Nu sai, thc hin tip vic so snh <biu thc> = <gi tr
i> tip theo v x l tng t qui trnh nu trn.
(3) Trong trng hp <biu thc> <> <gi tr i>, i=1..n khi c
2 kh nng:
- Nu c tu chn Case Else th VBA s thc hin <th tc n+1>;
- Nu khng c tu chn Case Else, VBA s khng thc hin bt
k th tc no lit k trong vng Select .. End Select c m chuyn ti
thc hin lnh tip theo sau t kho End Select.

50

Chng 5: Lp trnh VBA cn bn

3.3 Cu trc lp
a, Cu trc FOR NEXT
For Next l mt cu trc lp bit trc s ln lp trong VBA, tuy nhin
trong nhng tnh hung c bit, vn c th s dng cu trc ny nh cu trc
khng bit trc c s ln lp.
C php:
For <bin chy> = <gi tr 1> To <gi tr 2> [Step <n>]
<th tc>
[Exit For]
Next
Trong :
- <bin chy> l bin kiu v hng m c, hay dng nht l
bin kiu nguyn;
- <gi tr 1>, <gi tr 2> l cc gi tr m bin chy s nhn v
thc hin dch chuyn sau mi ln lp. C th dch chuyn i 1 n v, c
th dch chuyn i nhiu n v mt ln, c th dch chuyn tin, cng c
th dch chuyn li- tt c iu ny tu thuc vo vic c hay khng c
tu chn [Step <n>];
- Nu c tu chn [Step <n>] bin chy s dch n n v sau mi
ln lp. Khi , nu n>0 d dch tin, ngc li s dch li;
- Mi ln lp, VBA s thc hin <th tc> mt ln;
- Trong trng hp c bit nu gp phi lnh Exit For trong vng
lp, ngay lp tc thot khi lnh lp v thc hin lnh tip ngay sau t
kho Next. Chnh Exit For lm mt i tnh lp bit trc c s ln
lp.
b, Cu trc WHILE WEND
While Wend l mt cu trc lp khng bit trc s ln lp trong
VBA.
C php:
While <iu kin>
<th tc>
Wend
Trong :
- While, Wend l cc t kho ca lnh lp;

51

Chng 5: Lp trnh VBA cn bn

- Nu <iu kin> = True, cc lnh trong <th tc> s c thc


hin. Thc hin xong li quay ln dng lnh While kim tra tip <iu
kin>;
- Nu <iu kin> = False, s thot khi vng lp v thc hin
lnh tip theo t kho Wend.
Ch : Lun phi chng minh c rng, sau mt s hu hn ln thc hin <th
tc>, gi tr ca <biu thc> phi l False thot khi vng lp. Trong trng
hp khng th thot khi vng lp, c ngha ngi lp trnh mc phi li lp
v hn. C th dn n chng trnh b treo.
4. Lnh DoCmd
Chng ta c th dng lnh DoCmd thi hnh cc cng vic thng
thng trn Access thng qua mi trng VBA. Nh: dng DoCmd c th
m form, m report, query, lc d liu, thi hnh macro x l bn ghi, ng
dng,.. Hu ht cc thao tc x l trn cc i tung ca Access u c th dng
lnh doCmd gi ra thc hin trong mi trng VBA.
Di y lit k mt s cc php x l ca lnh DoCmd thng dng:
4.1 Lnh ng mt i tng
Lnh ny ng (Close) hoc gii phng i tng no ra khi b
nh. Hay dng lnh ny ng form ang hot ng hoc ng mt report
ang preview.
C php nh sau:
DoCmd.Close [ObjectType], [ObjectName], [SaveOption]
Trong :
ObjectType: ch kiu i tng cn ng. C th nh sau:
- acForrm: ng form
- acReport: ng report
- acQuery: ng query
- acTable: ng bng
ObjectName: ch tn i tng cn ng;
SaveOption: ch nh tu chn ghi li cu trc (nu c s thay i). C
th:
- SaveNo Khng khi li
- SaveYes Lun ghi li
- SavePromt Hin th hp thoi nhc ghi nu c s thay i

52

Chng 5: Lp trnh VBA cn bn

4.2 Lnh m form


L mt lnh hon chnh m v thit lp mi trng lm vic cho mt
form.
C php nh sau:
DoCmd.OpenForm
[objectName],
[ViewMode],
[FilterName],
[WhereCondition], [DataMode], [WindowsMode]
Trong :
ObjectName: tn form mun m
ViewMode: ch m. C th
- acDesign M form ra ch thit k
- acNormal M form ra thi hnh
FilterName: t lc
WhereCondition: Gii hn cc bn ghi trong ngun d liu
DataMode: thit lp ch d liu trn form, c th:
WindowsMode: thit lp kiu ca s form l:
- acDialog: Kiu hp thoi
- acWindowsNormal: Kiu ca s bnh thng
4.3 Lnh m report
L mt lnh hon chnh m v thit lp mi trng lm vic cho mt
report.
C php nh sau:
DoCmd.OpenReport
[objectName],
[ViewMode],
[FilterName],
[WhereCondition], [DataMode], [WindowsMode]
Trong :
ObjectName: tn Report mun m;
ViewMode: ch m. C th:
- acDesign: M Report ra ch thit k
- acNormal: M Report ra thi hnh
FilterName: t lc
WhereCondition: Gii hn cc bn ghi trong ngun d liu
DataMode: thit lp ch d liu trn Report , c th:
WindowsMode: thit lp kiu ca s Report l:
- acDialog: Kiu hp thoi
- acWindowsNormal: Kiu ca s bnh thng

53

Chng 5: Lp trnh VBA cn bn

4.4 Lnh thi hnh cu lnh SQL


Dng thi hnh mt lnh SQL. C php nh sau:
DoCmd.RunSQL
5. Chng trnh con
Chng trnh con l mt n v m lnh VBA, n c th cha tp hp cc
cu lnh nhm thao tc, tnh ton hoc iu khin mc ch hoc d liu no .
Trong VBA c 2 loi chng trnh con:
- Chng trnh con dng th tc, c khai bo bi t kho Sub.
- Chng trnh con dng hm, c khai bo bi t kho Function.
V bn cht, 2 loi chng trnh con trn u nh nhau: khai bo, tham s
v truyn tham s. Tuy nhin, im khc nhau c bn l:
- Function lun tr v mt gi tr kiu v hng chun, v d: hm Date()
tr v gi tr ngy hin ti kiu Date. Trong Access sn c rt nhiu cc hm
tnh ton, chng c gi l cc build-in fuction. Hn na, ngi dng hon
ton c th to ra cc hm s dng cho cc mc ch ring loi hm ny gi
l user-define function;
- Sub ch thc hin mt s cc cng vic. Tt nhin nhng cng vic ny
hon ton c th lm thay i d liu theo mong mun trong chng trnh. Cng
nh Function, Access v VBA sn c mt th vin cc th tc; hn na ngi
dng cng c th t to thm nhng th tc mi phc v vic x l d liu theo
mc ch ring. c bit, Access cn nh ngha th tc p ng s kin. Th
tc ny s c t ng gi ra khi s kin p ng b nh hng. Chng ta s
tr li ni dung ny qua cc v d lp trnh VBA.
Tu tng tnh hung c th s la chn s dng Function hoc Sub.
5.1 Chng trnh con dng hm
C php
Function <tn hm>([<danh sch cc tham s>]) As <kiu DL
hm>
<th tc>
End Function
Trong :
- Function, End Function l cc t kho bt buc khai bo cu trc mt
chng trnh con dng hm;
- <tn hm> l tn gi hm nh khai bo. Tn khng c cha du cch
(space) v cc k t c bit;

54

Chng 5: Lp trnh VBA cn bn

- <danh sch cc tham s> danh sch cc tham s cn thit cho hm. C
hay khng c danh sch ny tu thuc vo hm cn nh ngha;
- <kiu DL hm> kiu d liu m hm s tr li. Phn ny bt buc phi
c khai bo vi mi hm;
- <th tc> thn chng trnh con. Trong cu lnh <tn hm> = <biu
thc> phi xut hin t nht mt ln trong th tc. Cu lnh ny c tc dng gn
gi tr cho hm.
Ch :
- Nu khng c t kho Public trc Function, hm ch c tc dng
cc b: trong mt module, trong mt report hoc trong mt form.
- Khi c t kho Public trc Function, hm s c tc dng ton cc. Tc
l c th s dng bt k ni no trn tp Access . Tt nhin, tt c nhng g
khai bo l Public phi c khai bo trong phn Decralations ca mt Module
no .
V d:
* Thit k hm tng tnh tng hai s:
Function Tong(a, b As Double) As Double
Tong = a + b
End Function

* Thit k hm kim tra tnh nguyn t ca mt s:


Function laNguyenTo(so As Integer) As Boolean
Dim uoc As Integer
laNguyenTo = True
If so > 2 Then
For uoc = 2 To Int(Sqr(so))
If so Mod uoc = 0 Then
laNguyenTo = False
Exit For
End If
Next
End If
End Function

5.2 Chng trnh con dng th tc


C php
[Public] [Private] Sub <tn CTC>([<danh sch cc tham s>])
<th tc>
End Sub
Trong :
- Sub, End Sub l cc t kho bt buc khai bo cu trc mt chng
trnh con dng th tc;

55

Chng 5: Lp trnh VBA cn bn

- <tn CTC> l tn gi th tc nh khai bo. Tn khng c cha du


cch (space) v cc k t c bit;
- <danh sch cc tham s> danh sch cc tham s cn thit cho th tc.
C hay khng c danh sch ny tu thuc vo th tc cn to
- <th tc> thn chng trnh con.
Nu khng c t kho Public trc Sub, th tc ch c tc dng cc
b: trong mt module, trong mt report hoc trong mt form. Khi c t kho
Public trc Sub, th tc s c tc dng ton cc. Tc l c th s dng bt k
ni no trn tp Access . Tt nhin, tt c nhng g khai bo l Public phi
c khai bo trong phn Decralations ca mt Module no .
V d:
* Xy dng th tc thc hin tnh tng hai s:
Sub tong2so(a, b As Double)
tong = a + b
tong l bin c khai bo
ton cc
End Sub

6. K thut x l li
X l li l k thut rt quan trng trong lp trnh. lp trnh th kh
trnh khi li (Errors). C rt nhiu nguyn nhn gy ra li; cc nguyn nhn
ny c th c lng trc hoc khng c lng trc. K thut x l li
bao gm cc k nng pht hin v x l cc tnh hung khi chng trnh gy li.
6.1 X l li
L vic x l khi ang lp trnh gp phi li. Thng thng khi chy th
chng trnh trong lc ang xy dng phn mm nu gp phi li, s xut hin
hp thoi thng bo li c dng:

Thng thng mt hp thoi thng bo li gm 2 thnh phn:


- Thnh phn bo li bao gm:

56

Chng 5: Lp trnh VBA cn bn

+ M s li - Mi li m VBA c th kim tra c u c mt m


s, c hin th dng thng bo: Run-time error 'm s li': V d trn
l : Run-time error '11':
+ Tn li. v d trn tn li l: Division by zero - li sai kiu d
liu.
- Thnh phn x l li gm 2 nt lnh:
+ Nt End dng ngay chng trnh, chuyn v ch Design thit k bnh thng;
+ Nt Debug dng chng trnh chuyn v ch Break - sa
li trc tip. Khi cu lnh li s c t bi mu nn vng cho php
ngi lp trnh c th sa c m chng trnh.
Ch : Ca s Immediate l cng c hu hiu h tr vic d li bi: hp thoi
ny cho php thc thi tng cu lnh trn ch hi thoi.
6.2 By li
a, S dng lnh On Error Resume Next
Sau khi s dng by On Error Resume Next, t ch tr i, nu chng
trnh gp li, n s b qua (ignore) hon ton. im ny tin ch gip chng
trnh EXE ca ta trnh gp li thot khi t ngt nh phn tch trn. Nhng
n cng bt li l khi khch hng cho hay h gp nhng trng hp l, khng
gii thch c (v li b b qua m khng ai ), th ta cng b lun, c th
khng bit bt u t u g li.
Do , trong lc g li ta khng nn dng n, nhng trc khi giao cho
khch hng bn nn cn nhc k c nn s dng trong cc on m lnh hay
khng.
V d: S dng On Error Resume Next b qua li:
Function A_chia_B(a, b As Double) As Double
On Error Resume Next
A_chia_B = Null
A_chia_B = a / b
End Function
Trong chng trnh con trn, nu b = 0, lnh A_chia_B = a / b s gp
phi li. Do c li khai bo On Error Resume Next nn lnh li ny c b qua
(khng thc hin). Tc l gi tr hm l Null.
b, S dng cu lnh On Error Goto <nhn>
Khi mt th tc c t cu lnh ny, nu gp phi mt li no , VBA
s chuyn thng vic thc hin n <nhn> ch nh. Thng thng cc lnh
tip theo ca <nhn> l x l cc tnh hung li.
57

Chng 5: Lp trnh VBA cn bn

V d: S dng phng php On Error Goto <nhn> by li:


Function A_chia_B(a, b As Double) As Double
On Error GoTo Loi
A_chia_B = a / b
Msgbox Ok!
Loi:
If Err.Number = 11 Then
MsgBox "Li chia cho 0 !"
End If
End Function

Trong chng trnh con trn, trong trng hp b = 0 cu lnh A_chia_B =


a / b s gy ra li. Theo nh khai bo On Error Goto Loi ban u, VBA s b
qua tt c cc lnh sau lnh li v chuyn thng ti cc lnh sau nhn Loi:
y l lnh kim tra li. Nu M li = 11 kt lun ngay mt thng bo li ting
Vit. Li chia cho 0 !
Phng php ny cng c dng ph bin c trong qu trnh xy dng
pht hin li, cng nh trong phn mm ng gi gi n khch hng.
Mi khi gp li s c thng bo nguyn nhn gy ra li bng ting Vit
(chng hn) m vn khng nh hng n hot ng khc ca phn mm.
Trong phng php ny, ngi lp trnh nn khai thc ti a i tng
Err - i tng mang nhng thng tin v li ang xy ra, c th:
Hnh ng

Kt qu

Err.Description M t tn li
Err.Number

a ra m li

58

You might also like