vb6 voi excel

Upload: heoxam4215

Post on 07-Jul-2015

283 views

Category:

Documents


15 download

TRANSCRIPT

1

Chng 24: Lin kt gia Excel vi Visual Basic 6.0Chng ny c trch t cun Lp trnh VBA trong Excel (Nh xut bn thng k)http://www.giaiphapexcel.com/forum/showthread.php?t=22105

Trc khi tm hiu mi quan h ny, bn bit rng Visual Basic 6.0 (VB 6.0) c xy dng bi tp on Microsoft. Hin ny VB 6.0 c thay th bi VB.NET, tuy nhin VB 6.0 vn l phn mm c nhiu nh lp trnh s dng rng ri nht trn th gii. VB 6.0 mnh m hn ngi anh em VBA v VB 6.0 l ngn ng lp trnh hot ng mang tnh c lp. Nhn chung ni dung, cu trc, m lnh trong th tc ca VB 6.0 v VBA rt ging nhau. V vy, nhng ngi am hiu v VBA th c th nhanh chng tip cn v s dng VB 6.0. Chng ny s ch dn bc u to mi lin kt gia Excel vi VB 6.0 v nhng l do ti sao s dng VB 6.0 cho cc d n VBA ca bn. VB 6.0 c th to ra hn 6 kiu ng dng, nhng ch c hai kiu lin kt c vi Excel l ActiveX DLL v Standard EXE. Mc ny s hng dn bn cch s dng ActiveX DLL v Standard EXE trong VB 6.0 cho Excel vi ng dng n gin Hello World. Chng ta s khm ph s lin kt gia Excel v Standard EXE trong mc tip theo. Nh vy bn s thc mc ti sao cn phi s dng VB 6.0 trong khi VBA sn c trong Excel. Di y l nhng nt chnh bn quyt nh c nn s dng VB 6.0 lin kt vi Excel hay khng?! - Kh nng bo mt code: VBA c chc nng bo mt code chng ngi khc c th xem d n VBA ca bn (xem mc 11.2). iu l cn thit khi bn b cng sc xy dng sn phm ca mnh. Tuy nhin hin nay c rt nhiu chng trnh c th d tm v ph c kha. Chng trnh ca bn lc rt d b phn tn mi ngi s dng ngoi tm kim sot. Nguyn nhn l do VBA khng bin dch hay m ho c code, iu khng th ngn chn c ngi khc truy cp vo. VB 6.0 kh nng bin dch thnh th vin lin kt ng (Dynamic Link Library - vit tt l DLL), chng trnh to ra t VB 6.0 hot ng c lp (Standard EXE), do kh nng bo mt s cao hn. - S dng VB 6.0 Form nng cao: iu khin xy dng trong Form ca VB 6.0 phong ph hn so vi VBA. i tng Form c to trong ng dng Excel c gi l MSForm, cn trong VB 6.0 th c hiu l Ruby Form. S ging nhau v bn ngoi gia chng l giao din chng trnh, Form bn c th xy dng, iu khin cc i tng trong Form. Ngoi ra cc iu khin trong c hai kiu u s dng lp trnh s kin xy ra vi chng

Tc gi: Phan T Hng ([email protected])- B mn a k thut Trng H Kin trc HN

2

Chng 24: Lin kt gia Excel vi Visual Basic 6.0thi hnh th tc. ng nhin gia chng c s khc nhau, v d nh thuc tnh, phng thc, s kin v k c cc iu khin ca VB 6.0 phong ph hn,... - H tr iu khin ActiveX tt hn: Khng ch mi VB 6.0 Form cung cp kh nng h tr tt hn so vi UserForm ca Excel. VB 6.0 cn cung cp hng trm iu khin ActiveX nhm 3 m khng c y UserForm ca Excel. Ngoi ra kh nng iu khin mng d liu lin lin kt c tng cng hn so vi VBA. ng dng Active DLL Hello World di y s gii thch mt cch to lin kt t Excel ti DLL. Excel s lin kt vi DLL v DLL s lin kt tr li vi Excel. Tip theo chng ta s nghin cu cch s dng Form ca VB 6.0 nh l UserForm sn c trong Excel.

24.1. To d n ActiveX DLLKhi m chng trnh VB 6.0 th ca s New Project hin ra nh hnh 24-1. Trong trng hp ca s New Project khng hin ra, bn vo menu File/New Project. Ti ca s New Project chn kiu d n ActiveX DLL. Sau khi bn la chn kiu d n v bm vo nt Open, VB 6.0 s to ra mt d n mi ActiveX DLL.

