如何确保 Excel 计算在 VBA 过程中完成

2023-11-30

在 Excel 电子表格中,用户定义的函数用于计算电子表格矩阵(复合元素的横截面值)的基本结果。

Public Function XSValues(inputRange as Range) as variant
    [...]
    ' returns an array and used as matrix-formula (Ctrl-Shift-Enter)
End Function

一方面,这些结果在电子表格中使用。另一方面,基于这些电子表格结果中的一些值,VBA 程序用于执行相对复杂且耗时的计算(结构模型的静态分析)。该过程由按钮触发。

Public Sub Recalculate()
    [...]
    myValue = range("SomeXLResult").Value
    ' calculation
    ' notification updates
    ' drawing
    ' places different results into cells
End Sub

现在,我的问题是,电子表格计算已经过时,当Sub Recalculate被触发。 我发现在Excel 2016中,电子表格计算被分成多个线程。并且体验到用户交互有时比电子表格计算更快。

因此,我得到了折旧值,以便在 VBA 过程中进一步处理。 我的问题是:如何保证电子表格范围内的值得到更新?


如果您的答案中解释的解决方案对您有用,那就太好了。我只是想知道您是否知道该应用程序的AfterCalculate event (https://msdn.microsoft.com/en-us/vba/excel-vba/articles/application-aftercalculate-event-excel):

每当计算完成且没有任何结果时,就会发生此事件 未解决的查询。必须同时满足这两个条件 在事件发生之前。即使没有,也可以引发该事件 工作簿中的工作表数据,例如每当计算完成时 整个工作簿,并且没有正在运行的查询。

加载项开发人员使用 AfterCalculate 事件来了解所有 工作簿中的数据已通过任何查询和/或 可能正在进行的计算。

此事件发生在所有 Worksheet 之后。计算、图表。计算 、 AfterRefresh 和 SheetChange 事件。这是最后发生的事件 所有刷新处理和所有计算处理完成后, 它发生在 Application 之后。 CalculationState 设置为 xlDone 。

这对您来说可能是一个更容易的实现。访问应用程序对象事件的技巧是声明它WithEvents在一个类模块中。例如,我将该类称为clsApp事件:

Option Explicit

Private WithEvents mApp As Application

Private Sub Class_Initialize()
    Set mApp = Application
End Sub

Private Sub mApp_AfterCalculate()
    Debug.Print "Calc ended at: " & Now
    ConsumeAfterCalculate
End Sub

在您的模块中,您只需具有调用和事件处理代码:

Option Explicit

Private mAppEvents As clsAppEvents
Private mEnableConsume As Boolean

Public Sub RunMe()
    Set mAppEvents = New clsAppEvents
End Sub
Public Sub ConsumeAfterCalculate()
    If mEnableConsume Then
        Debug.Print "Sub called at: " & Now
        mEnableConsume = False
    End If
End Sub
Public Sub ConsumeButtonClick()
    Debug.Print "Button clicked at: " & Now
    mEnableConsume = True

    'For demo purposes I'm just forcing a calculation on existing data.
    Sheet1.EnableCalculation = False
    Sheet1.EnableCalculation = True
End Sub

仅供参考,调试结果如下:

按钮点击时间:2017 年 10 月 25 日下午 4:49:20

计算结束于:2017 年 10 月 25 日下午 4:49:22

子呼叫时间:2017 年 10 月 25 日下午 4:49:22

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何确保 Excel 计算在 VBA 过程中完成 的相关文章

  • 我可以使用 VBA 将密码“传递”到 Excel 中的外部数据库连接吗?

    我正在尝试使用 VBA 隐藏我在 Excel 工作表中设置的数据连接的密码 由于 Excel 以纯文本形式存储外部数据源的密码 因此我想让 VBA 调用表的刷新并提供密码 我录制了刷新表格并输入密码的宏 但令我沮丧的是 它似乎省略了密码部分
  • WebAPI 和 Angular JS Excel 文件下载 - 文件损坏

    我正在 WebAPI 中生成 Excel 文件 我将其 存储 在内存流中 然后放入响应 如下所示 var result new HttpResponseMessage HttpStatusCode OK Content new Stream
  • Outlook 中用于删除重复电子邮件的宏 -

    Public Sub RemDups Dim t As Items i As Integer arr As Collection f As Folder parent As Folder target As Folder miLast As
  • 如何将多个 Excel 工作表转换为 csv python

    我想转换所有的excel文档 xls 将工作表转换为 csv 如果 excel 文档只有一张工作表 那么我将进行如下转换 wb open workbook path1 sh wb sheet by name Sheet1 csv file
  • Excel VBA:排序,然后复制和粘贴

    所有 我需要编写一个执行以下操作的宏 将数据输入到 E 列的最后一个空白单元格后 按 E 列对整个工作表进行降序排序 工作表排序后 2a 将单元格复制到紧邻首次输入数据的单元格左侧的相邻单元格 2b 将复制的数据粘贴到最初输入数据的同一行的
  • 无法使用 Excel JavaScript API 设置 NumberFormat

    我正在使用 Excel Javascript API 在搜索文档后 仍然找不到我想要实现的解决方案 因此 我想将所有内容设置为数字格式 文本 这样 Excel 的自动格式设置就不会与任何单元格的内容混淆 不会删除前导零或更改日期格式 文档建
  • 在 Django(Python) 中向用户提供 Excel(xlsx) 文件下载

    我正在尝试使用 Django 创建和提供 Excel 文件 我有一个 jar 文件 它获取参数并根据参数生成 excel 文件 并且它可以正常工作 但是 当我尝试获取生成的文件并将其提供给用户下载时 文件损坏了 它的大小为 0kb 这是我用
  • 获取给定日期的周数

    例子 DD MM YYYY 1 1 2009 should give 1 31 1 2009 should give 5 1 2 2009 should also give 5 Format 1 2 2009 ww 回报6 那么 怎样才能得
  • 如何从另一个 Excel 实例引用工作簿

    我相信我的问题相当简单 我有一个工作簿 我正在使用它从另一个软件 SAP 获取一些数据 当我从软件导出数据时 它会自动打开一个 xlsx 文件 然后我需要做的是从该文件复制一些数据 粘贴到我的原始工作簿上 然后关闭该文件 我的代码中给我带来
  • 如何暂停特定时间? (Excel/VBA)

    我有一个 Excel 工作表 其中包含以下宏 我想每秒循环一次 但如果我能找到执行此操作的函数 那就很危险了 难道不可能吗 Sub Macro1 Macro1 Macro Do Calculate Here I want to wait f
  • 强制刷新工作表的“最后一个”单元格

    Pressing Ctrl End in Excel takes you to the bottom right most cell of the worksheet 如果删除最后的行或列并保存工作簿 最后一个单元格以及滚动条都会更新 我记
  • 当存储在集合中时,如何更改类属性的值

    我想将一个类存储在集合中 并且能够更改该类的属性 而不必删除集合项并再次将其添加回来 我的研究表明 如果不进行删除 替换操作 则无法更改项目本身 但是项目的属性又如何呢 下面的代码展示了如何执行此操作 当您运行宏时 调试窗口将显示存储对象的
  • Sharepoint Server 对于 Excel Services 或 Excel Web Access 是必需的吗

    Excel Services 和 Excel Web Access 随 Microsoft Office SharePoint Server 2007 一起提供 我想知道是否可以在不运行 Sharepoint Server 的情况下使用 E
  • 使用 C# 在 Excel 中查找和替换文本

    我想使用 C 在 Excel 中查找并替换一组文本 而且我希望此替换仅发生在第一行中的文本 我已经使用Google并找到了一些付费资源 例如Aspose API Spire Xls等 但我正在寻找开源资源或任何其他有效的方法来实现这一目标
  • 向用户显示多条验证消息

    在 MS Access 中 如何将从 SELECT 语句检索到的行存储在数组中 并在一个消息框中显示多行 Dim rSEL rSUM rDes As DAO Recordset Dim vItem id vQnty vSum As Inte
  • 如何获取 Word 应用程序的 Hwnd/进程 ID,并将其设置为前台窗口

    我希望我的 Word 应用程序在自动化完成后进入前台 Excel 中的等效项很简单 Excel Application 对象有一个 Hwnd 属性 您可以将其与 Windows API 结合使用 SetForegroundWindow In
  • 在 Python 中绘制 Excel 中的数据

    我必须从 Excel 文件中读取和绘制数据的代码是这样的 import pandas as pd import matplotlib pyplot as plt excel file file1 xlsx file1 pd read exc
  • Excel ISNUMBER 函数与 IF 语句

    我有一个正在使用的 Excel 文件 有一个列包含数字和文本 有时只是其中之一 我正在尝试编写一个函数来扫描单元格的最左侧部分以查看它是否以数字开头 我以为我拥有它 但显然没有 这就是我所拥有的 IF ISNUMBER LEFT E8 1
  • 在单元格更改时循环遍历一系列单元格,以将序列中的下一个数字显示为单元格的新值

    我了解如何循环范围 For Each cell In Range A1 A5 If condition Then End If Next 我知道 OnChange 事件 Private Sub Worksheet Change ByVal
  • VB FFT - 难以理解结果与频率的关系

    试图理解我正在使用的 fft 快速傅里叶变换 例程 窃取 回收 输入是 512 个数据点的数组 它们是样本波形 测试数据生成到该数组中 fft 将该数组变换到频域 尝试理解频率 周期 采样率和 fft 数组中位置之间的关系 我用例子来说明

随机推荐

  • Prestashop - 如何写入日志文件?

    我应该在 Prestashop 模块中使用什么 php 代码来写入日志文件 我用过 Logger addLog something 1 但它不起作用 您还可以使用以下代码将日志存储在文件中 logger new FileLogger 0 0
  • HTML5 拖放 拖动时更改图标/光标

    我想知道当我拖动 dragover dragenter 图标 光标时如何更改例如拒绝或允许部分 当然 我可以用光标移动绝对定位的 DOM 部分 但我对原生 HTML5 解决方案感兴趣 Thanks 你在追寻掉落效果 在dragstart中初
  • 按模式递归添加文件

    如何通过位于不同目录中的模式 或全局 递归添加文件 例如 我想添加A B C foo java and D E F bar java 以及其他几个 java 文件 使用一个命令 git add java 不幸的是 这并没有按预期工作 您可以
  • lstat:无法访问另一个目录中的文件

    我正在尝试编写类似 ls 的程序 产生类似的输出ls l包含文件的权限 所有者 时间和名称 如果我通过的话效果很好 或什么都没有 所以它适用于当前目录 但是如果我将任何其他目录传入或传出当前目录 perror说它 无法访问 文件 请帮我找出
  • 使用 XAMPP 启用 SSL

    我一直在尽可能地遵循本指南http robsnotebook com xampp ssl encrypt passwords 然而 每当我浏览到以 https 开头的页面时 apache 服务器都会回复 404 未找到对象 我缺少什么设置
  • Python 3.2:cx_freeze 编译我的程序,但处于调试模式

    我正在使用 Python 3 2 和 Pygame 制作游戏 我已经成功地使用了cx freeze将所有内容捆绑到可执行文件中 然后运行 美好的 唯一的问题是 即使当我通过 OO标记我的setup py 我的游戏是在调试模式下编译的 我已经
  • NHibernate / MySQL 字符串连接

    我有一个 nhibernate linq 查询 如下所示 from b in session Query
  • 如何以编程方式在 Active Directory 中搜索打印机

    尝试使用 C 在 Active Directory 中查找打印机 共享 这是我适用于用户的示例代码 但是我看不到能够找到使用相同概念的打印机 我是 Active Directory 新手 DirectoryEntry entry new D
  • httprouter配置NotFound

    我在用着httprouter对于 API 我正在尝试找出如何处理 404 它确实说在docs404 可以手动处理 但我真的不知道如何编写自己的自定义处理程序 在我的其他路线之后我尝试了以下方法 router NotFound pageNot
  • 在混合 MVC/WebForms Web 应用程序中配置授权

    我目前正在将 WebForms MVP 应用程序的一些组件迁移到 MVC 中 到目前为止 除了授权之外 一切正常 无论如何 当我导航到 MVC 版本的登录页面时 我会被重定向到在Web config
  • Maven 需要为托管依赖项指定插件版本 spring-boot-configuration-processor

    我有一个带有模块的 Maven 项目 我的根项目的父项目是spring boot starter parent 它提供了大量的依赖管理 在我的模块中 我使用spring boot configuration processor 这是由管理的
  • 如何在 JavaScript 中扩展 XMLHttpRequest 对象?

    我想扩展现有的XMLHttpRequest对象 以便它可以与所有浏览器一起使用 现在我已经经历了JS继承然而在开始之前我想看看很好的例子 HTML5 有上传和进度事件的东西 我想在继承的新对象中实现这些东西 即使不支持该功能 也可以通过不向
  • 创建 Java 数组时使用尖括号和方括号方法的区别

    我最近刚刚开始使用 Java 并开始接触数组 据我所知 有两种创建数组的方法 对于有 python 背景的我来说 第一种方法最有意义 type ArrayName i e int agesOfParticipants 然而 许多在线资源使用
  • 保护 PhoneGap 中的敏感信息?

    我有许多想要保护的 REST API 密钥 Google Places 等 阅读 Google Groups 等 似乎混淆不是解决方案 使用钥匙串也不是解决方案 那么当 IPA 包可以解压和读取时 您建议如何加密 保护敏感信息 我不想用 O
  • android-gradle-plugin 1.2.2:标记ignoreFailures导致任务connectedAndroidTest出错

    我更新了我的 build gradle 以使用 android gradle 插件 1 2 2 而不是 1 1 0 dependencies classpath com android tools build gradle 1 2 2 之后
  • 不从 Function App 向 Application Insights 发送数据

    我有 Function App 和 Application Insight 服务 我注意到我的应用程序发送的数据量很大并且产生很大的成本 我可以禁用 完全停止向 AI 发送数据而不删除APPINSIGHTS INSTRUMENTATIONK
  • 使用 javascript / jQuery 更好地实现淡入淡出图像交换

    这不是一个具体的问题或错误 而是一个实施问题 首先我想说 我已经看过很多褪色图像教程 并且对不同类型有基本的了解 我希望这个问题不会与其他数百个有关图像褪色的问题一起被抛弃 这基本上就是我想要的 使用 javascript 最好是 jQue
  • 创建对象:有或没有“new”[重复]

    这个问题在这里已经有答案了 可能的重复 使用 new 实例化对象与不使用 new 实例化对象有什么区别 这可能是一个基本问题 并且可能已经被问过 例如 here 但我还是不明白 那么 让我问一下 考虑以下 C 类 class Obj cha
  • 如何让进度条循环并处于确定模式? [复制]

    这个问题在这里已经有答案了 我必须在设备上下载一些图像和视频 并且我喜欢通过在确定模式下覆盖一个圆形进度条来跟踪进度 问题是 无论如何 ProgressBar 仍然是不确定的 有没有办法让它循环并处于确定模式 Layout
  • 如何确保 Excel 计算在 VBA 过程中完成

    在 Excel 电子表格中 用户定义的函数用于计算电子表格矩阵 复合元素的横截面值 的基本结果 Public Function XSValues inputRange as Range as variant returns an array