从 Word VBA 编辑工作簿(无论打开还是关闭)

2024-03-31

我正在尝试在 Word 中编写宏,以便可以将一些信息保存到计算机其他位置的 Excel 文件中。为此我写了这个:

Dim exlApp As Object
Dim exlWbk As Object
Set exlApp = CreateObject("Excel.Application")
Set exlWbk = exlApp.Workbooks.Open(FileName:="D:\database.xlsx")
exlWbk.ActiveSheet.Cells(1, 1).Value = "some info"
exlWbk.Close SaveChanges:=True
Set exlWbk = Nothing
exlApp.Quit
Set exlApp = Nothing

该代码对我来说工作得很好,除非用户已经打开了相关的 Excel 文件 (database.xlsx)。在这种情况下,运行宏将提示我将新更改保存到 Excel 文件的新副本中,这不是我想要的。我希望将新更改包含在当前 Excel 文件中,而不创建它的第二个副本。

由于上面的代码存在一些问题,我这样写:

Dim exlApp As Object
Dim exlWbk As Object
Set exlApp = CreateObject("Excel.Application")
Set exlWbk = exlApp.GetObject("D:\database.xlsx")
exlWbk.ActiveSheet.Cells(1, 1).Value = "some info"
exlWbk.Save
Set exlWbk = Nothing
exlApp.Quit
Set exlApp = Nothing

但一切都没有改变。我知道有一些方法可以确定我的 Excel 文件是否打开,但问题是,如果我发现该文件已打开,我不知道如何更改我的代码。

如何确定工作簿是否在 Excel 中打开以便可以对其进行编辑,或者如果文件已关闭则打开该文件以便对其进行编辑?


根据文档 https://learn.microsoft.com/en-us/office/vba/language/reference/user-interface-help/getobject-function, GetObject(filename)如果现有文件已打开,则将拾取该文件;如果文件未打开,则可以选择打开该文件:

当执行此代码时,与该关联的应用程序 启动指定路径名,指定文件中的对象 活性。

如果 Excel 未运行,则默认情况下什么都看不到GetObject(filename)执行。 Excel 将被打开,文件将被打开并更改。因此,存在一个真正的危险,即 Excel 实例和工作簿将“挂起”在内存中,这可以在 Windows“任务管理器”中看到。重复运行此类代码最终可能会使 Windows 崩溃,因此必须小心在每次迭代时正确清理内容。

由于该问题还规定该文件可能已被用户打开,因此有必要确定这一点以及 Excel 应用程序是否已在运行。

以下代码示例演示了如何完成此操作。假设应用程序和文件都没有打开。然后它测试 Excel 是否已在运行。

Set xlApp = GetObject(, "Excel.Application")

请注意语法上的差异:而不是fileName有一个逗号,后跟应用程序的名称。这将检查应用程序是否可用;如果不是,则会触发错误。所以,On Error Resume Next先于GetObject,这意味着错误将被忽略。

由于忽略错误是危险的,所以下一行Or Error GoTo 0重新打开错误。

If GetObject不成功,变量xlApp无法实例化,其“值”是Nothing. If Not xlApp Is Nothing执行如果xlApp可以被实例化并且布尔值appAlreadyOpen设置为 true 以便我们知道not代码完成后退出 Excel。它还检查所需的工作簿是否已打开。如果是,xlWb可以实例化并将 fileAlreadyOpened 设置为 true。

If xlWb无法实例化,因为 Excel 应用程序未运行或工作簿尚未打开,GetObject(fileName)被执行。工作簿将在现有 Excel 实例(如果已运行)或新的 Excel 实例中打开。在此代码块的末尾有两行注释:如果新启动的 Excel 应用程序可见并在代码结束时保持打开状态,请取消注释它们。

然后可以编辑工作簿。

最后,事情需要清理。检查布尔值,如果不正确,则关闭工作簿和可能的应用程序。很重要最后两行从内存中释放这些对象。如果代码创建任何其他对象,例如Ranges,这些也应该被释放,按照它们实例化的相反顺序。