Tc gi: Phan T Hng ([email protected])- B mn a k thut Trng H Kin trc HN

3

Chng 24: Lin kt gia Excel vi Visual Basic 6.0Hnh 24-1: Ca s New Project ca VB 6.0

Chng ta s xy dng ng dng Hello World u tin, ActiveX DLL s ch cha hai phn Project (d n) v Class Module (hnh 24-2). D n s xc nh tn ca ng dng trong DLL, v Class Module s th hin cc tnh nng ca DLL trong cc chng trnh khc. Hnh 24-2 th hin cu trc ca mt d n mi ActiveX DLL trong ca s Project. Nu thy ca s Project xut hin trng rt quen thuc, iu khng c nh hng g c. Bn s tm thy mi trng gia VB 6.0 v VBA ging nhau n mc d gy nn s xo trn khi lm vic vi chng. iu s gip bn d dng lm vic vi VB 6.0 khi bn c kinh nghim v VBA. Chng ta s dng ca s Project trong VB 6.0 gn nh tng t vi VBA.

Hnh 24-2: D n lc u

Hnh 24-3: D n t tn

Hnh 24-4: Lu Class Module HelloWorld di dng file Class Files (*.cls)

Hy thay i tn ca Project thnh AFirstProject, tn ca Class1 thnh HelloWorld bng cch g vo trong hp Name ca ca s Properties ca chng nh hnh 24-6. Kt qu thayTc gi: Phan T Hng ([email protected])- B mn a k thut Trng H Kin trc HN

4

Chng 24: Lin kt gia Excel vi Visual Basic 6.0i th hin ti hnh 24-3. Bn s thy tn file trong ngoc n nm pha bn ngoi l thnh phn trong d n, l mt s khc nhau gia VBA v VB 6.0. Trong VBA, cc thnh phn ca d n c lu bn trong file ring ca Excel. Trong VB 6.0, tt c cc thnh phn c lu gi trong cc file ring bit ca d n. Sau bn lu gi tn d n li vi hai phn Project (d n) v Class Module (hnh 24-6) vi tn mc nh t. Bn s thy khi d n c lu th tn d n vi ui xc nh s hin th trong ca s Project (hnh 24-5).

Hnh 24-5: Lu d n AFirstProject di dng file Project Files (*.vbp)

24.1.1. Cch to lin kt n gin ActiveX DLL mt hngBy gi chng ta s tm hiu cu trc ca d n ActiveX DLL hon chnh, hy b sung th tc thc hin cng vic no . Trong d n Hello World, DLL s cho hin hp thng bo vi ni dung Hello World! khi thc hin lnh. Vic s c hon thnh khi bn thm phng thc ti Class Module HelloWorld, chnh l th tc s hin th hp thng bo khi c gi. Vic thm phng thc ti VB 6.0 Class Module s lm vic tng t nh trong VBA. Bn bm p chut vo Class Module HelloWorld trong ca s Project, ca s son code hin ra. Th tc ShowMessage nh sau (hnh 24-6):Public Sub ShowMessage() MsgBox "Hello World!", vbInformation End Sub

Tc gi: Phan T Hng ([email protected])- B mn a k thut Trng H Kin trc HN

5

Chng 24: Lin kt gia Excel vi Visual Basic 6.0Cng vic tht n gin! By gi chng ta cn phi bin dch ActiveX DLL ca bn v gi ra c t ng dng Excel hin th li cho . Nhng trc ht hy bin dch code . u tin vo menu File trong ca s VB 6.0, chn Make AFirstProject.dll... (hnh 24-7). Ca s Make Project hin ra nh hnh 24-8, chn nt OK to AFirstProject.dll trong th mc cha d n ca bn.

Hnh 24-6: To th tc ShowMeesage trong Class Modules HelloWorld

Tip theo bn s lm g trong Excel? Cng vic rt d dng khin bn phi ngc nhin. Bc u tin khi ng Excel, sau bn m ca s VBE. Vo menu Tools/References..., ca s References - VBAProject hin ra nh hnh 24-9. Tm d n AFirstProject.dll trong danh sch Available References v chn. Nu d n khng xut hin trong danh sch th bn bm no nt Browse... tm kim ni lu tr, sau bm OK xc nhn.

Tc gi: Phan T Hng ([email protected])- B mn a k thut Trng H Kin trc HN

