VBA Могу ли я посчитать, сколько раз я вызываю функцию в моем скрипте - PullRequest
0 голосов
/ 28 февраля 2019

Я пытаюсь построить динамический индикатор выполнения в Excel, и в настоящее время я делаю это путем жесткого кодирования нескольких шагов в моем скрипте как «общего количества шагов» ... приложенияКод .StatusBar обновляется счетчиком, который делится на эту сумму.

Я бы хотел, чтобы «TotalSteps» предварительно заполнялось 3 (используя приведенный ниже пример), просматривая код вперед, чтобы определить, сколько раз «Call fnProgress» появляется в подпрограмме..

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, но я подумал, что кто-то здесь знает, как это сделать, если бы это было!Или, может быть, кто-то мог бы предложить лучшее решение для моей простой строки прогресса ... Возможность поиска вперед в реальном коде - это тоже интересная проблема для меня, и я думаю, что у него есть дальнейшее применение помимо моей строки состояния.Спасибо!-Юлия:)

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Вот другой подход.Не очень хороший способ написания кода, но опять же, есть ситуации, когда это оправдано.

Начните с добавления ссылки на Microsoft Visual Basic для расширяемости приложений , затем добавьте этот код:

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 и вычитает единицу (чтобы подсчет сам не учитывался).Отрегулируйте при необходимости.

0 голосов
/ 28 февраля 2019

Это возможно, но это не красиво.
В большинстве случаев я бы посчитал решение нижеприведенным.В любом случае - здесь все идет так:

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 вызывает методы в массиве Steps, используя Evaluate.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...