新大榭论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

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

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

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

查看: 1035|回复: 0

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

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

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

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

x
最近用VBA帮公司其他部门的同事写了一个数据管理的小工具,让他们以前每天要花1、2个钟头处理的工作现在10几分钟就搞定,还不容易出错,博得不少喝彩。终于,这些个家伙们提出越来越多新的要求,一会要求导出的报表增加这个项目,一会要求增加那个功能。倒是难不倒咱,很快修改了窗体代码,然而他们却连导入窗体都不会操作,还得跑到他们电脑前去(办公室可不在一起呀,一次两次就算了,可却经常发生,又不好意思拒绝,几经尝试,终于找到了一个解决办法:
4 U; F7 {" _  b* b: T% V  }+ }1 e. u 为了好看,也为了防止误操作,所有他们可见的界面都是窗体,每次要求修改的东西也都是通过修改窗体代码完成的,那么,在工具上加上个自动升级功能,每次我写好新窗体后,导出到共享盘上,文件自动查找有没有新窗体文件存在,有,则先删除原来的窗体,再导入新窗体(要求同名),不就搞定了吗?不多说了,上代码:
  1. * x5 R+ ^7 Q8 R' S; x; s2 J. S8 t
  2. Sub 升级()
    ) b$ y+ F# _/ n& y
  3. Application.ScreenUpdating = False
    $ w$ w6 u/ Q$ W- n; Y
  4. On Error Resume Next
    # F8 X, t, l* S: i' x. X& |
  5.    Dim pw$  F% n  {, _% K
  6. '因为要用代码操作窗体需要先解开VBA工程密码(无密码就不用了),先解开:
    # U) H! \0 K- s6 Q
  7.    pw = "1234" 'VBA工程密码% @) `: N0 F/ t& P6 k! a" ?9 r2 T2 ^
  8.    If ThisWorkbook.VBProject.Protection = vbext_pp_locked Then9 F& }2 \: I0 t
  9.      Application.VBE.CommandBars(1).Controls("工具(T)").Controls("VBAProject 属性(&E)...").Execute
      m; F( e* @+ g6 z* Q
  10.      Application.SendKeys pw & "{ENTER}{ENTER}"0 S, e/ T1 ^+ F2 ]
  11.      DoEvents
    ) v2 j; s7 M5 \( v- E8 J! u
  12.    End If# @! Q. \0 y0 R0 U9 c8 |

  13. 2 N. V. u! B' ^7 n! \; Y
  14. '还要求工具(T)-宏(M)-安全性(M)-可靠发行商(T)-勾选了“信任对于VB项目的访问(V),就别手工了,自动来:
    & v. Q% ~& c- G" {! j/ N1 w0 |
  15.    Dim Chgset As Boolean
    ( s6 q1 ?% P5 \4 t
  16.    '陷阱测试,VBProject.Protection在这儿并无实际的意义
    # U5 m; i; B, ?& Q4 D# x
  17.    Debug.Print ThisWorkbook.VBProject.Protection
    / L: J2 n8 d; J  S; W7 |+ A# u& l
  18.    If Err.Number = 1004 Then# ^% N4 C- _, R& n/ N$ g8 b( _
  19.      Err.Clear: \; z0 w0 I5 g4 P
  20.      Application.SendKeys "%TMS%T%V{ENTER}"
    " k( m& h1 o) s! z6 ^+ B
  21. Chgset = True
    8 s' k$ U0 W. H' a  w
  22. DoEvents
    1 X9 Z$ Z! N( d2 Q5 X+ l
  23.    End If" r  f/ u, L/ K: y5 y
  24.    '执行升级操作:$ _& Q- s" S5 u" t% y
  25. Dim vbCmp As VBComponent
    9 z, R4 R6 i! C3 ^  A& A+ u% H" j2 E
  26. Dim fname As String
    8 I7 ~2 i9 A4 F, F; e) {. ~
  27.    For Each vbCmp In ThisWorkbook.VBProject.VBComponents
    % @+ }" u, N. {9 Z9 d* r$ O  S6 Y
  28.      If vbCmp.Type = vbext_ct_MSForm Then 'ThisWorkbook.VBProject.VBComponents.Remove vbCmp; d6 H8 i% q7 f( y  G$ G
  29.      fname = vbCmp.Name
    ( {3 z) {6 `  q+ _+ B& b
  30.      If Dir("共享路径" & fname & ".frm") <> "" Then
    - l0 k  T  \5 L7 Z4 m- I
  31.      Application.VBE.ActiveVBProject.VBComponents.Remove ThisWorkbook.VBProject.VBComponents(fname)3 ~: M: R4 s9 C; a( G0 O! I
  32.      Application.VBE.ActiveVBProject.VBComponents.Import "共享路径"  & fname & ".frm", F: Z5 F; A( |  q( c7 k
  33.      End If5 P" `( s( L3 k9 i; `& a
  34.      End If
    & ]. T. W) ^, u. Q% x9 i# A1 Y7 _
  35.    Next vbCmp
    " ~, T4 y" j. b4 }% {7 g: H
  36.    MsgBox "升级完成"
    8 @% H- c+ E9 f( P
  37.    
    2 @9 v9 [  o& S$ [
  38.    '操作完成后还原操作前的状态: j! n. w4 t2 E6 L! I
  39. Application.ScreenUpdating = True
    - s7 s) f4 h, Y2 v/ V' q& K4 A2 J
  40. If Chgset Then Application.SendKeys "%TMS%T%V{ENTER}"8 A! j& e( @% L- X/ b) E7 Y
  41. End Sub$ x( l" d- J6 \( C! i
复制代码
当然了,这里是直接开始升级了,如果需要,加上个升级文件是否存在的判断也行。
新大榭Python学习社区培训、Excel业务指导、办公软件定制、网站建设;新大榭探索实验室欢迎您!http://lab.daxie.net.cn/
Q群推荐 大榭本地求职招聘QQ群,欢迎转发分享本地招聘信息资讯! 官方招聘1群(已满);官方招聘2群:315816937 *
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-4-13 11:04 , Processed in 0.082190 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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