You are on page 1of 10

Bi 2: Nhng macro phc tp hn 1.

Tng ng lot tin thng cho mt danh sch Gn cui thng sp yu cu bn lp danh sch tin thng ca ton c quan, km theo lnh: "Tng 15% so vi thng trc; Nu thng no sp cng ch o tng hay gim tin thng so vi thng trc, th y l ming t mu m macro hot ng; Vn l bn c danh sch CNV trong ton c quan. Trong , ct F, k t F3 l d liu tin thng thng trc. Bn nn thu mt macro s dng cho cc thng sau vi nhng hnh ng nh sau: * V menu Tool -> Macro -> Record New Macro. . . . Ti ca s (CS) Record Macro ta nhp Thuong (l tn macro), xong OK * Qut chn t G3 n G99 ( cha ngi cui cng trong danh sch c quan) * Bm chut ln thanh cng thc v nhp du bng ( '='), dng tr chut n v F3, sau nhp tip du nhn '*' v gi tr 1,15 (nh ca sp). Kt thc vic nhp liu bng hai phm CTRL+ENTER * Vn nhng c chn, ta v menu Edit -> Copy; Sau thc hin Paste Special; Trong CS Paste Special ta nh du kim ti dng Value * Cng on cui cng l ct ton b d liu ct G ny dn ln ct F Ta thu c macro c ni dung sau ( thu gn cc dng lnh ngn): Code: Sub Thuong() Range("G3:G95").Select Selection.FormulaR1C1 = "=RC[-1]*1.15" Selection.Copy Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False

Application.CutCopyMode = False: Selection.Cut Range"F").Select: ActiveSheet.Paste End Sub 2. Thc hin vic thm v macro: Macro Thuong cn nhng bt tin: - Nu c quan tng ngi th phi sa li dng lnh u; - Lng tng gim tin thng l theo ch quan ca sp (doanh nghip t nhn) Vn u hi d gii quyt, ta c vic n nh tha ln; thay v G95 ta nhp G450, Vic ny cng cha phi ti u, nhng ti thi im ny nn chp nhn gii php. i khi no sau ny trnh ta kh ln, s gii mt cch cn c hn! gii quyt vn cn li, ta thc hin tng bc nh sau: Ti dng lnh u tin ta nhp tip du hai chm (':'), sau n mt ln phm {TAB} v thm chui: dim StrC as string; kt thc, nhn ENTER. Nu excel sa li cho ta, tr thnh nh sau l ng: Range("G3:G450").Select: Dim StrC As String Ti dng trng ta va to ra, ta nhp cu lnh: ctrc = inputbox("HAY NHAP HE SO: ") Sau khi ENTER, nhp tip dng sau: strc = "=RC[-1]*" & strc Cui cng ta sa li dng lnh k tip tr thnh: Selection.FormulaR1C1 = strc Khi macro c ni dung nh sau:

Code: Sub Thuong() Range("G3:G15").Select: Dim StrC As String StrC = InputBox("HAY NHAP HE SO: ") StrC = "=RC[-1]*" & StrC Selection.FormulaR1C1 = StrC Selection.Copy Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Application.CutCopyMode = False Selection.Cut Range("F3").Select ActiveSheet.Paste End Sub Ch : * Cu lnh u tin m ta thm v macro l cu lnh khai bo vi VBA rng ti s s dng bin c tn l StrC, kiu chui. Cu lnh th na s l: Hy ly gi tr cho bin StrC l gi tr ti nhp v; cu tip dch nm na l: hy ni bin chui ti va nhp v sau chui ti ghi; V cui cng (cu lnh ta sa): hy gn gi tr bin m ti khai bo & thit lp, tr thnh cng thc ca hin hnh; * Khi khai bo mt tn bin, ta nn vit c ch hoa & ch thng, nh vy ta tn dng c li th sn c ca chng trnh kim li chnh t ca VBA; trng hp ny l StrC; Tuy l khai bo nh vy, nhng khi nhp tn bin ta c nhp khng theo nh vy, v nh VBA s sa cho ta, l mt dp kim tra pht hin li chnh t do nhp sai tn bin. Tn bin cng khng c cha cc k t ton hc & khng c di qu 64 k t * V kiu ca bin th c rt nhiu; n y ta ch cn bit nhng kiu hay thng dng: Kiu Byte l kiu s nguyn, min gi tr t 0 n 255 Kiu Boolean: l kiu logic, loi ny ch nhn mt trong hai gi tr: True & False Kiu Integer: S nguyn, min gi tr t -32768 n 32767