6

Chng 24: Lin kt gia Excel vi Visual Basic 6.0

Hnh 24-7: To DLL cho d n AFirstProject

Tc gi: Phan T Hng ([email protected])- B mn a k thut Trng H Kin trc HN

7

Chng 24: Lin kt gia Excel vi Visual Basic 6.0Hnh 24-8: t tn cho d n DLL ca bn

Hnh 24-9: Xc nhn d n AFirstProject trong file

Hnh 24-10: D n ca bn c to trong th mc VB6.0 vi y cc thnh phn

Sau lu workbook vi tn Hello.xls trong th mc cha d n , vic lu trong cng th mc gip bn d dng tm kim v s dng ch khng phi bt buc. Trong thc t, DLL c th s dng mi ni trong my tnh. Cng vic tip theo l thm module vo trong ca s VBE v xy dng th tc ShowDLLMessage nh sau:Public Sub ShowDLLMessage() Tc gi: Phan T Hng ([email protected])- B mn a k thut Trng H Kin trc HN

8

Chng 24: Lin kt gia Excel vi Visual Basic 6.0'Khai bo bin i tng Dim HelloWorld As AFirstProject.HelloWorld Set HelloWorld = New AFirstProject.HelloWorld 'Thc hin th tc ShowMessage trong class HelloWorld HelloWorld.ShowMessage Set HelloWorld = Nothing End Sub

Ban u, bn s thy cng vic kh khn khi s dng cc th tc xy dng trong DLL. Tuy nhin khi hiu r phng thc s dng DLL bng VBA, bn s d dng thc hin c. Trong v d trn, cc i tng trong DLL c nhn bit trong Excel nh sau: Bng 24-1: M t i tng v chc nng ca n trong DLL i tng AfirstProject M t L th vin qun l cc i tng trong d n AFirstProject, d n ny qun l cc Classe Module. VBA t ng nhn bit bng chc nng Auto List Members (hnh 24-11, 24-12) L Classe Module cha trong d n AFirstProject (hnh ). Mt d n s c mt hay nhiu Classe Module. VBA t ng nhn bit bng chc nng Auto List Members (hnh 24-13). L th tc cha trong Classe Module HelloWorld. Mi Classe Module c th cha mt hay nhiu th tc.VBA t ng nhn bit bng chc nng Auto List Members (hnh 24-14).

HelloWorld

ShowMessage

Tc gi: Phan T Hng ([email protected])- B mn a k thut Trng H Kin trc HN

9

Chng 24: Lin kt gia Excel vi Visual Basic 6.0Hnh 24- 11: Th vin AFirstProject v cc i tng cha bn trong

Hnh 24-12: VBA t nhn bit th vin AFirstProject bng chc nng Auto List Memmbers

Hnh 24-13: VBA t nhn bit Classe HelloWorld bng chc nng Auto List Memmbers

Hnh 24-14: VBA t nhn bit th tc ShowMessage trong Classe HelloWorld

Khi thc thi th tc ShowDLLMessage, kt qu th hin nh ti hnh 24-15. Bn s thy kt qu to hp nhn tin ny tng t khi s dng VBA.

Tc gi: Phan T Hng ([email protected])- B mn a k thut Trng H Kin trc HN

10

Chng 24: Lin kt gia Excel vi Visual Basic 6.0

Hnh 24-15: Thng bo c th hin khi bn chy th tc ShowDLLMessage

V mt iu ng quan tm na l tiu (title) trong hp nhn tin. Nu khng cung cp tn tiu , hp nhn tin s th hin tn tiu mc nh, l tn ca d n ang s dng (AFirstProject). V d nu bn mun hp nhn tin hin th Control Excel thanh tiu th bn b sung ni dung Control Excel nh di y:MsgBox "Hello World!", vbInformation, "Control Excel"

