excel中使用vba以只读方式打开工作薄的操作方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了excel中使用vba以只读方式打开工作薄的操作方法相关的知识,希望对你有一定的参考价值。

参考技术A

  如何excel中使用vba以只读方式打开工作薄的操作?具体怎么设置的呢?今天,我就教大家在Excel中使用vba以只读方式打开工作薄的操作方法。

   Excel中使用vba以只读方式打开工作薄的操作 步骤如下:

  首先我们打开一个工作样表作为例子。

  我们使用alt+f11组合快捷键进入vbe编辑器,插入一个新的模块,并在模块中输入以下代码:

  Sub openWorkbook2()

  Dim fname As String

  MsgBox "将c盘中的<新建 Microsoft Excel 工作表.xls>工作簿以只读方式打开"

  fname = "C:\\Users\\john\\Desktop\\新建 Microsoft Excel 工作表.xlsx"

  Workbooks.Open Filename:=fname, ReadOnly:=True

  End Sub

  以只读模式打开的工作表可以编辑,但是不能保存,可以另存为其他的文件,这样的一种操作限制可以很安全的保护原有文档。可以编辑的文档文档标题栏是如图所示的。

  而以只读方式打开的excel工作薄却是显示了只读的提示字样。

  我们这里对工作薄workbooks对象使用了open方法,来打开一个变量声明将路径文件名赋予的fname变量。并且,设置其为只读方式打开。filename和readonly均是open方法的参数。其中filename参数是必须的。

Excel VBA入门操作工作薄

虽然我前面讲过,在VBA中操作工作薄并不是件明智的事,但有些时候,还是避免不了要这么做。绝大多数情况下,我们要做的是获取到某个工作薄对象,并以此来获得其中的工作表对象,然后再对工作表中的数据进行处理。而后面这一部分(操作工作表)在前面已经讲过了,所以本章只讲如何在VBA中打开、关闭工作薄,以及介绍两个常用的工作薄对象。在VBA中打开工作薄有两种方法:显式打开及隐式打开。

1. 显式打开

显式打开即跟我们手动双击打开一个Excel文件一样,可以看到工作薄的内容,可以在里面进行各种操作。代码及示例如下:

Sub workbook_operate()

    \' 定义工作薄对象
    Dim wbk As Workbook
    Dim fname As String
    
    fname = "E:/temp/test.xlsx"
    \' 根据工作薄文件路径打开工作薄
    Set wbk = Application.Workbooks.Open(Filename:=fname)
    MsgBox fname & "已打开"
    \' 关闭工作薄
    wbk.Close
End Sub

结果如下:

然后就可以根据这个workbook对象(示例中的wbk变量)来获取到其中的工作表:

Set parameter_sht = wbk.Worksheets("Parameter")

或者取得这个工作薄的一些属性:

wbk.Name

最后可以使用Close方法来关闭这个工作薄:

wbk.Close

2. 隐式打开

使用隐式打开的时候,这个工作薄在前端是看不到的,只有在VBE环境中(的工程窗口)可以看到它。示例代码及结果如下:

Sub workbook_operate()

    \' 定义工作薄对象
    Dim wbk As Workbook
    Dim fname As String
    
    fname = "E:/temp/test.xlsx"
    \' 根据工作薄文件路径获取工作薄对象
    Set wbk = GetObject(fname)
    Debug.Print wbk.Name

End Sub

与显式打开不同的是,这是使用了GetObject方法。结果如下:

可以在VBE的工程窗口(上图左侧)中看到有一个新的工项目被加载了。但此时是并不能看到有一个Excel文件被打开的,这个已经被VBA隐式打开的文件,只能使用VBA进行操作,在使用上与显式打开后得到的workbook对象没什么区别,如获取其中的工作表对象、获取它的名字、关闭它等,都是一样的。这里就不举例了。

3. 创建工作薄

通常流程是:创建工作薄、给默认的工作表(Sheet1)改名、写数据、保存工作薄。代码如下:

Dim tmp_wbk as Workbook
Dim tmp_sht as Worksheet

Set tmp_wbk = Application.Workbooks.Add     \' 创建工作薄
Set tmp_sht = tmp_wbk.Worksheets("Sheet1") 
tmp_sht.Name = "abcde"                      \' 给工作表改名
tmp_wbk.Close SaveChanges:=True, Filename:="abcde1.xlsx"    \' 保存文件

4. 关闭

无论是显式打开还是隐式打开,如果在新打开的工作薄中有更改,在使用workbook.Close方法时,会有个弹窗提示是否要保存更改,就跟我们平时使用时一样:

又或者被打开的工作薄里面有些公式,在打开这个工作薄时公式结果变了(其实也等于是有更新了),在关闭时都会出现这个提示。如果可以确定是否需要更改,可以在保存时加入相应的参数SaveChanges

wbk.Close SaveChanges:=False

SaveChanges等于False时即为不保存,等于True时即为保存

5. ThisWorkbook与ActiveWorkbook

ThisWorkbook对象是VBA顶级对象Application下的一个特殊对象,代表当前(VBA代码所在的)工作薄对象。

ActiveWorkbook对象也是VBA顶级对象Application下的一个特殊对象,代表当前激活的工作薄对象。

就跟我们在使用QQ聊天时一样,我们不可能同时单独地发信息给两个不同的QQ好友,只能有一个聊天窗口是被激活的。Excel也一样,当前被激活的工作薄就是ActiveWorkbook对象(同样类似地,也有ActiveWorksheet对象)。

有些情况下,ThisWorkbook等同于ActiveWorkbook,但有些情况下并不是的。如以下代码:

Sub workbook_operate()

    \' 定义工作薄对象
    Dim wbk As Workbook
    Dim fname As String
    
    fname = "E:/temp/ActiveMe.xlsx"
    \' 根据工作薄文件路径获取工作薄对象
    Set wbk = Workbooks.Open(fname)
  
    Debug.Print ThisWorkbook.Name
    Debug.Print ActiveWorkbook.Name
End Sub

运行结果:

因为新打开的工作薄会被处于激活状态(就跟手工打开另一个Excel文件一样),所以这时新打开的ActiveMe.xlsx才是ActiveWorkbook,而当前代码所在的工作薄(test.xlsm)则是ThisWorkbook。而如果只有一个工作薄被打开或者是当前代码所在工作薄处于激活状态时,则ThisWorkbook和ActiveWorkbook是同一个对象。


本系列教程其它文章

Excel VBA 入门(零)
Excel VBA 入门(一)数据类型
Excel VBA 入门(二)数组和字典
Excel VBA 入门(三) 流程控制1-条件选择
Excel VBA 入门(四)流程控制2-循环控制
Excel VBA 入门(五)Excel对象操作
Excel VBA 入门(六)过程和函数
Excel VBA 入门(七)注释、宏按钮及错误处理
Excel VBA 入门(八)单元格边框
Excel VBA 入门(九)操作工作薄
Excel VBA 入门(十)用户窗体开发

以上是关于excel中使用vba以只读方式打开工作薄的操作方法的主要内容,如果未能解决你的问题,请参考以下文章

在 VBA 中使用 SQL 连接两个 Excel 工作簿中的数据(只读错误)

VBA 打开工作簿错误?

从在 Access 中以编程方式打开的 Excel 工作表中删除受保护的视图

从 Access VBA 编辑打开的 Excel 工作表

Excel VBA入门操作工作薄

使用 VBA 将 MS Access 记录集导出到 Excel 中的多个工作表/选项卡会生成只读文件