vba - VBA 我可以计算我在脚本中调用函数的次数吗
问题描述
我正在尝试在 Excel 中构建一个动态进度条,而我目前这样做的方式是将一些步骤硬编码到我的脚本中作为“步骤总数”...... Application.StatusBar 代码使用除以该总数的计数器进行更新。
我想做的是通过提前搜索代码来识别“Call fnProgress”在子例程中出现的次数,让“TotalSteps”预填充 3(使用下面的示例)。
Public Sub Example()
TotalSteps = 3 'Enter a value here equal to the number of times "Call fnProgress" appears below
Call ABC
Call fnProgress
Call 123
Call fnProgress
Call DoReMi
Call fnProgress
End Sub
我不认为这在 VBA 中是可能的,但我认为这里有人会知道如何做到这一点!或者也许有人可以为我的简单进度条提供更好的解决方案……对我来说,能够在实际代码中提前搜索也是一个有趣的问题,我想它在我的状态栏之外还有更多的应用。非常感谢!-朱莉娅:)
解决方案
这是可能的,但它并不漂亮。
在大多数情况下,我会考虑以下不良做法的解决方案。无论如何 - 就这样:
Sub Test()
Dim StepCount As Integer
Dim TotalSteps As Integer
Steps = Array("Abc", "Def", "Ghi")
TotalSteps = UBound(Steps) + 1
For Each Step In Steps
StepCount = StepCount + 1
ActiveSheet.Evaluate Step & "()+0" '+0 is workaround to handle a bug in VBA. Without it, the method is called twice
Progress StepCount, TotalSteps
Next
End Sub
Sub Progress(StepCount As Integer, TotalSteps As Integer)
Debug.Print StepCount & "(" & TotalSteps & ")"
End Sub
Sub Abc()
Debug.Print "Abc"
End Sub
Sub Def()
Debug.Print "def"
End Sub
Sub Ghi()
Debug.Print "ghi"
End Sub
其基础是 Evaluate 函数,它允许您评估字符串中的表达式。Test 方法使用 Evaluate 调用 Steps 数组中的方法。
推荐阅读
- azure - SSAS Invoke-ASCmd 创建或更新不创建数据库
- java - switch 语句未正确执行
- java - 移入列的算法:移动字母不起作用
- c# - 自定义 Slack 命令返回状态 200 并触发另一个作业
- mysql - Postfix 与 PostfixAdmin 和 MySQL 后端表查找/权限被拒绝错误
- sql - 在 30 秒内加入时间戳?
- javascript - 为什么 Swift 不能识别 JS 发送的数组?
- mysql - 从查询中只选择一列:“SHOW TABLE STATUS FROM `DB`”?
- php - 不存在的类:codeigniter 中的 CI_ApiClient 错误
- c# - 在自定义方法中为数组中的元素分配最小值 (array.Min())