24.1.2. Cch to lin kt hon thin ActiveX DLL hai hngD n u tin cho thy cch to ActiveX DLL kh n gin. Kt qu Excel c th thc lin kt vi VB6 qua DLL. Nhng vic trao i trn b gii hn bi v tt c cc lin kt ch l mt hng, Excel gi DLL. nng cao kh nng lin kt gia Excel vi VB 6.0, phi to ra cu trc m cho php lin kt c truyn theo c hai hng. Trong d n Hello World trn, chng ta m rng ng dng c th lin kt theo c hai hng, trong DLL l i tng chnh cc thnh phn tham chiu ti. DLL khng th to ra cc hnh ng trong n m ch p ng nhng yu cu t cc ng dng khc s dng n lm vic. Sau yu cu s c thc hin bi v DLL c th lin kt trc tip vi ng dng gi n ra. Vic u tin chng ta s lm cho c th lin kt hai hng gia Excel v DLL bng cch cung cp DLL vi hng nhn bit c chng trnh no gi. Bc u tin ci t i tng tham chiu Excel trong VB 6.0, gn nh ging ht vi cch ci t tham chiu trong VBA ti ni dung 23.4.2. Ch c iu khc l v tr ca thcTc gi: Phan T Hng ([email protected])- B mn a k thut Trng H Kin trc HN

11

Chng 24: Lin kt gia Excel vi Visual Basic 6.0n. thit lp tham chiu ti Excel t VB 6.0 ActiveX DLL, vo menu Project v chn References... (hnh 24-16). Hnh 24-16 th hin tham chiu t d n VB 6.0 ti th vin i tng Excel 11.0 (tng ng Office 2003), cn nu lm vic vi phin bn trc hoc sau th s hiu s khc i (gim hoc tng ln).

Hnh 24-16: To tham chiu trong VB 6.0

Tc gi: Phan T Hng ([email protected])- B mn a k thut Trng H Kin trc HN

12

Chng 24: Lin kt gia Excel vi Visual Basic 6.0

Hnh 24-17: Chn th vin i tng Excel

By gi DLL tham chiu ti th vin i tng trong Excel, bn b sung thm code trong VBA cho php DLL lin kt vi Excel c tham chiu n. gii thch qu trnh x l trong d n Hello World, bn s lp thm mt phng thc mi khi gi ra, chui Hello World! s xut hin ti ang c chn ca worksheet hin hnh. Bn to ra bin mi tham chiu v iu khin i tng bn trong Excel, cng nhng thuc tnh mi m Excel c th s dng t DLL. Bi v DLL hin ti phi mn tham chiu ti ng dng bn ngoi nn bn phi chc chc rng tham chiu s b mt i khi kt thc chng trnh gii phng b nh. S dng s kin Class_Terminate hon thnh iu ny. Bn thm on m lnh vo Class Module nh sau:Option Explicit 'Yu cu ton b bin phi khai bo

'Khai bo bin mxlApp, l bin s gi ng dng Excel Private mxlApp As Excel.Application 't thuc tnh ca class ExcelApp Public Property Set ExcelApp(ByRef xlApp As Excel.Application) Set mxlApp = xlApp End Property 'Xo b bin mxlApp sau khi kt thc cng vic Tc gi: Phan T Hng ([email protected])- B mn a k thut Trng H Kin trc HN

13

Chng 24: Lin kt gia Excel vi Visual Basic 6.0Private Sub Class_Terminate() Set mxlApp = Nothing End Sub 'Cc phng thc trong Class hot ng Public Sub ShowMessage() MsgBox "Hello World!", vbInformation End Sub Public Sub WriteMessage() mxlApp.ActiveCell.Value = "Hello World!" End Sub

Ti gii thch cc bin nh sau: - Bin mxlApp s cha ng tham chiu ti i tng trong Excel qua DLL. - Thuc tnh ExcelApp trn c s dng bi ng dng Excel gi DLL cung cp tham chiu ti n. S kin Class_Terminate thc hin khi chm dt lm vic vi Class

Module. - Phng thc WriteMessage (bn cht l th tc c xy dng trong Class Module HelloWorld) s gn ni dung Hello World! vo hin hnh trong worksheet ca Excel khi gi phng thc t VBA. V by gi, bn bin dch li DLL trn. Trong trng hp ca s Excel cha DLL c vn ang m th VB 6.0 s khng cho php bin dch cho n khi ca s Excel c ng. Biu hin l hp bo li Permission denied: khi bn bin dch. Sau khi Excel ti c DLL, DLL lun tn ti trong b nh cho n khi bn thot khi Excel. Nu ch ng workbook th vn cha c m phi thot ra khi hn Excel. Sau khi bn ng Excel, vo menu File v chn Make AFirstProject.dll nh hnh 24-7. Khi AFirstProject.dll s bin dch li v hi c thay th bn c hay khng, bm vo Yes thay th d n c. Ca s trnh duyt i tng s th hin cc i tng trong th vin AFirstProject nh hnh 24-18 di y.

Tc gi: Phan T Hng ([email protected])- B mn a k thut Trng H Kin trc HN

