6 Workbook 对象
6.1 在奔跑之前先学会走路:打开和关闭工作薄
代码清单6.1:一个完整的工作薄批处理框架
'代码清单6.1:一个完整的工作薄批处理框架
Sub ProcessFileBatch()
Dim nIndex As Integer
Dim vFiles As Variant
Dim wb As Workbook
Dim bAlreadyOpen As Boolean On Error GoTo ErrHandler 'Get a batch of Excel files
vFiles = GetExcelFiles("Select Workbooks for Processing" ) 'Make sure the dialog wasn't cancelled - in which case
'vFiles would equal False and therefore wouldn't be an array.
If Not IsArray(vFiles) Then
Debug.Print "No files Selected."
Exit Sub
End If Application.ScreenUpdating = False 'OK - loop through the filenames
For nIndex = To UBound (vFiles) If isWorkbookOpen(CStr(vFiles(nIndex))) Then
Set wb = Workbooks(GetShortName(CStr (vFiles(nIndex))))
Debug.Print "workbook already open: " & wb.Name
bAlreadyOpen = True Else
Set wb = Workbooks.Open(CStr(vFiles(nIndex)), False )
Debug.Print "Opened workbook: " & wb.Name
bAlreadyOpen = False End If Application.StatusBar = "processing workbook: " & wb.Name 'code to process the file goes here
Debug.Print "if we wanted to do something to the workbook, we would do it here" 'close workbook unless it was already open
If Not bAlreadyOpen Then
Debug.Print "closing workbook: " & wb.Name
wb.Close True
End If
Next nIndex Set wb = Nothing
ErrHandler:
Application.StatusBar = False
Application.ScreenUpdating = True End Sub
6.2 工作薄打开了吗
代码清单6.2:查看一个工作薄是否是打开的
'代码清单6.2: 查看一个工作薄是否是打开的
' This function checks to see if a given workbook
' is open or not. this function can be used
' using a short name such as MyWorkbook.xls
' or a full name such as C: \Testing\MyWorkbook.xls
Function isWorkbookOpen(sWorkbook As String) As Boolean
Dim sName As String
Dim sPath As String
Dim sFullName As String On Error Resume Next
isWorkbookOpen = True 'see if we were given a short name or a long name
If InStr(, sWorkbook, "\", vbTextCompare) > Then
'we have a long name need to break it down
sFullName = sWorkbook 'BreakdownName参见代码清单5.8
BreakdownName sFullName, sName, sPath
If StrComp(Workbooks(sName).FullName, sWorkbook, vbTextCompare) <> Then
isWorkbookOpen = False
End If
Else
'we have a short name
If StrComp(Workbooks(sWorkbook).Name, sWorkbook, vbTextCompare) <> Then
isWorkbookOpen = False
End If
End If End Function
另一个IsWorkbookOpen:
Function IsWorkbookOpen(sWorkbookName AsString) As Boolean
Dim wb As Workbook IsWorkbookOpen = False
For Each wb In Workbooks
If StrComp(sWorkbookName, wb.Name, vbTextCompare) = Then
IsWorkbookOpen = True
Exit Function
End If
Next
Set wb =Nothing
End Function
三个VBA字符串函数:
InStr([start, ]string1, string2[, compare]): 指出string2在string1中第一次出现的位置。
InStrRev(string1, string2[, compare]): 指出string2在string1中最后一次出现的位置。
StrComp(string1, string2[, compare]): 比较两个字符串,返回-1、0、1中的值。
说明:
VBA中,字符串的索引是基于0的。
compare可以取值vbTextCompare或者vbBinaryCompare,前者表示不区分大小写,后者表示区分大小写。compare的默认值为vbUseCompareOption,就是取模块选项的设置。
6.2.1 指定特定的集合对象
下面的例子示范了可以指向集合中的一个项目的4种方法。这个例子使用Worksheets集合对象。
Sub ReferringToItems()
'refer to a worksheet by index number
Debug.Print ThisWorkbook.Worksheets( ).Name
'once again, but with feeling
Debug.Print ThisWorkbook.Worksheets.Item( ).Name 'refer to a worksheet by name
Debug.Print ThisWorkbook.Worksheets("Sheet1" ).Name
'and gain using item ...
Debug.Print ThisWorkbook.Worksheets.Item("Sheet1" ).Name End Sub
6.3以编程方式解开链接(第1部分)
代码清单6.3:以程序设计方式得到链接资源信息
'代码清单6.3:以程序设计方式得到链接资源信息
Sub PrintSimpleLinkInfo(wb As Workbook)
Dim avLinks As Variant
Dim nIndex As Integer 'get list of excel based link sources
avLinks = wb.LinkSources(xlExcelLinks)
If Not IsEmpty(avLinks) Then
'loop through every link source
For nIndex = To UBound (avLinks)
Debug.Print "link found to '" & avLinks(nIndex) & "'"
Next nIndex
Else
Debug.Print "the workbook '" & wb.Name & "' don't have any links."
End If End Sub
代码清单6.4:用新的文件位置更新链接
'代码清单6.4: 用新的文件位置更新链接
Sub fixLinks(wb As Workbook, sOldLink As String, sNewLink As String )
On Error Resume Next
wb.ChangeLink sOldLink, sNewLink, xlLinkTypeExcelLinks End Sub
代码清单6.5:用新的文件位置更新链接(一个替代过程)
'代码清单6.5: 用新的文件位置更新链接—一个替代过程
Sub FixLinksII(wb As Workbook, sOldLink As String, sNewLink As String )
Dim avLinks As Variant
Dim nIndex As Integer 'get a list of link sources
avLinks = wb.LinkSources(xlExcelLinks) 'if there are link sources, see if there are any named sOldLink
If Not IsEmpty(avLinks) Then
For nIndex = To UBound (avLinks)
If StrComp(avLinks(nIndex), sOldLink, vbTextCompare) = Then
'we have a match
wb.ChangeLink sOldLink, sNewLink, xlLinkTypeExcelLinks
'once we find a match we won't find another, so exit the loop
Exit For
End If
Next
End If End Sub
代码清单6.6:链接状态查看器
'代码清单6.6: 链接状态查看器
Function GetLinkStatus(wb As Workbook, sLink As String) As String
Dim avLinks As Variant
Dim nIndex As Integer
Dim sResult As String
Dim nStatus As Integer 'get a list of link sources
avLinks = wb.LinkSources(xlExcelLinks) 'make sure there are links in the workbook
If IsEmpty(avLinks) Then
GetLinkStatus = "No links in workbook."
Exit Function
End If 'default result in case the links is not found
sResult = "link not found" For nIndex = To UBound (avLinks)
If StrComp(avLinks(nIndex), sLink, vbTextCompare) = Then
nStatus = wb.LinkInfo(sLink, xlLinkInfoStatus) Select Case nStatus
Case xlLinkStatusCopiedValues
sResult = "Copied values" Case xlLinkStatusIndeterminate
sResult = "Indeterminnate" Case xlLinkStatusInvalidName
sResult = "Invalid name" Case xlLinkStatusMissingFile
sResult = "Missing file" Case xlLinkStatusMissingSheet
sResult = "Missing sheet" Case xlLinkStatusNotStarted
sResult = "Not started" Case xlLinkStatusOK
sResult = "OK" Case xlLinkStatusOld
sResult = "Old" Case xlLinkStatusSourceNotCalculated
sResult = "Source Not Calculated" Case xlLinkStatusSourceNotOpen
sResult = "Source Not Open" Case xlLinkStatusSourceOpen
sResult = "Source Open" Case Else
sResult = "Unknown status code"
End Select
End If
Next End Function
代码清单6.7:查看一个工作薄中所有的链接状态
'代码清单6.7: 查看一个工作薄中所有的链接状态
Sub CheckAllLinks(wb As Workbook)
Dim avLinks As Variant
Dim nLinkIndex As Integer
Dim sMsg As String avLinks = wb.LinkSources(xlExcelLinks) If IsEmpty(avLinks) Then
Debug.Print wb.Name & " does not have any links."
Else
For nLinkIndex = To UBound (avLinks)
Debug.Print "workbook: " & wb.Name
Debug.Print "link source: " & avLinks(nLinkIndex)
Debug.Print "status: " & GetLinkStatus(wb, CStr (avLinks(nLinkIndex)))
Next
End If End Sub
6.4 简单普通的工作薄属性
代码清单6.8:一个标准工作薄属性的简单例子
'代码清单6.8: 一个标准工作薄属性的简单例子
Sub TestPrintGeneralWBInfo()
PrintGeneralWorkbookInfo ThisWorkbook
End Sub Sub PrintGeneralWorkbookInfo(wb As Workbook)
Debug.Print "Name: " & wb.Name
Debug.Print "Full Name: " & wb.FullName
Debug.Print "Code Name: " & wb.CodeName
Debug.Print "File Format: " & GetFileFormat(wb)
Debug.Print "path: " & wb.Path If wb.ReadOnly Then
Debug.Print " the workbook has been opened as read-only."
Else
Debug.Print " the workbook is read-write."
End If If wb.Saved Then
Debug.Print "the workbook does not need to be saved."
Else
Debug.Print " the workbook should be saved."
End If
End Sub Function GetFileFormat(wb As Workbook) As String
Dim lFormat As Long
Dim sFormat As String
lFormat = wb.FileFormat
Select Case lFormat
Case xlAddIn: sFormat = "Add-In" Case xlCSV: sFormat = "CSV"
Case xlCSVMac: sFormat = "CSV Mac"
Case xlCSVMSDOS: sFormat = "CSV MSDOS"
Case xlCSVWindows: sFormat = "CSV Windows" Case xlCurrentPlatformText: sFormat = "Current Platform Text" Case xlDBF2: sFormat = "DBF 2"
Case xlDBF3: sFormat = "DBF 3"
Case xlDBF4: sFormat = "DBF 4" Case xlDIF: sFormat = "xlDIF"
Case xlExcel2: sFormat = "xlExcel2"
Case xlExcel2FarEast: sFormat = "xlExcel2FarEast"
Case xlExcel3: sFormat = "xlExcel3"
Case xlExcel4: sFormat = "xlExcel4"
Case xlExcel4Workbook: sFormat = "xlExcel4Workbook"
Case xlExcel5: sFormat = "xlExcel5"
Case xlExcel7: sFormat = "xlExcel7"
Case xlExcel9795: sFormat = "xlExcel9795" Case xlHtml: sFormat = "xlHtml"
Case xlIntlAddIn: sFormat = "xlIntlAddIn"
Case xlSYLK: sFormat = "xlSYLK"
Case xlTemplate: sFormat = "xlTemplate"
Case xlTextMac: sFormat = "xlTextMac"
Case xlTextMSDOS: sFormat = "xlTextMSDOS"
Case xlTextPrinter: sFormat = "xlTextPrinter"
Case xlTextWindows: sFormat = "xlTextWindows"
Case xlUnicodeText: sFormat = "xlUnicodeText"
Case xlWebArchive: sFormat = "xlWebArchive"
Case xlWJ2WD1: sFormat = "xlWJ2WD1"
Case xlWJ3: sFormat = "xlWJ3"
Case xlWJ3FJ3: sFormat = "xlWJ3FJ3" Case xlWK1: sFormat = "xlWK1"
Case xlWK1ALL: sFormat = "xlWK1ALL"
Case xlWK1FMT: sFormat = "xlWK1FMT"
Case xlWK3: sFormat = "xlWK3"
Case xlWK3FM3: sFormat = "xlWK3FM3"
Case xlWK4: sFormat = "xlWK4"
Case xlWKS: sFormat = "xlWKS"
Case xlWorkbookNormal: sFormat = "xlWorkbookNormal"
Case xlWorks2FarEast: sFormat = "xlWorks2FarEast"
Case xlWQ1: sFormat = "xlWQ1"
Case xlXMLSpreadsheet: sFormat = "xlXMLSpreadsheet" Case Else
sFormat = "Unknown format code"
End Select
GetFileFormat = sFormat
End Function
6.5 响应用户动作事件
代码清单6.9:测试Workbook对象事件
Private Sub Workbook_Activate()
If UseEvents Then
MsgBox "Welcome back! ", vbOKOnly, "Activate Event"
End If
End Sub Private Sub Workbook_BeforeClose(Cancel As Boolean )
Dim lResponse As Long If UseEvents Then
lResponse = MsgBox("Thanks for visiting!" & "Are you sure you don't want to stick around?", vbYesNo, "see ya.." )
End If
End Sub Private Sub Workbook_Deactivate()
If UseEvents Then
MsgBox "see you soon...", vbOKOnly, "Deactivate Event"
End If
End Sub Private Sub Workbook_Open()
Dim lResponse As Long
lResponse = MsgBox("Welcome to the Chapter Six Example Workbook! Would you like to use events?", vbYesNo, "Welcome" ) If lResponse = vbYes Then
TurnOnEvents True
ElseIf lResponse = vbNo Then
TurnOnEvents False
End If
End Sub Private Sub TurnOnEvents(bUseEvents As Boolean)
On Error Resume Next
If bUseEvents Then
ThisWorkbook.Worksheets().Range("TestEvents").Value = "Yes"
Else
ThisWorkbook.Worksheets().Range("TestEvents").Value = "No"
End If
End Sub Private Function UseEvents() As Boolean
On Error Resume Next UseEvents = False
If UCase(ThisWorkbook.Worksheets().Range("TestEvents").Value) = "YES" Then
UseEvents = True
End If
End Function Private Sub Workbook_SheetActivate(ByVal Sh As Object)
If UseEvents Then
MsgBox "Activated " & Sh.Name, vbOKOnly, "SheetActivate Event"
End If
End Sub Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean )
If UseEvents Then
MsgBox "Ouch! Stop that.", vbOKOnly, "SheetBeforeDoubleClick Event"
End If
End Sub Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean )
If UseEvents Then
MsgBox "Right click " & Sh.Name & "; Target " & Target.Address & "; Cancel " & Cancel, vbOKOnly, "RightClick Event"
End If
End Sub Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
If UseEvents Then
MsgBox "You change the range" & Target.Address & " on " & Sh.Name, vbOKOnly, "Workbook_SheetChange Event"
End If
End Sub Private Sub Workbook_SheetDeactivate(ByVal Sh As Object )
If UseEvents Then
MsgBox "Leaving " & Sh.Name, vbOKOnly, "Workbook_SheetDeactivate Event"
End If
End Sub Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
If UseEvents Then
If Target.Row Mod = Then
MsgBox "I'm keeping my eyes on you! you selected the range " & Target.Address & " on " & Sh.Name, _
vbOKOnly, "Workbook_SheetSelectionChange Event"
Else
MsgBox "you selected the range " & Target.Address & " on " & Sh.Name, _
vbOKOnly, "Workbook_SheetSelectionChange Event"
End If
End If
End Sub
6 Workbook 对象的更多相关文章
- Workbook对象的方法总结(一)
import openpyxlwb=openpyxl.Workbook()print('1.添加前所有工作簿的名称是:',wb.get_sheet_names())wb.create_sheet('F ...
- 【VBA编程】13.Workbook对象的事件
Workbook事件用于响应对Workbook对象所进行的操作. [BeforeClose事件] BforeClose事件用于响应窗口关闭的操作 在工程资源器中,双击“ThisWorkbook”对象, ...
- Workbook对象的方法总结(二)
(1).Worksheet 对象有 row_dimensions 和 column_dimensions 属性,控制行高和列宽. 例如: >>> sheet.row_dimensio ...
- 【VBA编程】12.Workbook对象常用属性
[ActiveSheet属性] ActiveSheet属性用于返回一个对象,表示活动工作簿中或指定的窗口或工作簿中的活动工作表 [Colors] Colors属性是一个Variant类型的可读写属性, ...
- POI完美解析Excel数据到对象集合中(可用于将EXCEL数据导入到数据库)
实现思路: 1.获取WorkBook对象,在这里使用WorkbookFactory.create(is); // 这种方式解析Excel.2003/2007/2010都没问题: 2.对行数据进行解析 ...
- 电子表格控件Spreadsheet 对象方法事件详细介绍
1.ActiveCell:返回代表活动单元格的Range只读对象.2.ActiveSheet:返回代表活动工作表的WorkSheet只读对象.3.ActiveWindow:返回表示当前窗口的Windo ...
- Excel 文件转 JSON格式对象
将导入的如图所示格式的城乡区划代码的excel文件整理成json格式的对象储存在js文件中: var PROJECTDISTRICTDATA=[ { "name" ...
- NPOI:创建Workbook和Sheet
NPOI官方网站:http://npoi.codeplex.com/ 创建Workbook说白了就是创建一个Excel文件,当然在NPOI中更准确的表示是在内存中创建一个Workbook对象流.在看了 ...
- java excel Workbook API
此文摘自:http://blog.sina.com.cn/zenyunhai 1. int getNumberOfSheets() 获得工作薄(Workbook)中工作表(Sheet)的个数,示例: ...
随机推荐
- 微信小程序 设置计时器(setInterval)、清除计时器(clearInterval)
1.wxml代码 <!--index.wxml--> <view class="container"> <button type='primary' ...
- 在git提交时忽略已提交过或从线上拉取下来但本地已修改的文件
一.忽略: git update-index --assume-unchanged [file-path] 命令中的file-path 就是需要忽略提价的文件的路径 例子: git update-in ...
- Python:socket实现ftp程序
刚开始学习socket编程,还不是特熟练,码了好长时间,中间遇到许多问题,记录一下用socketserver写ftp server端: #!/usr/bin/env python import soc ...
- CentOS7 Failed to start LSB: Bring up/down解决方法(真正有效的方法)
刚刚装好的虚拟机突然不能上网了,报错很诡异,具体报错如下: /etc/init.d/network restart Restarting network (via systemctl): Job f ...
- MySQL MGR源码分析2 - 从start group_replication看MGR代码框架
此文已由作者温正湖授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 上一篇我们从方案层面讲解了MGR的成员管理和故障恢复.本篇从源码层面捋一捋,通过本篇介绍,除了能够了解如何将 ...
- html的href标签不能下载apk文件
解决方案: 打开Internet 服务管理器Internet 服务管理器 网站属性 HTTP头(MIME类型) 新建 扩展名:.apk 类型(MIME): application/vnd.androi ...
- ORACLE审计小结
ORACLE审计小结 1.什么是审计 审计(Audit)用于监视用户所执行的数据库操作,并且Oracle会将审计跟踪结果存放到OS文件(默认位置为$ORACLE_BASE/admin/$ORACLE_ ...
- [BZOJ1138][POI2009]Baj 最短回文路
[BZOJ1138][POI2009]Baj 最短回文路 试题描述 N个点用M条有向边连接,每条边标有一个小写字母. 对于一个长度为D的顶点序列,回答每对相邻顶点Si到Si+1的最短回文路径. 如果没 ...
- POJ 3518 (后缀自动机)
POJ 3518 Boring Problem : 给一个串S,询问串S有多个子串出现至少两次且位置不重叠. Solution : 对S串建立后缀自动机,再建立后缀树,dfs一遍统计处每个结点的子树中 ...
- IE11 文档模式空白
环境描述: win7 64位系统 安装了 更新 IE11-Windows6.1-KB2929437-x64.IE11-Windows6.1-KB3008923-x64 解决方案: 卸载 IE11-Wi ...