|
发表于 2014-5-25 11:37:42
|
显示全部楼层
来自: 中国广东佛山
本帖最后由 yjyeming 于 2014-5-25 11:44 编辑 : m9 _7 Z# z, Z- ]8 r& K
6 D) i |' z+ h0 i3 f6 v) \. O# c) M6 wVB封装DLL实例讲解(一)7 @4 h- o8 z% o
( l3 E- E# e- O1 X6 ]+ v! w5 p
; ^7 H- p: Q5 x9 B) G3 z% d一、 DLL基本概念
' F3 P2 Q! t8 ~. E( s! p! u(一)概念$ A& A- i7 M' u
DLL即动态链接库(Dynamic Link Library),是由可被其它程序调用的函数集合组成的可执行文件模块。DLL不是应用程序的组成部分,而是运行时链接到应用程序中。
& ]! s' G. F2 {- [(二)主要优点:3 j1 D8 p) h' a
1、多个应用程序可以共享一个DLL,而且当多个应用程序调用库的同一个函数时,可执行文件中装入的只是该函数的内存地址,从而节省内存和磁盘空间;4 Q7 b* R, B; V5 E% q. O
2、使用动态链接库易于我们维护用户程序,即使对动态链接库进行修改也不会影响用户程序;, c$ ?' H7 N4 Z U+ l1 a
3、从ACCESS角度而言,还可以更好的确保核心代码的安全。
' s* _1 @" Y/ W, O2 j2 c0 Y* r# c, k
二、 用VB封装VBA代码,构建自定义的DLL动态链接库
1 E; q# p4 P( e; T(一)ACCESS中实例代码
8 f1 K& q& I5 i" \8 l! M1 v下面是一个“快速提取字符串中数字.mdb”实例(该实例在文件包中),单击“提取结果”按钮,将文本框中的数字在弹出消息显示出来。2 N! \6 \$ Z C9 I y3 d+ S
我将就这个实例演示如何将该实例VBA代码封装成为DLL。# z* L- q" a! w; Q- `, [
. P* G% \3 u3 S$ v, M
8 O, i4 ^/ _( j. s, T
. l6 w2 b: @- N1 U6 Y |0 B 按钮单击事件代码如下:. I& v% I( q4 J0 f/ A
Private Sub CmdFindnumber_Click()4 l4 ~6 T% T) G) l6 Y
Dim strM As String '初始字符串
! r' x. f0 l7 g% G Dim strOut As String '输出字符串变量
' y' \( r" k7 S0 u! j& n) o Dim I. D% k z) L4 e' ]- _- D6 n0 Q
% J n5 m) u9 z& i) g6 S Q strM = Me.Text1: ]" c# x6 O6 Y8 z4 I# o
'从第一个字符向最后一个字符循环,以提取每个字符5 S& }$ J6 Y0 ~4 E$ J! }8 F
For I = 1 To Len(strM)" T9 G5 |6 G% E& e- D
'判断是否为0到9字符,是则赋值输出* M: ]4 R; X: m- S5 C G2 |1 J
If Mid(strM, I, 1) Like "[0-9]" Then* y3 i- M5 @" \# P" f9 ]9 }
strOut = strOut & Mid(strM, I, 1); Z* a7 V7 K4 h$ L% |9 U
End If
" a. s1 N- A$ @7 g Z! q Next I
% L2 R v8 l! w2 @( h '用MsgBox函数进行输出测试7 V1 ?; b& K$ E/ i. w7 w i, |
MsgBox strOut; R- t7 I, d. U& |% p, K6 n; \- ^
End Sub3 d" r$ t2 I1 Z) H$ ^! m/ c
 以上代码还不能直接用于封装,须将其修改成为公用函数(过程)
- E9 I; P6 y; ^ l" a) }* }* F0 T; j* {
(二)VB封装实例中VBA代码
- g4 S8 D1 l" m5 K+ e步骤一:在VB编辑窗中,点菜单【文件】-【新建工程】,打开新建工程窗口
9 H: T! f: u0 ]4 Z+ ]/ ]+ S0 N; e' u8 e: |" `* C. W
) m+ {- s# d: ~1 w( G: d$ C8 i; ^: K( O4 j3 h- ?" \
1 Z+ R& G" R, k
& O( |9 B1 W, g步骤二:修改工程名,这即生成的DLL库名
7 Y- q8 O4 C( W" W
3 v8 r1 W# T& X9 ]8 U
# P, T4 k1 s9 ?( i& x0 e, {$ r! D) j* ~1 W2 }: C5 Q" s/ V
& b8 o; S- Y# R/ Q
1 f7 O( S; L2 E8 T步骤三:修改类名5 B9 \6 T5 n9 v- `% O
4 f! \; [" d6 e0 Q
. C. P* n. U; r4 j, s% P) |& L
2 Y y1 e, \- l' y( p& X& W! C0 K6 z/ _$ w S+ M: p, Q
步骤四:在代码窗口输入如下代码。将ACCESS中的单击事件代码,略做修改成为一个公用函数,然后复制到VB代码编辑窗口
1 P8 n, f2 G- M# A3 I- d' N5 Q
! X. A, K1 f# D" l8 D3 v& i5 |
* j9 y; B) ]% p( d9 |
d2 w% u3 y( q8 `. b代码如下7 t* ?# b8 |% `+ b2 w
'将这前的ACCESS代码改成一个公用函数/ {# z& {% u6 T7 d
'输入:strPutString 字符串变量,需分离数字的字符串: f8 U5 l' y$ p" q6 t: a: [3 x6 [1 C
'输出: fFindNumber字符串变量,得到的数字字符9 E6 p* Z9 S) C
Public Function fFindNumber(strPutString As String) As String2 H1 T4 _* ]& W* o
Dim strOut As String '输出字符串变量 }4 S: V' e V* ?' V
Dim I- X7 m/ e6 A: W) B
2 Q: f. u: b0 H. a9 n! P
'从第一个字符向最后一个字符循环,以提取每个字符
, p8 e% C0 I3 q For I = 1 To Len(strPutString)( J. v! @, x# W$ a1 Q
'判断是否为0到9字符,是则赋值输出' L6 o( n; Z4 A1 w, L6 u$ W# e
If Mid(strPutString, I, 1) Like "[0-9]" Then
" l% i6 k# d$ } e, ?; h5 L* ] strOut = strOut & Mid(strPutString, I, 1)
/ n, H9 C" N0 |5 k, x! B End If4 B: K) k. D6 W' u0 D- o, n
Next I% f+ M+ g' e/ i5 {% S3 l
'数字输出
7 m2 R& u8 f$ G fFindNumber = strOut
+ d& W; M/ m0 _5 X; P% _; VEnd Function5 T, ^# o' D( j
: }2 i$ b* x! T9 w" h0 ?0 {0 d步骤五:编译DLL,点菜单【文件】-【生成我的动态库.dll】,VBA代码封装DLL就完成了。
/ [& `) j7 _, c& l- d4 {! N/ p6 `# J7 F. ^& P
三、 在mdb中调用自定义DLL动态链接库/ I4 f! @9 L& I+ R1 h
, K1 K2 V1 v# g7 e1 V( }6 D3 T# Y8 Z(一)新建数据库及窗体
) q: Z/ w" j: o9 X' [) b新建【快速提取数字(DLL)实例.mdb】数据库,新建一个窗体【frmMain】,在窗体添文本框【text0】,按钮【CmdFindNum】,Caption属性:“提取数字”(见下图)
. S' Y: d% y' q6 T+ v1 a3 Y
3 F1 Z* F P9 {) D$ T/ K8 Z3 [; D5 \( l. g7 U
(二)引用【我的动态库.dll】库
/ Z- p2 z6 T. x' b! b按【Alt+F11】打开VBE窗口,点菜单【工具】-【引用】,打开引用对话框,完成对我们自己编译的DLL的引用。- M; P, Q) o' P' ~+ m! y+ S9 C3 y! `4 U
5 m' j* U7 n/ @4 n5 s5 ^
' H+ t2 @/ \- w" _: K6 \3 @ L
/ B( K* b. U3 M* p6 C4 ~6 g2 y# u- z2 A3 R) a1 L9 ~
& ^9 z4 D8 Z$ D! Q' R, Z- d7 `- A! a u4 ` f$ e/ v: J, N
0 J0 w$ `0 Q: r* F
# Q/ h$ g" D4 I2 [! Y) V! a" U, K3 L, R R# i6 Q2 \
! s3 o0 ]- m+ U8 U- \
(三)在【CmdFindNum】按钮单击事件中加入如下代码。
5 K, C* [* B9 y* t0 J$ i: k6 hPrivate Sub CmdFindNum_Click()5 r7 c/ y7 }* T( n
'申明自定义类: {; u b9 U0 Y7 q! n, y% ]
Dim MyFindNum As 提取数字
2 |8 X4 F' }1 W; y$ H9 u4 ]1 v# _ Dim strOut As String- m q% ^" p$ m) J+ p) j, W- n
x% k& f+ c2 g& ^8 [ '实例化"提取数字类"对象
- F8 n. O% r8 ^( {/ H Set MyFindNum = New 提取数字
+ e: H& O- W% c) {7 W9 E. ] '将函数输出结果赋值给自定义字符串变量4 t( |/ o( X) c+ z
strOut = MyFindNum.fFindNumber(Text0) |3 E x* @, J; i* j& g
! a. X# i; h6 ~
'在消息框中显示
6 y) Z( S+ I- ]3 f3 B MsgBox "你提取的数字为:" & strOut, vbInformation, "江羽提示:"
Z' B+ C8 z8 M5 A$ j9 Y) j9 o7 @$ bEnd Sub
6 }0 V: J! Q6 Q" s6 L
2 Q* P$ W. n4 p Y4 N6 ?2 c点击保存后,你就可以运行一下窗体测试你的成果了% H: O, f$ w8 I6 O
 本文实例见实例包,下载测试如果提示错误,请重新对自定义类库进行引用。
& e' O" n; ?/ @: E; j# B: H: B1 J Q3 o: m+ G
0 g9 }# `5 `' o1 t* O+ ? |
|