我正在尝试在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中是可以实现的,但是我认为这里的人会知道该怎么做!也许有人可以为我的简单进度条提供更好的解决方案...对我来说,能够在实际代码中进行预先搜索也是一个有趣的问题,我想它会在我的状态栏之外得到更多的应用。 非常感谢! -朱莉娅:)
答案 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(这样就不计算其自身的计数)。根据需要进行调整。