14

Chng 24: Lin kt gia Excel vi Visual Basic 6.0

Hnh 24-18: Cc i tng trong th vin mi AFirstProject

By gi bn c bin dch mi DLL, cn phi b sung th tc trong Excel thi hnh phng thc mi WriteMessage. Bn m file Hello.xls lu d n trc v b sung thm th tc di y:Public Sub WriteDLLMessage() Dim HelloWorld As AFirstProject.HelloWorld Set HelloWorld = New AFirstProject.HelloWorld Set HelloWorld.ExcelApp = Application HelloWorld.WriteMessage Set HelloWorld = Nothing End Sub

S khc nhau c bn gia th tc WriteDLLMessage v th tc trc ShowDLLMesage l s dng thuc tnh mi ExcelApp trong Class Module HelloWorld cho php tham chiu ti i tng Excel vo trong Class. iu ni ln Class m ng dng gi ti v ng dng thc hin cng vic s lin kt trc tip tr li. Sau , trong Sheet1 ca Hello.xls bn xy dng hai nt iu khin. Nt iu khin Hin thng bo gn vi th tc ShowDLLMessage, nt Vit thng bo gn vi th tc WriteDLLMessage. Kt qu th hin trn hnh 24-19.

Tc gi: Phan T Hng ([email protected])- B mn a k thut Trng H Kin trc HN

15

Chng 24: Lin kt gia Excel vi Visual Basic 6.0

Hnh 24-19: Kt qu chy hai th tc WriteDLLMessage v ShowDLLMessage

Hnh 24-20: Hai th tc xy dng trong Hello.xls

24.1.3. Hin th Form ca VB 6.0 trong ExcelTip theo bn c th thc hin nhng thao tc hon thin hn trong ng dng VB 6.0 Hello World, l hin th Form ca VB 6.0 trong Excel ging nh l UserForm ca VBA. By gi bn hy nhng rc ri sang mt bn v xem cch ti thiu nht hin th Form ca VB 6.0 trong Excel. Bc u tin m d n Hello World (AFirstProject) trong VB 6.0, sau b sung thm Form bng cch vo menu Project v chn Add Form, sau bm Open. i tng Form mi s c b sung vo d n ca bn. Trc khi lu gi d n ca bn vi Form miTc gi: Phan T Hng ([email protected])- B mn a k thut Trng H Kin trc HN

16

Chng 24: Lin kt gia Excel vi Visual Basic 6.0bn trong, cn thit phi thay i mt s thuc tnh trong Form. Ni dung mt s thay i nh bng 24-2 di y: Bng 24-2: Khai bo thuc tnh ca i tng Form FHelloWorld Thuc tnh (Name) BorderStyle Caption Icon StartupPosition FHelloWorld 3 - Fixed Dialog Hello From VB 6.0 (None) (bn xo gi tr mc nh) 1 - Center Owner i thnh

Tc gi: Phan T Hng ([email protected])- B mn a k thut Trng H Kin trc HN

17

Chng 24: Lin kt gia Excel vi Visual Basic 6.0Hnh 24-21: To Form trong VB 6.0

Hnh 24-22: Form c to ra v cu trc mi ca d n AFirstProject

Sau khi thay i mt s thuc tnh trn, hy lu d n li. V Form cha c lu nn s c hp thng bo lu li vi tn mi (mc nh trng vi tn trong thuc tnh Name). Bn hy gi nguyn tn v chn v tr cng th mc vi d n trc. Kt qu thc hin nh hnh 24-22. Tip theo b sung iu khin CommandButton v Label trong Form mi. Tn (Name) ca CommandButton t l cmdOK, thuc tnh Caption t l OK. Thuc tnh Caption ca Label t l Hello World!, thuc tnh Alignment t l 2 - Center, thuc tnh Font t l 24. Bn hon thnh cng vic xy dng Form ging nh hnh 24-23.

Hnh 24-23: Form ca d n c thit k xong

Tc gi: Phan T Hng ([email protected])- B mn a k thut Trng H Kin trc HN

18

Chng 24: Lin kt gia Excel vi Visual Basic 6.0Bn to mt th tc khi bm chut vo nt OK, Form s bin mt. Cch thc hin l bm p chut vo nt OK, th tc cmdOK_Click hin ra, bn thc hin nh hnh di y:

Hnh 24-24: Gn th tc vo s kin bm nt OK