Sub GetFileOpenedOrClosed()
    Dim xlApp As Object              ' Excel.Application
    Dim xlWB As Object, wb As Object ' Excel.Workbook
    Dim fileName As String
    Dim fileAlreadyOpen As Boolean, appAlreadyOpen As Boolean

    fileName = "C:\Test\SampleChart.xlsx"
    fileAlreadyOpen = False
    appAlreadyOpen = False
    On Error Resume Next
    Set xlApp = GetObject(, "Excel.Application")
    On Error GoTo 0
    If Not xlApp Is Nothing Then
        appAlreadyOpen = True
        For Each wb In xlApp.Workbooks
            If wb.FullName = fileName Then
                Set xlWB = wb
                fileAlreadyOpen = True
                Exit For
            End If
        Next
    End If
    If xlWB Is Nothing Then
        Set xlWB = GetObject(fileName)
        Set xlApp = xlWB.Application
        xlWB.Windows(1).Visible = True 'So that the window is not hidden when file is opened again
        'xlApp.Visible = True
        'xlApp.UserControl = True
    End If
    xlWB.Worksheets(1).Cells(7, 1).value = "some other info"
    If Not fileAlreadyOpen Then
        xlWB.Save
        xlWB.Close
    End If
    If Not appAlreadyOpen Then
        xlApp.Quit
    End If
    Set xlWB = Nothing
    Set xlApp = Nothing
End Sub
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 Word VBA 编辑工作簿(无论打开还是关闭) 的相关文章

  • 使用 VBA 的下拉菜单

    我需要使用 VBA 从下拉菜单中选择特定选项 我怎样才能做到这一点 链接到我们试图从中提取的网页 IE document getElementsByName down count click 我尝试过的代码 Full Module Priv
  • 在 Excel 表格中选择多列的代码

    我是 Excel VBA 新手 我需要修改我的代码 以便我能够进一步进行 我想在 Excel 表格中选择多个表格列 这是我的代码 Dim ws As Worksheet Dim tbl As ListObject Set ws Sheets
  • VBA Shell 并等待退出代码

    我正在打包一个办公应用程序 VBA 它调用 C 控制台应用程序来执行应用程序 大型模拟程序 的一些繁重工作 我希望能够让 VBA 应用程序等待控制台应用程序完成并从控制台应用程序检索退出代码 我已经能够做到前者 但尚未能够从应用程序中检索退
  • 如何找到特定程序的安装目录?

    我已经成功地编写了一些用于工作的 VBA 宏 这些宏基本上创建了一个数据文件 将其提供给一个程序并对该程序的输出进行后处理 我的问题是程序安装路径是硬编码在宏中的 并且安装在我同事的计算机上可能会有所不同 我首先想到的是 我可以从每个人那里
  • 在合并的单元格中选择、插入照片并将其居中

    我是一名研发面包师 正在为我的团队制作食谱模板 模板中有照片 但我需要轻松地允许他们单击一个按钮 打开照片的文件选择器 然后将该照片放在合并的单元格中 我其实不太擅长做这个 Sub InsertPhotoMacro Dim photoNam
  • Excel FILTER() 对于空白单元格返回 0

    我怀疑以前有人问过这个问题 但我找不到 FILTER 即使指定了返回字符串 通常也会为空白行返回 0 Using filter 我经常收到空单元格的 0 返回值 假设 A 列中有 6 行数据 abc xyz abc xyz abc If I
  • VBA 中 AND 函数如何工作?

    如果这是一个愚蠢的问题 我很抱歉 但是 Excel VBA AND 函数是否检查其中的每个条件然后继续 或者在第一个 FALSE 条件处停止而不检查其他条件 我想知道出于优化目的 但到目前为止在网上没有找到任何相关信息 提前致谢 示例 如果
  • 输入新行并复制上面单元格中的公式

    我正在尝试创建一个 Excel 宏来执行以下操作 在文档末尾输入新行 复制上面单元格中的公式 到目前为止我有这个 Sub New Delta Go to last cell Range A4 Select Selection End xlD
  • 在Excel中,我可以使用超链接来运行vba宏吗?

    我有一个包含多行数据的电子表格 我希望能够单击一个单元格 该单元格将使用该行中的数据运行宏 由于行数总是在变化 我认为每行的超链接可能是最好的方法 ROW MeterID Lat Long ReadX ReadY ReadZ CoeffA
  • 获取当前 VBA 函数的名称

    对于错误处理代码 我想获取发生错误的当前 VBA 函数 或子函数 的名称 有谁知道如何做到这一点 编辑 谢谢大家 我曾希望存在一个未记录的技巧来自行确定函数 但这显然不存在 我想我会保留当前的代码 Option Compare Databa
  • 使用 FindElementbyXpath() 获取 Selenium Basic 中可填充框的行和列名称

    我正在使用 Selenium Basic 将电子表格中的文本填充到网站中 网站的html代码是这样的 div table cellspacing 0 border 1 style width 99 tr th style font weig
  • 在 PYTHON 中读取 EXCEL 时,“utf-16-le”编解码器无法解码字节

    我正在尝试读取不同语言 阿拉伯语 希腊语 意大利语 希伯来语等 的各种数量的 xls 文件 当我尝试调用 open workbook 函数时 出现如下所示的错误 不知道如何将格式设置为任何语言 Code book xlrd open wor
  • Android Excel CSV 的 MIME 数据类型是什么?

    我尝试了 text csv 甚至 application vnd ms excel 但 Excel 不会显示在选择列表中 很多其他应用程序也可以 void shareCsv Uri uri Context context Intent in
  • 无法使用 VBA 代码从 Excel 连接到 Teradata - 无法通过网络访问 Teradata 服务器

    我一直在尝试使用 vba 代码从 Excel 连接到 Teradata 但收到以下错误 无法通过网络访问 Teradata Server 我已经能够从 Teradata SQL 助手成功连接 并且还成功 ping 通 Teradata 服务
  • 根据列值突出显示数据框中的行?

    假设我有这样的数据框 col1 col2 col3 col4 0 A A 1 pass 2 1 A A 2 pass 4 2 A A 1 fail 4 3 A A 1 fail 5 4 A A 1 pass 3 5 A A 2 fail 2
  • 在 Excel 中生成随机 -1 和 +1 值

    The Rand 函数会生成一个 0 到 1 之间的实数 这Randbetween 1 1 将生成 1 0 或 1 我想要的只是 1或1 那么 1 到 1 之间的实数呢 Easy IF RAND lt 0 5 1 1 要获得实数 请使用 R
  • 使用 split 函数到数组中会导致编译错误:无法分配给数组

    我正在尝试使用split 函数根据给定名称字符串中的空格拆分名称 当尝试编译我在下面编写的代码时 出现编译错误 无法分配给数组 我几乎从这里复制了微软的示例 https support microsoft com en us kb 2662
  • 如何使用vba复制Excel工作表中的动态范围

    我试图使宏中的范围是动态的 而不指定最后一行x Sheets SheetName Range A2 K1000 Copy在 1000 行中 我想将其更改为动态 因为有时我的数量会更少或更多 尝试这个 Sub Test Dim lRow as
  • 将 MS 转换为秒

    我发现这个公式可以用来将 MS 转换为秒 但它是为 Excel 2002 编写的 而我正在使用 2010 CONCATENATE TEXT INT B1 1000 86400 hh mm ss B1 INT B1 1000 1000 以下是
  • 使用 XMLHTTP 进行抓取会在特定类名处引发错误

    我正在尝试使用此代码抓取网站以提取姓名和联系人 Sub Test Dim htmlDoc As Object Dim htmlDoc2 As Object Dim elem As Variant Dim tag As Variant Dim

