VBA我可以计算在脚本中调用函数的次数

时间:2019-02-27 22:32:05

标签: vba

我正在尝试在Excel中构建动态进度栏,而我目前正在这样做的方式是将一些步骤硬编码为“步骤总数” ... .StatusBar代码将使用计数器除以该总数来更新。

我想做的是通过向前搜索代码以标识“ Call fnProgress”出现在子例程中的次数,使“ TotalSteps”预先填充为3(使用下面的示例)。

for (let i = 0; i < cr.attributes.length; i++) {

    let displayAlignment = '';
    switch (cr.attributes[i].dispAlign) {
        case 'C':
            displayAlignment = 'center';
            break;
        case 'L':
            displayAlignment = 'left';
            break;
        case 'R':
            displayAlignment = 'right';
            break;
        default:
            throw new Error('this will never happen, dispAlign for database must have value');
        }

    const displayMask = cr.attributes[i].dispMask;
    // console.log('displayMask: ', displayMask);
    const dataType = cr.attributes[i].dataType;
    // console.log('dataType: ', dataType);

    // console.log('cr attributes: ' , cr.attributes );
    childColDefsString = childColDefsString +
        '{"field": "' + cr.attributes[i].label + '"' +
        ', "cellStyle": {"textAlign": "' + displayAlignment + '"}' +
        ', "valueFormatter": "this.customValueFormatter(datatype, displayMask)"' +
        ', "width": 175, ' + '"hide": ' + cr.attributes[i].hide + '},';
}

我不觉得这在VBA中是可以实现的,但是我认为这里的人会知道该怎么做!也许有人可以为我的简单进度条提供更好的解决方案...对我来说,能够在实际代码中进行预先搜索也是一个有趣的问题,我想它会在我的状态栏之外得到更多的应用。 非常感谢! -朱莉娅:)

2 个答案:

答案 0 :(得分:0)

有可能,但这并不漂亮。
在大多数情况下,我会考虑以下不良做法的解决方案。无论如何-可以了:

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数组中的方法。

答案 1 :(得分:0)

这是另一种方法。这不是编写代码的好方法,但是在某些情况下,有必要这样做。

首先添加对 Microsoft Visual Basic for Applications Extensibility的引用,然后添加以下代码:

Sub Test()
    Dim CodeMod As VBIDE.CodeModule
    Set CodeMod = ActiveWorkbook.VBProject.VBComponents("Module1").CodeModule

    Debug.Print CountOccurrences("Call fnProgress", CodeMod.Lines(1, CodeMod.CountOfLines)) - 1 'Remove 1 to ignore this line
End Sub

Function CountOccurrences(SoughtString As String, InString As String) As Long
    CountOccurrences = (Len(InString) - (Len(Replace(InString, SoughtString, "")))) / Len(SoughtString)

End Function

模块名称是硬编码的。它读取代码,计算Call fnProgress的出现次数并减去1(这样就不计算其自身的计数)。根据需要进行调整。