Не базовый c код в стеке вызовов VBE - что это значит? - PullRequest
0 голосов
/ 10 апреля 2020

Я только сейчас изучаю, как использовать стек вызовов в VBE. У меня есть один вопрос, на который я, похоже, не могу найти ответ, это то, что это означает, когда, когда я прохожу две подпрограммы, в моем стеке вызовов появляются два экземпляра [<Non-Basic Code>]. введите описание изображения здесь

Я не уверен, что это уместно, но я включил две свои подпрограммы, через которые я прохожу, если это поможет.

Вот мои объявленные переменные уровня модуля (за исключением Option Explicit):

Option Explicit
Dim fso As Scripting.FileSystemObject
Dim NewFolderPath As String

Моя первая подпрограмма:

Sub UsingTheScriptingRunTimeLibrary()

Dim OldFolderPath As String

NewFolderPath = Environ("userprofile") & "\Documents\Education\Excel\VBA\Test"                              'where we I am copying TO
OldFolderPath = Environ("userprofile") & "\Documents\Education\Excel\VBA\Excel VBA Introduction - Wise Owl" 'where we are copying FROM

Set fso = New Scripting.FileSystemObject

If fso.FolderExists(OldFolderPath) Then

    If Not fso.FolderExists(NewFolderPath) Then
        fso.CreateFolder NewFolderPath
    End If

    Call CopyExcelFiles(OldFolderPath) 'since we are sending this as an argument to our CopyExcelFiles sub for its StartFolderPath parameter, we do not need to set it in our next sub

End If
Set fso = Nothing
End Sub

Вот моя вторая подпрограмма :

Sub CopyExcelFiles(StartFolderPath As String)

Dim Fil As Scripting.File
Dim SubFol As Scripting.Folder
Dim OldFolder As Scripting.Folder

Set OldFolder = fso.GetFolder(StartFolderPath)

For Each Fil In OldFolder.Files
    If Left(fso.GetExtensionName(Fil.Path), 2) = "xl" Then
        Fil.Copy NewFolderPath & "\" & Fil.Name
    End If
Next Fil

For Each SubFol In OldFolder.SubFolders
    Call CopyExcelFiles(SubFol.Path)
Next SubFol

End Sub

В любом случае, когда я прохожу свою первую подпрограмму, я вижу свою первую подпрограмму в списке и один экземпляр (и это буквальный текст) [<Non-Basic Code>]. Однако, когда я начинаю проходить через мою вторую подпрограмму, я вижу два экземпляра [<Non-Basic Code>] и обе перечисленные подпрограммы.

Любая помощь по этому вопросу будет принята с благодарностью!

1 Ответ

0 голосов
/ 10 апреля 2020

Как отмечает Freeflow в комментарии к вам, стек вызовов показывает [Non-Basic Code] всякий раз, когда вызывается внешний код.

Посмотрите на эту часть:

For Each Fil In OldFolder.Files
    ...
Next Fil

Вы делаете For Each над OldFolder.Files; кто делает перечисление? Это не очевидно, когда вы программируете VBA, но если вы писали C, , то что-то должно реализовать перечислитель для оператора For Each для работы. В этом случае в объекте Scripting.Files реализован скрытый перечислитель. Таким образом, когда VBA имеет For Each, он вызывает скрытый перечислитель и извлекает из него элемент.

Это не единственный способ. Есть и другие способы увидеть Non-Basic Code - обычная процедура - через обработчики событий. Допустим, вы делаете MyWorkbook.Save, чтобы сохранить книгу Excel. Это будет вызывать события в книге, такие как BeforeSave событие и так далее. Если у вас есть VBA-код в обработчиках событий, вы наверняка увидите между вызовами Non-Basic Code.

По сути, всякий раз, когда ваш код должен пройти через какую-то внешнюю библиотеку для выполнения кода, стек вызовов вставит Non-Basic Code, чтобы вы знали, что между вашим кодом VBA и предыдущим кодом, который его вызвал, есть слой , Также есть случаи, когда к вашему VBA-коду может быть получен небазисный c -код целиком, поэтому он также будет первым в стеке вызовов.

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