随机推荐

  • 如何在 Eclipse 中启用索引下载以进行 Maven 依赖项搜索? [复制]

    这个问题在这里已经有答案了 我正在使用带有 m2e 插件的 Eclipse Luna 当我搜索依赖项时 我收到以下警告 另请参阅后面的屏幕截图 索引下载被禁用 搜索结果可能不完整 如何启用索引下载 在 Eclipse 中 单击窗口 gt 首
  • 如何解码不同类型的 JSON 属性? [复制]

    这个问题在这里已经有答案了 我有一个 JSON tvShow id 5348 name Supernatural permalink supernatural url http www episodate com tv show super
  • 警告未使用的 using 语句的静态分析规则是什么?

    当文件中的任何对象不再引用 using 语句时 是否有任何 FxCop 或 StyleCop 会发出警告 您可以启用该规则IDE0005 C Using directive is unnecessary 在类别中Style
  • 在 Jasper 报表上的表中显示 JSON 数组

    我正在尝试使用由 JAVA 函数传递的 JSONDatasource 创建 JasperReport 这是我发送给 jasper 的 JSON Person FirstName John LastName Smith Contacts Ty
  • XML、命名空间和 E4X

    有人可以解释一下 XML 中的命名空间 xmlns 到底有什么用 以及如何使用它们在使用 E4X 导航 XML 时使用它们 最好在 ActionScript 3 中 我无法完全理解它们的目的和用途 理论上 XML命名空间是用来避免与标签名称
  • 如何在tensorflow v2中启用cuda统一内存

    In tensorflow1 x 有一个选项 例如use unified memory and per process gpu memory fraction这有可能触发 CUDA UVM 的使用 但这怎么能在tensorflow 2 0
  • 使用 Moq 重写同一类中的虚拟方法

    我们正在使用 Moq 来对我们的服务类进行单元测试 但仍停留在如何测试服务方法调用同一类的另一个服务方法的情况 我尝试将被调用的方法设置为虚拟 但仍然不知道在最小起订量中要做什么 例如 public class RenewalService
  • 如何创建一个 Grid,其 X 轴和 Y 轴绑定到不同的集合?

    我需要显示一些内容 其中沿列显示一周的天数 沿行显示类别列表 以及单元格中到期的任务列表 参见下面的草图 我觉得解决方案应该很简单 但对于如何绑定这样的东西我还是一片空白 单元格中的行 列和数据项都是动态的 具体取决于用户正在查看的周 理想
  • 无法转换 COM 对象 - Microsoft Outlook 和 C#

    我编写了这段代码来查看 Outlook 邮箱中的未读邮件 代码如下 Microsoft Office Interop Outlook Application app Microsoft Office Interop Outlook Item
  • 上传压缩图片

    我是安卓新手 我创建了一个应用程序来将图像上传到服务器 它非常适合小尺寸图像 但对于较大图像 gt 1 MB 这不起作用 这是我上传图片的功能 class UploadFile extends AsyncTask
  • 在android studio 0.2.8中导入外部库

    我试图将外部库导入到 android studio 中的 android 项目中 这里的许多答案都说它可以从设置中的项目结构中的模块完成 但是自 0 2 8 更新以来 项目结构中没有库 模块 我现在如何导入外部库 也许这是 0 2 8 更新
  • 将数据获取到复杂性:未调用 ExtensionDelegate

    看起来前几周其他人也遇到过这个问题 但我还没有找到任何解决方案 我正在尝试做一件非常基本的事情 将数据从我的 iOS 应用程序或我的 Watch 应用程序获取到我的复杂功能控制器 事实证明 我完成这件事的能力比我想象的要差得多 watchO
  • pub get 错误:无法创建链接...(操作系统错误:函数不正确)

    我在尝试获取 Angular dart Codelab 的包时遇到错误 10 01 28 Running pub get Pub get failed 1 Resolving dependencies Cannot create link
  • Flyway 在空模式上发现非空模式

    我正在尝试实施数据库迁移Flyway 4 2 0 Oracle 11g 我有这个空架构 当我尝试迁移时 Flyway 说 造成原因 org flywaydb core api FlywayException 发现非空 模式 PASHA 没有
  • 具有 CSS 变量的 SVG 半径或位置

    是否可以在 SVG 中使用 CSS 变量来操作 中的半径或位置 等值属性样式 一个元素 例如 在下面的代码中 我添加了一个 CSS 颜色变量 dark text clr和一个半径变量 radius 当我使用填充中的颜色 CSS 变量 htt
  • JavaFX HBox 对齐

    我一直在使用 JavaFX 开发一个软件 但我遇到了一个愚蠢但令人担忧的问题 在代码的某些部分我有一个HBox 并且 其中包含三项 image a label and a VBox 问题是我想要image向左对齐 即紧挨着左边距window
  • 无法在 mac osx 10.10 上构建 python gevent

    概要 pip install gevent不起作用 深入挖掘 我下载了gevent tar gz并手动运行构建 python setup py build 得到同样的错误 running build running build py run
  • 存储没有大小的字符串文字数组 - 关于数组大小的简单模板

    我正在探索存储没有 sidecar 大小信息的文字数组 任何类型 的方法 我已经概述了一些方法 但每种方法都有一些挥之不去的问题 这是最简单的方法 模板超过数组大小 请注意 这是一个简单的测试用例 实际的类可能具有其他成员 其他模板参数以及
  • 使用 XadES-BES 算法通过 XMLDSIG 进行 XML 验证

    程序使用的某些信息使用 xml 格式的输入文件 这些文件具有以下结构
  • 从 Word VBA 编辑工作簿(无论打开还是关闭)

    我正在尝试在 Word 中编写宏 以便可以将一些信息保存到计算机其他位置的 Excel 文件中 为此我写了这个 Dim exlApp As Object Dim exlWbk As Object Set exlApp CreateObjec