ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: yuanzhuping

VBA常用技巧代码解析

    [复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-2-25 07:58 | 显示全部楼层

第3部分 Wordbook(工作簿)对象

本帖已被收录到知识树中,索引项:开发帮助和教程
技巧48         保存指定工作表为工作簿文件
       如果需要将工作簿中的工作表单独保存为一个工作簿文件,可以使用Worksheet对象的Copy方法,将指定的工作表复制到一个新建的工作簿,如下面的代码所示。
  1. #001  Sub SheetCopy()
  2. #002      On Error GoTo line
  3. #003      ActiveSheet.Copy
  4. #004      ActiveWorkbook.Close SaveChanges:=True, Filename:=ThisWorkbook.Path & "\SheetCopy.xls"
  5. #005      Exit Sub
  6. #006  line:
  7. #007      ActiveWorkbook.Close False
  8. #008  End Sub
复制代码
代码解析:
       SheetCopy过程将活动工作表单独保存为一个工作簿文件。
       第2行代码错误处理语句。备份过程中,如果已存在同名工作簿,会出现如图所示的提示,如果选择了“否”或“取消”,此时新工作簿已经建立,在执行4行代码时发生错误,使程序中断,所以使用GoTo语句执行第7行代码,关闭新建立的工作簿并且不保存。
Snap1.jpg
       第3行代码使用Copy方法新建一个工作簿,新工作簿中包含复制的工作表。应用于Worksheet对象的Copy方法将指定工作表复制到工作簿的另一位置,语法如下:
Copy (Before, After)
       其中,参数Before是可选的,用来指定工作表,复制的工作表将置于此工作表之前。参数After是可选的,用来指定工作表,复制的工作表将置于此工作表之后。
       不能同时指定Before参数和After参数。当Copy方法省略参数时,应用程序将新建一个空工作簿(新建工作簿将成为活动窗口),并将Copy方法引用的工作表复制到该空工作簿中。
       第4行代码使用Workbook对象的Close方法关闭新建的工作簿。应用于Workbooks集合和Workbook对象的Close方法请参阅技巧45-1。
       如果需要将工作簿中的几个工作表单独保存为一个工作簿文件时,可以以数组的形式指定要复制的工作表,如下面的代码所示。
  1. #001  Sub ArrSheetCopy()
  2. #002      On Error GoTo line
  3. #003      Worksheets(Array("Sheet1", "Sheet2")).Copy
  4. #004      ActiveWorkbook.SaveAs Filename:=ThisWorkbook.Path & "\ArrSheetCopy.xls"
  5. #005      ActiveWorkbook.Close SaveChanges:=True
  6. #006      Exit Sub
  7. #007  line:
  8. #008      ActiveWorkbook.Close False
  9. #009  End Sub
复制代码
代码解析:
       ArrSheetCopy过程将“Sheet1”和“Sheet2”工作表单独保存为一个工作簿文件。
       第4行代码使用SaveAs方法保存活动工作簿,关于SaveAs方法请参阅技巧47-2。

[ 本帖最后由 yuanzhuping 于 2009-3-13 17:17 编辑 ]

技巧48 保存指定工作表为工作簿文件.rar

16.1 KB, 下载次数: 1858

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2009-2-25 12:28 | 显示全部楼层
天啊,太博大精深了,光看标题就另我头晕眼花的了

TA的精华主题

TA的得分主题

发表于 2009-2-25 13:15 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2009-2-25 13:45 | 显示全部楼层
VBA资料 正好现在学习,谢谢班主

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-2-25 15:25 | 显示全部楼层

第3部分 Wordbook(工作簿)对象

技巧49         打印预览时不触发事件
       在工作表打印之前或进行打印预览时,会触发工作簿的BeforePrint事件。在某些情况下希望在打印预览时能禁止触发该事件,例如如图所示的工作表中,用户在打印时使用下面的代码将流水号的数值自动加1。
  1. #001  Private Sub Workbook_BeforePrint(Cancel As Boolean)
  2. #002      Sheet1.Range("J1") = Sheet1.Range("J1") + 1
  3. #003  End Sub
复制代码
Snap1.jpg
       但是在打印预览时并不希望流水号的数值自动加1,此时,需要修改系统的打印预览功能,如下面的代码所示。
  1. #001  Private Sub Workbook_Open()
  2. #002      Dim CmdCtrls As CommandBarControls
  3. #003      Dim Cmd As CommandBarControl
  4. #004      Set CmdCtrls = Application.CommandBars.FindControls(ID:=109)
  5. #005      For Each Cmd In CmdCtrls
  6. #006          Cmd.OnAction = "ThisWorkbook.MyPrint"
  7. #007      Next
  8. #008  End Sub
复制代码
代码解析:
       工作簿的Open事件过程,在打开工作簿时,修改系统中所有打印预览命令按钮和菜单项的动作,指定其OnAction属性为ThisWorkbook代码窗口中的公用过程MyPrint。
       第4行代码使用FindControls方法将所有打印预览命令按钮和菜单项赋给变量CmdCtrls,FindControls方法返回符合指定条件的CommandBarControls集合,语法如下:
expression.FindControls(Type, Id, Tag, Visible)
       其中参数expression是必需的,该表达式返回一个CommandBars集合。
       参数Id是可选的,要查找控件的标识符。打印预览命令控件的标识符为109。
       第5行到第7行代码遍历所有打印预览命令控件,指定其OnAction属性为ThisWorkbook代码窗口中的公用过程MyPrint。OnAction属性返回或设置一个Visual Basic 的过程名,该过程在用户单击或更改某命令栏控件的值时运行。
MyPrint过程代码如下:
  1. #001  Public Sub MyPrint()
  2. #002      With Application
  3. #003          .EnableEvents = False
  4. #004          .ActiveSheet.PrintPreview EnableChanges:=False
  5. #005          .EnableEvents = True
  6. #006      End With
  7. #007  End Sub
复制代码
代码解析:
       MyPrint过程通过禁止对象事件,使工作表打印预览时不触发工作簿的BeforePrint事件。
       第3行代码将Application对象的EnableEvents属性设置为False,禁用事件,使事件不能触发。
       第4行代码使用PrintPreview方法对工作表执行打印预览。PrintPreview方法以打印效果显示指定的对象,该方法只有一个参数EnableChanges,用来指定是否可以修改页面设置,当其值为False时,禁止在打印预览时修改页面设置,默认值为True。
       第5行代码将Application对象的EnableEvents属性设置为True,启用事件。
       为了在工作簿时恢复默认的打印预览设置,在ThisWorkbook代码窗口写入以下代码:
  1. #001  Private Sub Workbook_BeforeClose(Cancel As Boolean)
  2. #002      Dim CmdCtrls As CommandBarControls
  3. #003      Dim Cmd As CommandBarControl
  4. #004      Set CmdCtrls = Application.CommandBars.FindControls(ID:=109)
  5. #005      For Each Cmd In CmdCtrls
  6. #006          Cmd.OnAction = ""
  7. #007      Next
  8. #008  End Sub
复制代码
代码解析:
       工作簿的BeforeClose事件过程,关闭工作簿时将所有打印预览命令按钮和菜单项的OnAction属性恢复为默认的动作。
       经过以上设置,工作表只有在进行打印时“流水号”数值才自动加1。

[ 本帖最后由 yuanzhuping 于 2009-2-25 17:27 编辑 ]

技巧49 打印预览时不触发事件.rar

9.84 KB, 下载次数: 1499

点评

这个有点复杂,做个记号!  发表于 2011-10-16 11:18

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-2-25 20:34 | 显示全部楼层

第3部分 Wordbook(工作簿)对象

技巧50         设置工作簿文档属性信息
       使用DocumentProperties集合对象的BuiltinDocumentProperties属性可以设置文档的属性信息,如下面的代码所示。
  1. #001  Sub WbBuiltin()
  2. #002      With ThisWorkbook
  3. #003          .BuiltinDocumentProperties("Title") = "Wordbook(工作簿)对象"
  4. #004          .BuiltinDocumentProperties("Subject") = "设置工作簿的文档属性信息"
  5. #005          .BuiltinDocumentProperties("Author") = "yuanzhuping"
  6. #006          .BuiltinDocumentProperties("Company") = "tzzls"
  7. #007          .BuiltinDocumentProperties("Comments") = "工作簿文档属性信息"
  8. #008          .BuiltinDocumentProperties("Keywords") = "Excel VBA"
  9. #009      End With
  10. #010      MsgBox "工作簿文档属性信息设置完毕!"
  11. #011  End Sub
复制代码
代码解析:
       WbBuiltin过程设置代码所在工作簿的属性信息,应用于Workbook对象的BuiltinDocumentProperties属性返回一个DocumentProperties集合,该集合代表指定工作簿的所有内置文档属性,本属性返回的是内置文档属性的整个集合。通过指定属性的名称或集合中的索引号返回集合中的单个成员(一个DocumentProperty对象)。
       第3行代码设置标题,第4行代码设置主题,第5行代码设置作者,第6行代码设置公司,第7行代码设置备注,第8行代码设置关键字。
Snap1.jpg

技巧50 设置工作簿文档属性信息.rar

6.56 KB, 下载次数: 1440

TA的精华主题

TA的得分主题

发表于 2009-2-25 21:11 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

来自菜鸟的问题---禁用工作簿的关闭按钮的请教

各位老师,技巧46         禁用工作簿的关闭按钮。在sheet1中,那个关闭按钮是怎么做出来的?
入门学习时最先学做的是Command Button1 ,触发事件利用单击按钮来触发代码执行程序,但这个例子好像没有Command Button?
请教。。。。。。

TA的精华主题

TA的得分主题

发表于 2009-2-25 21:21 | 显示全部楼层

236楼的一_一 请赐教代码

谢谢236楼的一_一,非常感谢你的分享,能否将代码或是附件传上,以便我这个菜鸟拿回研习?

期待你的恢复-------关于删除所有Sheet1 中的空行。还有,如果我要是再增加一条需求:除了删除整个空行,如果在某一行中在规定列(B列单元格不为空,但该行的其他单元格为空则删除该行)

期待您的回复,等待你的关注。。。。。。。

谢谢。。。。。。

TA的精华主题

TA的得分主题

发表于 2009-2-25 21:51 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2009-2-26 11:37 | 显示全部楼层

回复 95楼 yuanzhuping 的帖子

给我最尊重的版主挑个小瑕疵
版主说:“此方法(Address引用法)只适用于单个单元格或者加上OR运算符可以适用于几个单元格,多则不方便。”,可我发现address属性也可以返回区域名,如A1:B2之类的呀!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-23 07:26 , Processed in 0.049024 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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