Kiu Long: Cng l s nguyn c min ln hn: -2.147.483.648 n 2.147.483.647 Kiu Currency: tin t; Kiu Double: kiu s thc, c cha trong 8 byte nh Kiu String: kiu chui k t, min lu gi c th ti a l 65.400 k t * Lnh gn, trong ngn ng VBA dng du = lm lnh gn; V d sau khi khai bo bin StrC nh trn, ta c th dng lnh gn: StrC = "=RC[-1]*"; y hai du nhy kp ch bao mt chui cn gn v bin. * Trong macro c hm InputBox( ". . ."). Hm ny lm xut hin hp thoi, nhn gi tr chui m ta nhp v n. Trong trng hp ny n s gn v bin StrC gi tr m ta nhp v; * Trong cu lnh di, chim 2 dng , ta c th v hiu ho on cui, k t du ',' th hai bng cch thm du nhy trc n; Khi dng hai ca cu lnh s b t , bo cho ta bit s bt n trong n; S vic l do ta v hiu ho lun c du ni 2 dng lnh. khc phc, ta nhp thm du nhy n v u dng b t l c; Cui cng, trc khi chy tc phm, ta nn v menu Debug v chn dng Compile VBAProject, cn lm chi bn bit ri. Trc khi chy macro mi ta thc hin vic gn phm tt CTRL+SHIFT+T cho n; C th c bn hi, nhng iu ny l bt buc?, khng, hon ton t nguyn, nhng nn nh vy. Cng ging nh ta khng nn i b bng mt chn trn va h & mt chn di lng ng. 3./ Tnh ton cc gi tr trong mt ct Ta xt trng hp mt n v hnh chnh s nghip cn lp danh sch thng nh k; thng theo h s n v v h s thnh tch c nhn, ngi ta lp bng d liu gm cc trng: [Ma], [Ho], [Ten], [MDV], [XL], [TThuong] (6 ct bt u t A ). Nhim v ca macro l tnh s tin thng ca mi c nhn tng ng vi h s c nhn v h s n v (ti ct 'F') vi s tr gip ca bng c t tn l HeSo. Bng HeSo ny gm 3 ct & 5 dng. Ct th hai

ghi h s thng ca cc n v; Ct th ba ghi s tin thng c nhn tng ng vi danh hiu thi ua t c bt u thu macro ta cng v menu Tool -> Macro -> Record New Macro & t tn macro l Tinh_Thuong. Trn trang tnh ta chn F6, ni cn xut hin tin thng ca ngi u tin trong danh sch. Tip theo v menu Insert -> Function. . .. Trong CS Insert Function va xut hin, ta nhp tn hm l VLOOKUP v nhn nt Go v chn trong CS Select a function hm VLOOKUP(). Khi bng tr gip hm ny xut hin, ta thy du nhc ang Lookup_Value, ta nhp chut v D6 ( cha m n v ca ngi u tin); Trong Table_array ta nhp HeSo; cui cng trong Col_Index_Num ta nhp s 2; Xong ta ENTER v trang tnh; Ta tr chut li ln thanh cng thc; nhp du nhn '*' v li v menu Insert lp li cc bc trn. Duy ch khc l thay v s 2 ta nhp s 3 v Col_Index_Num; Tr v trang tnh, ta chn li F6 ny v dng chc nng AutoFill chp cng thc xung cc dng di; (VD: ti dng cui l 21) Sau ta chn vng F6:F22 v bm ln nt AutoSum trn thanh cng c; Excel bo cho ta l s tnh tng ca ct & nhp v 23. Ta tn thnh vic lm ny v kt thc macro nh cch bit. Macro thu c ca bn c trng khp nh vy? (Thc t ta c th v hiu ho hay b dng th hai i!) Code: Sub Tinh_Thuong() Range("F6").Select ActiveCell.FormulaR1C1 = "=VLOOKUP(RC[-2],HeSo,2)" ActiveCell.FormulaR1C1 = "=VLOOKUP(RC[2],HeSo,2)*VLOOKUP(RC[-1],HeSo,3)" Selection.AutoFill Destination:=Range("F6:F21"), Type:=xlFillDefault