i tng Form trong VB 6.0 ActiveX DLL khng s dng c trc tip ngoi ng dng. Bi vy cn phi thm m lnh trong Class Module cho php ng dng Excel ca bn hin c Form ny. Cn phi to ra ci im ngt ti Form Excel c x ging nh l UserForm. Th tc hon chnh ca HelloWorld class c th hin vi m lnh mi b sung.

Option Explicit 'Khai bo hng s SetWindowLongA API Private Const GWL_HWNDPARENT As Long = -8 'Khai bo bin mxlApp, l bin s gi ng dng Excel Private mxlApp As Excel.Application 'Window truy cp vo b nh pht trin gi ng dng Excel Private mlXLhWnd As Long 'Khai bo hm API di y Private Declare Function FindWindowA Lib "user32" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Private Declare Function SetWindowLongA Lib "user32" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long 't thuc tnh ca class ExcelApp Tc gi: Phan T Hng ([email protected])- B mn a k thut Trng H Kin trc HN

19

Chng 24: Lin kt gia Excel vi Visual Basic 6.0Public Property Set ExcelApp(ByRef xlApp As Excel.Application) Set mxlApp = xlApp 'Ly handle ca ca s Excel ngay khi va thc hin thnh cng mlXLhWnd = FindWindowA(vbNullString, mxlApp.Caption) End Property 'Xo b bin mxlApp sau khi kt thc cng vic Private Sub Class_Terminate() Set mxlApp = Nothing End Sub 'Cc phng thc trong Class hot ng Public Sub ShowMessage() MsgBox "Hello World!" End Sub Public Sub WriteMessage() mxlApp.ActiveCell.Value = "Hello World!" End Sub Public Sub ShowVB6Form() Dim frmHelloWorld As FHelloWorld Set frmHelloWorld = New FHelloWorld Load frmHelloWorld 'Ti Form 'Ca s Form m ti ca s ng dng Excel SetWindowLongA frmHelloWorld.hWnd, GWL_HWNDPARENT, mlXLhWnd frmHelloWorld.Show vbModal Unload frmHelloWorld Set frmHelloWorld = Nothing End Sub

Form trong VB 6.0 l ca s c mc nh, c th ni rng ca s con trn mn hnh nn. to VB 6.0 Form hot ng ging nh UserForm trong Excel, bn cn phi s dng Windows API thay i ca s m ca VB 6.0 Form t mn hnh nn ti ca s i tng ng dng Excel. thay i ca s m ca Form, bn thc hin 2 bc sau: - Ly li handle (s i u khi n ) ca ca s m bn mun s dng nh ca s m ca Form. Trong Microsoft Windows, vung lu tr c bit trong b nh (global heap) s lu cc i tng trong b nh. Mi i tng u c gan mt handle. Tc gi: Phan T Hng ([email protected])- B mn a k thut Trng H Kin trc HN

20

Chng 24: Lin kt gia Excel vi Visual Basic 6.0- Thay i ca s m ca Form bng cch t handle ca ca s m bn ly vo khu vc lu tr ca s cu trc Form, m c s dng ch nh ca s m ca Form. Bn s phi khai bo bin mi mlXLhWnd gi c handle ca ca s ng dng Excel. Sau phi khai bo thm hai hm API: FindWindowA nh v handle ca s ng dng Excel, v SetWindowLongA thay i ca s m ca Form. Hng s mi GWL_HWNDPARENT s xc minh v tr ca s cu trc Form ca bn nm u trong ca s m mi s c thay i. Nh vy, chng ta to phng thc mi ShowVB6Form m s hin th trong ca s Excel. Phng thc c s dng theo tng bc hon thnh cng vic nh sau: - To ra form mi FHelloWorld. - Ti form FHelloWorld vo trong b nh. - Thay i ca s m ca form t ca s mn hnh nn sang ca s ng dng Excel bng cch s dng hm API SetWindowLongA. - Hin form bng cch s dng c hiu vbModal. Khng ging nh UserForm, Form ca VB 6.0 s hin ra vi mu c mc nh. y khng phi l iu bn thc hin trong v d ny, bi v bn s dng c hiu vbModal ca phng thc Show. Khi b sung thm m lnh trong d n VB 6.0, bn nh phi ng ca s ng dng trc khi bin dch li DLL ca bn. Trong file Hello.xls, bn to th tc DisplayDLLForm v gn vo mt nt iu khin Hin Form VB 6.0. Kt qu th tc ny thc hin nh hnh (hnh 24-25).Public Sub DisplayDLLForm() Dim HelloWorld As AFirstProject.HelloWorld Set HelloWorld = New AFirstProject.HelloWorld Set HelloWorld.ExcelApp = Application HelloWorld.ShowVB6Form Set HelloWorld = Nothing End Sub

