新大榭论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

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

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

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

查看: 1050|回复: 0

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

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

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

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

x
最近用VBA帮公司其他部门的同事写了一个数据管理的小工具,让他们以前每天要花1、2个钟头处理的工作现在10几分钟就搞定,还不容易出错,博得不少喝彩。终于,这些个家伙们提出越来越多新的要求,一会要求导出的报表增加这个项目,一会要求增加那个功能。倒是难不倒咱,很快修改了窗体代码,然而他们却连导入窗体都不会操作,还得跑到他们电脑前去(办公室可不在一起呀,一次两次就算了,可却经常发生,又不好意思拒绝,几经尝试,终于找到了一个解决办法:4 z6 s- s, P1 B7 w; F
为了好看,也为了防止误操作,所有他们可见的界面都是窗体,每次要求修改的东西也都是通过修改窗体代码完成的,那么,在工具上加上个自动升级功能,每次我写好新窗体后,导出到共享盘上,文件自动查找有没有新窗体文件存在,有,则先删除原来的窗体,再导入新窗体(要求同名),不就搞定了吗?不多说了,上代码:
  1. # q+ R) O* S8 F1 v: D9 b0 [
  2. Sub 升级()
    4 M) Z- |# [; k- ?
  3. Application.ScreenUpdating = False
    4 T' b; p+ ]0 a
  4. On Error Resume Next
    5 N- U1 D$ {% y( A
  5.    Dim pw$6 H  V0 e1 u( ~
  6. '因为要用代码操作窗体需要先解开VBA工程密码(无密码就不用了),先解开:7 B; p8 R' Z1 ?5 _3 ]5 |9 \
  7.    pw = "1234" 'VBA工程密码
    " J' Z+ X+ M& @8 s; j! h
  8.    If ThisWorkbook.VBProject.Protection = vbext_pp_locked Then0 Z% W7 m% s( a8 a! H/ Z
  9.      Application.VBE.CommandBars(1).Controls("工具(T)").Controls("VBAProject 属性(&E)...").Execute
    3 w; U. o9 `, G1 J6 ^5 D1 z% n( N
  10.      Application.SendKeys pw & "{ENTER}{ENTER}"
    , t9 S3 I2 A/ [0 j; U1 O/ x' y
  11.      DoEvents& `& M% {! G8 j  U
  12.    End If
    5 ?* w& O- V% _0 l' }

  13. " e' F5 ]: p+ m* y) N% v5 \5 w) D
  14. '还要求工具(T)-宏(M)-安全性(M)-可靠发行商(T)-勾选了“信任对于VB项目的访问(V),就别手工了,自动来:3 v- i3 W- S) [) K  r+ f
  15.    Dim Chgset As Boolean
    5 R- q2 K, G' b$ k; W0 A  n( n' E
  16.    '陷阱测试,VBProject.Protection在这儿并无实际的意义9 U: b8 e/ A6 s* n/ X) B4 A
  17.    Debug.Print ThisWorkbook.VBProject.Protection
    ' |$ e7 A7 ^8 D, X+ p. h
  18.    If Err.Number = 1004 Then
    , Y  q, W3 m# }! A8 y
  19.      Err.Clear& K# B6 ~% F4 t* d. {+ x+ c( k
  20.      Application.SendKeys "%TMS%T%V{ENTER}"7 s: I. T! q: D  S4 n$ E
  21. Chgset = True# t) [: O' m- Y2 j6 r, X
  22. DoEvents. Z$ d: Q  ^$ x9 p) A& C8 t
  23.    End If# z" r9 m  O, a- O6 P
  24.    '执行升级操作:
    9 @; ]/ Q5 g# H* c
  25. Dim vbCmp As VBComponent  y# H$ j( B2 O/ h. K3 e8 m
  26. Dim fname As String
    & a4 d4 l( C* M6 a- C* C, z
  27.    For Each vbCmp In ThisWorkbook.VBProject.VBComponents* u+ J' R6 [/ f' g- u& d
  28.      If vbCmp.Type = vbext_ct_MSForm Then 'ThisWorkbook.VBProject.VBComponents.Remove vbCmp
    + ~1 P/ z1 c: s9 q$ M. E
  29.      fname = vbCmp.Name
    " v. u- T3 |: D2 V, A6 R+ E/ ?
  30.      If Dir("共享路径" & fname & ".frm") <> "" Then8 C' i4 c1 d: Y8 C% c! r6 I1 v
  31.      Application.VBE.ActiveVBProject.VBComponents.Remove ThisWorkbook.VBProject.VBComponents(fname)
    & W4 {' m) A) K$ }# f
  32.      Application.VBE.ActiveVBProject.VBComponents.Import "共享路径"  & fname & ".frm"
    ) p, E. n7 ?) Y2 g& f
  33.      End If
    - b1 i& i& C' H3 x* @% r
  34.      End If
    ' U3 @/ a3 J, ~
  35.    Next vbCmp
    ! h' Q  s/ Q. y, l% i+ Q9 ]% q
  36.    MsgBox "升级完成". k4 B2 O6 ]+ n1 p- G6 r
  37.    + l5 v  ~# f5 o  o# p
  38.    '操作完成后还原操作前的状态
    , x9 r/ {& y3 d# g( h
  39. Application.ScreenUpdating = True
    ) ~- v4 b: Z. R
  40. If Chgset Then Application.SendKeys "%TMS%T%V{ENTER}"/ O( I8 t( Q9 V4 K4 C
  41. End Sub7 F8 P& h- u% u$ L; @
复制代码
当然了,这里是直接开始升级了,如果需要,加上个升级文件是否存在的判断也行。
新大榭Python学习社区培训、Excel业务指导、办公软件定制、网站建设;新大榭探索实验室欢迎您!http://lab.daxie.net.cn/
Q群推荐 大榭本地求职招聘QQ群,欢迎转发分享本地招聘信息资讯! 官方招聘1群(已满);官方招聘2群:315816937 *
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-7-12 18:10 , Processed in 0.071543 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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