|
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转新大榭论坛!
您需要 登录 才可以下载或查看,没有账号?注册
x
最近用VBA帮公司其他部门的同事写了一个数据管理的小工具,让他们以前每天要花1、2个钟头处理的工作现在10几分钟就搞定,还不容易出错,博得不少喝彩。终于,这些个家伙们提出越来越多新的要求,一会要求导出的报表增加这个项目,一会要求增加那个功能。倒是难不倒咱,很快修改了窗体代码,然而他们却连导入窗体都不会操作,还得跑到他们电脑前去(办公室可不在一起呀,一次两次就算了,可却经常发生,又不好意思拒绝,几经尝试,终于找到了一个解决办法:
4 U; F7 {" _ b* b: T% V }+ }1 e. u 为了好看,也为了防止误操作,所有他们可见的界面都是窗体,每次要求修改的东西也都是通过修改窗体代码完成的,那么,在工具上加上个自动升级功能,每次我写好新窗体后,导出到共享盘上,文件自动查找有没有新窗体文件存在,有,则先删除原来的窗体,再导入新窗体(要求同名),不就搞定了吗?不多说了,上代码:- * x5 R+ ^7 Q8 R' S; x; s2 J. S8 t
- Sub 升级()
) b$ y+ F# _/ n& y - Application.ScreenUpdating = False
$ w$ w6 u/ Q$ W- n; Y - On Error Resume Next
# F8 X, t, l* S: i' x. X& | - Dim pw$ F% n {, _% K
- '因为要用代码操作窗体需要先解开VBA工程密码(无密码就不用了),先解开:
# U) H! \0 K- s6 Q - pw = "1234" 'VBA工程密码% @) `: N0 F/ t& P6 k! a" ?9 r2 T2 ^
- If ThisWorkbook.VBProject.Protection = vbext_pp_locked Then9 F& }2 \: I0 t
- Application.VBE.CommandBars(1).Controls("工具(T)").Controls("VBAProject 属性(&E)...").Execute
m; F( e* @+ g6 z* Q - Application.SendKeys pw & "{ENTER}{ENTER}"0 S, e/ T1 ^+ F2 ]
- DoEvents
) v2 j; s7 M5 \( v- E8 J! u - End If# @! Q. \0 y0 R0 U9 c8 |
-
2 N. V. u! B' ^7 n! \; Y - '还要求工具(T)-宏(M)-安全性(M)-可靠发行商(T)-勾选了“信任对于VB项目的访问(V),就别手工了,自动来:
& v. Q% ~& c- G" {! j/ N1 w0 | - Dim Chgset As Boolean
( s6 q1 ?% P5 \4 t - '陷阱测试,VBProject.Protection在这儿并无实际的意义
# U5 m; i; B, ?& Q4 D# x - Debug.Print ThisWorkbook.VBProject.Protection
/ L: J2 n8 d; J S; W7 |+ A# u& l - If Err.Number = 1004 Then# ^% N4 C- _, R& n/ N$ g8 b( _
- Err.Clear: \; z0 w0 I5 g4 P
- Application.SendKeys "%TMS%T%V{ENTER}"
" k( m& h1 o) s! z6 ^+ B - Chgset = True
8 s' k$ U0 W. H' a w - DoEvents
1 X9 Z$ Z! N( d2 Q5 X+ l - End If" r f/ u, L/ K: y5 y
- '执行升级操作:$ _& Q- s" S5 u" t% y
- Dim vbCmp As VBComponent
9 z, R4 R6 i! C3 ^ A& A+ u% H" j2 E - Dim fname As String
8 I7 ~2 i9 A4 F, F; e) {. ~ - For Each vbCmp In ThisWorkbook.VBProject.VBComponents
% @+ }" u, N. {9 Z9 d* r$ O S6 Y - If vbCmp.Type = vbext_ct_MSForm Then 'ThisWorkbook.VBProject.VBComponents.Remove vbCmp; d6 H8 i% q7 f( y G$ G
- fname = vbCmp.Name
( {3 z) {6 ` q+ _+ B& b - If Dir("共享路径" & fname & ".frm") <> "" Then
- l0 k T \5 L7 Z4 m- I - Application.VBE.ActiveVBProject.VBComponents.Remove ThisWorkbook.VBProject.VBComponents(fname)3 ~: M: R4 s9 C; a( G0 O! I
- Application.VBE.ActiveVBProject.VBComponents.Import "共享路径" & fname & ".frm", F: Z5 F; A( | q( c7 k
- End If5 P" `( s( L3 k9 i; `& a
- End If
& ]. T. W) ^, u. Q% x9 i# A1 Y7 _ - Next vbCmp
" ~, T4 y" j. b4 }% {7 g: H - MsgBox "升级完成"
8 @% H- c+ E9 f( P -
2 @9 v9 [ o& S$ [ - '操作完成后还原操作前的状态: j! n. w4 t2 E6 L! I
- Application.ScreenUpdating = True
- s7 s) f4 h, Y2 v/ V' q& K4 A2 J - If Chgset Then Application.SendKeys "%TMS%T%V{ENTER}"8 A! j& e( @% L- X/ b) E7 Y
- End Sub$ x( l" d- J6 \( C! i
-
复制代码 当然了,这里是直接开始升级了,如果需要,加上个升级文件是否存在的判断也行。 |
|