Tc gi: Phan T Hng ([email protected])- B mn a k thut Trng H Kin trc HN

21

Chng 24: Lin kt gia Excel vi Visual Basic 6.0Bn s thy m lnh trong DisplayDLLForm s rt ging nh trong WriteDLLMessage lp d n lc trc . iu ch khc l s dng hai phng thc ShowVB6Form v WriteMessage trong class HelloWorld.

Hnh 24-25: Form Hello From VB 6.0 hin ra trong ng dng Excel

Ghi ch: Kt ni gia hai ng dng khc nhau nh VBA trong Excel v VB 6.0 s dng hai phng thc kt ni khc nhau. Hai phng thc c hiu nh l lin kt in-process (x l trong) v out-of-process (x l ngoi). - Lin kt in-process: xut hin khi hai ng dng chy trong vung b nh gn nh nhau c nh phn bi Window. ActiveX DLL l mt dng ng dng ca VB 6.0 s chy cung ng dng VBA trong Excel. Khi VBA gi ActiveX DLL ca VB 6.0, Window s ti DLL vo trong vung b nh ging nhau m c nh phn cho VBA. Khi hai ng dng chia s b nh ging nhau, lin kt gia chng rt nhanh. - Lin kt out-of-process: xut hin khi hai ng dng chy trong vung b nh khc nhau c nh phn bi Window. chnh l s lin kt gia hai ng dng Standard EXE. Window s ti tt c ng dng Standard EXE vo trong cc vung b nh tch ri. iu khng cho php hai ng dng Standard EXE chia s vung b nh nhau. Bi vy khi s dng Standard EXE ca VB 6.0 vi ng dng VBA ca Excel, chng s chy trong ccTc gi: Phan T Hng ([email protected])- B mn a k thut Trng H Kin trc HN

22

Chng 24: Lin kt gia Excel vi Visual Basic 6.0vung b nh khc nhau. Kt qu l ng truyn dn thc thi s b mt i. Lin kt out-ofprocess chy vi kiu vi cng chm hn so vi lin kt in-process.

24.2. iu khin Excel t Standard EXE ca VB 6.0Kiu ph bin nht ca ng dng l iu khin Excel t Standard EXE ca VB 6.0. Trong mc ny, chng ta s nghin cu s lin kt gia Standard EXE ca VB 6.0 vi ng dng Excel. iu khin Excel t Standard EXE ca VB 6.0 n gin hn l s dng ActiveX DLL ( trnh by mc trc). So vi s lin kt d liu gia cc chng trnh trong Window, th vic iu khin Excel t VB 6.0 khng khc g iu khin cc chng trnh khc t Excel. V d nh bn c th lin kt vi Excel t VBA ca AutoCad, Word hay PowerPoint,... (Xem thm ti mc 23.6). bt u vi d n ny, bn hy khi ng VB 6.0 v chn Standard EXE t ca s New Project (hnh 24-1). D n mi sn c Form1 mc nh. Sau bn i tn ca d n thnh VBtoExcel, i tn form thnh FrControlExcel v lu li d n . Trong ca s Project ca VB 6.0, d n ca bn trng nh hnh 24-26 di y. Sau tin thnh thit lp tham chiu ti Excel bng cch vo menu Project v chn References..., di chuyn xung v chn Microsoft Excel xx.0 Object Libary (hnh 24-16).

Hnh 24-26: D n VBtoExcel vi Form1

Tc gi: Phan T Hng ([email protected])- B mn a k thut Trng H Kin trc HN

23

Chng 24: Lin kt gia Excel vi Visual Basic 6.0D n ban u c mt form, trong form tin hnh xy dng 7 iu khin cng vi thuc tnh ca chng nh sau: i tng Form1 Thuc tnh Name Caption BorderStyle Label Caption AutoSize Font TextBox1 Name Text Frame Checkbox1 Name Name Value Checkbox2 Name Value CommandButton1 Name Caption Default Font CommandButton2 Name Caption Default Font FrControlExcel Control Excel 1 Fixed Single Nhp ni dung True MS Sans Serif, c ch 8 txtNoidung trng frmLuachon chkChudam 0 - Unchecked chkNghieng 0 - Unchecked cmdThuchien Thc hin True MS Sans Serif, c ch 8, m cmdHuybo Hy b False MS Sans Serif, c ch 8, m i thnh

