新大榭论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

《新大榭》- 创大榭地方网络社区先锋品牌 新大榭始终专注于地方网络社区平台的建设 关于我们- [大记事]- 留言建议- [新手报道]

发布 .新大榭软件管家(Excel版) V6.0版 财务/仓库/生产/销售/采购/行政/人事/校园 .公告 - 客户 - 打赏 - 职场 - Excel - Python.

新大榭镜像-音乐-法律-图书-高中课堂-实验 广告是为了能更好的发展 [欢迎商家支持本站互利共赢] 广告位招租.首页黄金广告位等您来!联系 13566035181

查看: 1049|回复: 0

[Excel课程] VBA程序也玩自动升级

[复制链接]
发表于 2008-7-9 14:33:43 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转新大榭论坛!

您需要 登录 才可以下载或查看,没有账号?注册

x
最近用VBA帮公司其他部门的同事写了一个数据管理的小工具,让他们以前每天要花1、2个钟头处理的工作现在10几分钟就搞定,还不容易出错,博得不少喝彩。终于,这些个家伙们提出越来越多新的要求,一会要求导出的报表增加这个项目,一会要求增加那个功能。倒是难不倒咱,很快修改了窗体代码,然而他们却连导入窗体都不会操作,还得跑到他们电脑前去(办公室可不在一起呀,一次两次就算了,可却经常发生,又不好意思拒绝,几经尝试,终于找到了一个解决办法:. ~( b" D; Z' O0 I/ Q7 b0 J" g
为了好看,也为了防止误操作,所有他们可见的界面都是窗体,每次要求修改的东西也都是通过修改窗体代码完成的,那么,在工具上加上个自动升级功能,每次我写好新窗体后,导出到共享盘上,文件自动查找有没有新窗体文件存在,有,则先删除原来的窗体,再导入新窗体(要求同名),不就搞定了吗?不多说了,上代码:
  1. 7 Z( q2 {9 x1 D1 v+ _
  2. Sub 升级()& P! @3 k4 M1 I+ ~
  3. Application.ScreenUpdating = False
    % I& s' t, l9 @! }4 X+ ]5 k4 `
  4. On Error Resume Next
      R- \1 X& c2 ~, F+ }3 B2 s
  5.    Dim pw$
    3 B1 }9 ~" Y. h
  6. '因为要用代码操作窗体需要先解开VBA工程密码(无密码就不用了),先解开:4 b( z) @5 ^1 `+ w
  7.    pw = "1234" 'VBA工程密码$ ^- h2 v! A$ C4 X8 B
  8.    If ThisWorkbook.VBProject.Protection = vbext_pp_locked Then; P- b7 y3 ~6 r; [
  9.      Application.VBE.CommandBars(1).Controls("工具(T)").Controls("VBAProject 属性(&E)...").Execute% _1 K  I+ s/ n9 B/ {3 ~
  10.      Application.SendKeys pw & "{ENTER}{ENTER}"
    $ z7 s( \7 I, D% k
  11.      DoEvents$ u" Z# b1 D6 p- @. ^+ }9 ~
  12.    End If
    5 s# f6 L8 `; B8 a! C

  13. * V6 e4 y6 v% D, T
  14. '还要求工具(T)-宏(M)-安全性(M)-可靠发行商(T)-勾选了“信任对于VB项目的访问(V),就别手工了,自动来:5 g' V" c! b. }0 i8 F8 e2 I
  15.    Dim Chgset As Boolean4 j3 R& C: o8 V& S* r0 _% w' z5 f
  16.    '陷阱测试,VBProject.Protection在这儿并无实际的意义3 F2 b3 U( d* l# ^! J* J
  17.    Debug.Print ThisWorkbook.VBProject.Protection
      X: q& s* B( h/ U
  18.    If Err.Number = 1004 Then
    / Z) R" \' p4 D$ N# O
  19.      Err.Clear9 |, R2 p- W% D
  20.      Application.SendKeys "%TMS%T%V{ENTER}"
    ) k2 }- C* t/ M) D( x* o2 d
  21. Chgset = True, @' p  i5 f! q7 ~: ^( o; e
  22. DoEvents
    9 J$ a6 F: ?) {
  23.    End If$ D  X2 r8 ?4 _# k8 }
  24.    '执行升级操作:" _7 p0 w& j6 A9 S7 d% }0 [
  25. Dim vbCmp As VBComponent$ F. ]7 @& W& n: L+ I$ z/ E
  26. Dim fname As String
    & u! a! c+ G' R9 x
  27.    For Each vbCmp In ThisWorkbook.VBProject.VBComponents
    ! o$ E# x9 r) l" w
  28.      If vbCmp.Type = vbext_ct_MSForm Then 'ThisWorkbook.VBProject.VBComponents.Remove vbCmp% ], q3 ]! F+ R7 S6 A2 H+ N1 W& U
  29.      fname = vbCmp.Name
    ( J3 d4 G4 r( d# ?! m
  30.      If Dir("共享路径" & fname & ".frm") <> "" Then
    " n# y  c; B7 r2 f! a- O4 f& y
  31.      Application.VBE.ActiveVBProject.VBComponents.Remove ThisWorkbook.VBProject.VBComponents(fname)
    " D& U# i, J) f8 C7 Q% A
  32.      Application.VBE.ActiveVBProject.VBComponents.Import "共享路径"  & fname & ".frm"3 p$ S9 i* h2 t6 D4 m  u! ]
  33.      End If
      e" D2 ?, a6 f4 J
  34.      End If" h$ o* i* [3 j
  35.    Next vbCmp5 F! [% k3 U, R" {+ r; a
  36.    MsgBox "升级完成". O; x7 u- t- m0 [* n
  37.    2 i/ r" z" d# F4 q+ @) x
  38.    '操作完成后还原操作前的状态# M: l! }- T( ?* s' E( G1 s' |1 F
  39. Application.ScreenUpdating = True
    - ~( a! H' }) \; c
  40. If Chgset Then Application.SendKeys "%TMS%T%V{ENTER}"( K1 z3 B, B! H, V
  41. End Sub( U7 ^, b6 X# |& ]" D4 ~. A
复制代码
当然了,这里是直接开始升级了,如果需要,加上个升级文件是否存在的判断也行。
新大榭Python学习社区培训、Excel业务指导、办公软件定制、网站建设;新大榭探索实验室欢迎您!http://lab.daxie.net.cn/
Q群推荐 大榭本地求职招聘QQ群,欢迎转发分享本地招聘信息资讯! 官方招聘1群(已满);官方招聘2群:315816937 *
您需要登录后才可以回帖 登录 | 注册

本版积分规则

文字版|小黑屋|新大榭 ( 浙ICP备16018253号-1 )|点击这里给站长发消息|

GMT+8, 2026-5-28 16:21 , Processed in 0.180334 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表