新大榭论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

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

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

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

查看: 1031|回复: 0

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

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

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

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

x
最近用VBA帮公司其他部门的同事写了一个数据管理的小工具,让他们以前每天要花1、2个钟头处理的工作现在10几分钟就搞定,还不容易出错,博得不少喝彩。终于,这些个家伙们提出越来越多新的要求,一会要求导出的报表增加这个项目,一会要求增加那个功能。倒是难不倒咱,很快修改了窗体代码,然而他们却连导入窗体都不会操作,还得跑到他们电脑前去(办公室可不在一起呀,一次两次就算了,可却经常发生,又不好意思拒绝,几经尝试,终于找到了一个解决办法:
0 x& Z, b6 b' b3 D. K 为了好看,也为了防止误操作,所有他们可见的界面都是窗体,每次要求修改的东西也都是通过修改窗体代码完成的,那么,在工具上加上个自动升级功能,每次我写好新窗体后,导出到共享盘上,文件自动查找有没有新窗体文件存在,有,则先删除原来的窗体,再导入新窗体(要求同名),不就搞定了吗?不多说了,上代码:
  1. 6 s- k& n4 k3 Z( P9 p
  2. Sub 升级()6 G7 }4 J. w! G! h: S7 q
  3. Application.ScreenUpdating = False# W! H6 R$ {& [- Z
  4. On Error Resume Next  N* E1 k9 o0 }
  5.    Dim pw$
    " N! y( L  z& s* a
  6. '因为要用代码操作窗体需要先解开VBA工程密码(无密码就不用了),先解开:
    ; I9 S0 ]. a  f6 l5 l4 w
  7.    pw = "1234" 'VBA工程密码0 J# A' s! j1 d2 K. b' b& Y
  8.    If ThisWorkbook.VBProject.Protection = vbext_pp_locked Then& y1 Y& N7 s! f6 }6 T+ K% v5 _
  9.      Application.VBE.CommandBars(1).Controls("工具(T)").Controls("VBAProject 属性(&E)...").Execute
    ' k" F& ?+ {% u  O% e1 t: `
  10.      Application.SendKeys pw & "{ENTER}{ENTER}"* b8 \" B, a4 y3 A
  11.      DoEvents
    8 k5 M" W$ E8 b
  12.    End If
    * g" ?# [. A: X3 L1 P5 Z; D" j
  13. 9 P- H- L$ y  h8 l4 ]* j9 ~
  14. '还要求工具(T)-宏(M)-安全性(M)-可靠发行商(T)-勾选了“信任对于VB项目的访问(V),就别手工了,自动来:" L& H5 c# W% i5 T8 m6 j
  15.    Dim Chgset As Boolean
    & s) w, D) G6 G5 `, w
  16.    '陷阱测试,VBProject.Protection在这儿并无实际的意义( H8 ?3 {1 a$ w5 l$ m+ {# Y3 j/ M; |; K( d
  17.    Debug.Print ThisWorkbook.VBProject.Protection
    4 k5 e4 \/ A$ q
  18.    If Err.Number = 1004 Then# Q. ?( A5 j. C8 k- O( W( ~7 {
  19.      Err.Clear
    ; N# x: w, V; N: J+ |9 Q
  20.      Application.SendKeys "%TMS%T%V{ENTER}"! m2 O8 y$ Q2 Y: n
  21. Chgset = True, b( L) t& O% c6 h4 ?7 T- e, D
  22. DoEvents& _5 Y6 P% I, m7 @2 `# T% L1 z0 d
  23.    End If
    # ?! r! R# R0 }0 i% R, u+ j
  24.    '执行升级操作:
    ' S1 N5 v1 F3 f* T/ h2 l
  25. Dim vbCmp As VBComponent
    : K! s! f) S8 j9 \% e
  26. Dim fname As String. f4 M$ J2 O8 f1 |8 R
  27.    For Each vbCmp In ThisWorkbook.VBProject.VBComponents8 G3 I3 }$ t$ U) E; h
  28.      If vbCmp.Type = vbext_ct_MSForm Then 'ThisWorkbook.VBProject.VBComponents.Remove vbCmp8 I$ e. ^: l& K- V# L
  29.      fname = vbCmp.Name
    8 y* J3 S  d. A5 }! J
  30.      If Dir("共享路径" & fname & ".frm") <> "" Then
    : q) u) R. P9 Z, G; A$ Z2 ]5 y
  31.      Application.VBE.ActiveVBProject.VBComponents.Remove ThisWorkbook.VBProject.VBComponents(fname)/ B: H, O# m: Q$ n1 |
  32.      Application.VBE.ActiveVBProject.VBComponents.Import "共享路径"  & fname & ".frm"
    0 l! n3 e3 a. Y
  33.      End If
    1 D  U7 V! y6 M2 j
  34.      End If. g! X6 z% ]- |# s' c; c" T+ T
  35.    Next vbCmp( c# v/ q4 J/ |$ }$ \$ w1 L  g0 O3 C
  36.    MsgBox "升级完成"; ^2 ?# ^4 y+ w; W8 M: l
  37.    
    , q0 Q  s! E& e: c6 p5 r6 G
  38.    '操作完成后还原操作前的状态
    " o- R7 a- i; k
  39. Application.ScreenUpdating = True% K6 {; t  m, \6 O
  40. If Chgset Then Application.SendKeys "%TMS%T%V{ENTER}"
    4 \; Q) v6 G& s/ X' U
  41. End Sub
    3 D- W/ L' S- }* x
复制代码
当然了,这里是直接开始升级了,如果需要,加上个升级文件是否存在的判断也行。
新大榭Python学习社区培训、Excel业务指导、办公软件定制、网站建设;新大榭探索实验室欢迎您!http://lab.daxie.net.cn/
Q群推荐 大榭本地求职招聘QQ群,欢迎转发分享本地招聘信息资讯! 官方招聘1群(已满);官方招聘2群:315816937 *
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-2-26 21:23 , Processed in 0.072437 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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