Hnh 24-27 di y l kt qu cng vic thc hin xy dng v thay i thuc tnh ca cc iu khin trn.

Tc gi: Phan T Hng ([email protected])- B mn a k thut Trng H Kin trc HN

24

Chng 24: Lin kt gia Excel vi Visual Basic 6.0

Hnh 24-27: Form FrControlExcel c thit k

Sau tin hnh xy dng th tc cho hai iu khin l nt Thc hin v Hu b nh sau (bng cch bm kp chut vo biu tng iu khin, tng t nh trong VBA):Private Sub cmdThuchien_Click() Dim ExcelApp As Excel.Application Dim NewWB As Workbook, Ogiatri As Range On Error Resume Next 'Khi Excel ang m Set ExcelApp = GetObject(, "Excel.Application") 'Li xut hin khi Excel cha m If Err Then Err.Clear Set ExcelApp = CreateObject("Excel.Application") End If 'Thm 1 workbook mi, t l NewWB Set NewWB = ExcelApp.Workbooks.Add 'Nu khng nhp ni dung cho txtNoidung th s bo li If Me.txtNoidung = vbNullString Then MsgBox "Yu cu nhp d liu" Exit Sub Else Set Ogiatri = NewWB.Sheets(1).Range("B2") With Ogiatri 'Gn gi tr txtNoidung vo B2 .Value = Me.txtNoidung Tc gi: Phan T Hng ([email protected])- B mn a k thut Trng H Kin trc HN 'B qua li khi Excel cha m

25

Chng 24: Lin kt gia Excel vi Visual Basic 6.0'Cho ch trong m hoc nht If Me.chkChudam = 1 Then .Font.Bold = True Else .Font.Bold = False End If 'Cho ch trong thng hoc nghing If Me.chkNghieng = 1 Then .Font.Italic = True Else .Font.Italic = False End If End With Unload Me End If 'Hin ca s Excel ExcelApp.Visible = True 'Gii phng bin i tng Set NewWB = Nothing Set ExcelApp = Nothing End Sub

Private Sub cmdHuybo_Click() Unload Me End Sub

Hnh 24-28: Form Control Excel hin th

Tc gi: Phan T Hng ([email protected])- B mn a k thut Trng H Kin trc HN

26

Chng 24: Lin kt gia Excel vi Visual Basic 6.0

Hnh 24-29: Kt qu thc hin iu khin Excel

Khi xy dng th tc trn, bn s thy mi trng thc hin ging nh trn VBA vi y s h tr nh Auto List Members v cc cng c khc ca VB6. By gi bn bm phm F5, Form iu khin hin th nh hnh di: Sau khi nhp ni dung v chn kiu th hin, bn bm nt Th hin hoc phm Enter ( mc nh). Ca s Excel hin ra vi ni dung ch v kiu th hin nh mong mun. Khi kim tra, chy th v v li, tc l chng trnh hon thin, bn chn menu File/VBtoExcel.exe... VB6.0 s to ra mt file chng trnh VBtoExcel.exe thi hnh mt cch c lp. Bn c th chy file VBtoExcel.exe bng cch bm p chut vo ti ca s Window hoc t Run (hnh 24-30). Kt qu thc hin tng t nh trn.

Hnh 24-30: Thc hin VBtoExcel.exe bng Run

Bn c th thc mc s dng file chng trnh VBtoExcel.exe thc hin cc my tnh khc c khng?. Cu tr li l c, vi iu kin my tnh phi ci b Office 2003. NuTc gi: Phan T Hng ([email protected])- B mn a k thut Trng H Kin trc HN

27

Chng 24: Lin kt gia Excel vi Visual Basic 6.0s dng Office phin bn khc th s bo li. Do vy, linh hot cho cc phin bn Office, khi xy dng chng trnh hon thin, bn nn khai bo cc bin i tng l Object chung (kiu Late Binding) thay v cc i tng c th nh Workbook, Range (kiu Early Binding). Xem thm ti mc 23.4.

Ngun ti liu ny ti tham kho ch yu t "Professional Excel Development: The Definitive Guide to Developing Applications Using Microsoft Excel and VBA By Stephen Bullen, Rob Bovey, John Green".

Tc gi: Phan T Hng ([email protected])- B mn a k thut Trng H Kin trc HN