Range("F6:F21").Select Range("F23").Select ActiveCell.FormulaR1C1 = "=SUM(R[-17]C:R[-1]C)" Range("F24").Select End Sub Hy c c hiu ni dung ca n; Trong c dng hai hm SUM() & VLOOKUP(). Kinh nghim cho thy, ta c t phi sang tri th d hiu cu lnh hn. V d hai cu lnh gn cui c hiu nh sau: Chn 'F23' Ly tng cc t th 17 hng trc hin hnh, cho ti trc hin hnh 1 gn cho hin hnh. 4./ Chuyn ng tuyt i & tng i Ta xem xt n cu lnh Range("F23").Select & cu lnh Range("F24").Select Trong thc t ta khng dng chut n v nt ny, m nhp cng thc tnh tng trong F23 xong ta thc hin ENTER. Kt qu ca n l n F24 nh my ghi! Trong dng lnh th hai, hm VLOOKUP() c i s th nht c ghi l RC[-2]; ch C ch s ct, ch R ch s hng; ngha thc t l i s th nht ca hm ang ti cng hng & pha bn tri cch 2 ct Trong cu lnh ly tng, chng ta ni trn; nhng y VBA li ghi theo dng thc tng t nh "B2:D9": gc trn tri nht & gc di phi nht ca vng chn. r hn ta xt n mt macro ghi li cc chuyn ng bng bn phm nh sau: Vn ly v d tnh tin thng nu trn, m trong CSDL (c s d liu) gm c 23 dng tt c (ti ct 'F'). Ta thu mt macro (tn l DiChuyen) vi nhng hnh ng nh sau:

Chn B2; n ng thi 2 phm CTRL & phm mi tn xung (im sng s ti B5, l u tin trong ct c gi tr (ang cha K t 'Ho' c t m) Lp li ln na, c kch hot s l B21 (l dng cui khng k dng cha cng thc tng). Nu tip tc ta n c dng cui ca trang tnh! By ch th phi ngc ln thi: n CTRL+ phm mi tn ln: kch hot s li l B21; lp li hnh ng ny mt ln na s l B5 Cui cng s l B1 nu ta mun! Code: Sub DiChuyen() Range("B2").Select Selection.End(xlDown).Select Selection.End(xlDown).Select Selection.End(xlDown).Select Selection.End(xlUp).Select Selection.End(xlUp).Select Selection.End(xlUp).Select End Sub C khi macro chy nhanh qu, khng lm bn tin!?! Mun ghi nhn li v tr c kch hot khi thc hin 1 ln ta lm theo cch sau: u dng lnh th nht ta nhp cu lnh sau dim lJ as long: v nhn hai ln phm {TAB} (ch c c du hai chm ':')

im chn cui dng lnh th hai & n ENTER, nh vy s thm 1 dng trng. ta nhp ln n hai cu lnh cch nhau bng du hai chm, nh sau: lj = selection.row: msgbox str(Lj) (ch : gia ch selection & ch row c du chm) Ta chu kh lp li chuyn ny tt c cc dng lnh trc cm t End Sub Thc hin bin dch Sub nh nu & cho chy li macro Trc khi kt thc macro s a ra su hp thoi bo cho ta bit kch hot ang l hng th my trong trang tnh. Ch : Ti sao ta phi khai bo bin lj c kiu l Long, m khng l Integer hay Double? Nu khai bo ch l Integer th bin khng nng lc n c dng 65536, m b bt li! Nhng ngc li, nu khai bo kiu d liu Double th qu d tha & lng f ti nguyn. Hn na khng v th m macro chy nhanh hn! Hm MsgBox() tng t nh hm InputBox() nu trn, ch c iu chiu tc ng th ngc li, hm sau nhn thng tin t ngi dng, cn hm mi ny thng bo cho ngi dng ci g m ngi dng ang thiu thng tin! Hm Str(Num), hay hm CStr(Num) s bin i kiu d liu dng s ( Byte, Integer, Long. . .) thnh chui k s. Cn nh rng CStr(Num) & Str(Num) c khc nhau nhiu trng hp! V d C php Range( "A" & CStr(9) ).Select th VBA hiu; Cn Range("A" & Str(9)).Select th khng! Tuy rng khi bin dch VBA khng pht hin ra li ny! 5./ Ni cc macro

Ta c th chp ht cc dng lnh ca macro sau cng (ch tr cu Sub DiChuyen & dng End Sub) v trc dng End Sub ca macro nu u tin trong bi. iu ny lm c do hai macro lm cc cng vic hon ton khc nhau, cng vic ny xong khng cn lin quan n cng vic sau. Mt cch khc na l ta nhp tn macro sau v trn dng lnh va nu ca macro trc: Code: Sub Thuong() . . . . . . . . . DiChuyen End Sub Hay Code: Sub Tinh_Thuong() . . . . .. . . . DiChuyen End Sub tt nhin trong mi trng hp, hp thoi ta ghi thm s a ra thng tin c th khc nhau! Bi tp ca bi hai : 1./ To macro xo dng (hay ct) cha mu tin 2./ To macro cho n hay hin ct (hay dng) cha d liu 3./ Hy to bng tnh c cc ct [G] & [SL], hy to macro tnh ct [TTien] 4./ Hy to macro xp hc lc cho HS theo im trung bnh mn hc.

You might also like