Советы по отладке машинно-специфичного выпуска Excel VBA - PullRequest
4 голосов
/ 09 марта 2012

У меня есть книга Excel с зависимостями от кода в других других книгах Excel (эти зависимые .xls являются ссылками уровня VB, т. Е. Через диалоговое окно Инструменты-> Ссылки в редакторе VBA), а также некоторые зависимости от dll, такие как: Microsoft Scripting Runtime Библиотека объектов Microsoft Forms 2.0

Этот лист работал около 2 лет на 20 машинах под управлением Windows XP и Office XP.Недавно мы получили 3 новых машины (той же ОС, той же офисной версии), которые отказываются запускать этот лист.Когда лист открывается, он выдает «Ошибка компиляции», и сеанс зависает.

Если я открываю лист на «плохой» машине, удерживайте нажатой левую клавишу Shift, чтобы остановить запуск макросов, а затемзайдите в VBA Editor-> Debug-> Complie VBAProject, он хорошо компилируется.Затем я могу сохранить лист и открыть его на «плохой» машине.Однако эта новая версия листа отказывается работать на «хорошей» машине !!

Я думаю, что должно быть какое-то несоответствие версий между некоторыми DLL на «хороших» и «плохих» машинах.Как мне определить причину проблемы?Есть ли инструменты для сравнения версий ком-компонентов?

Ответы [ 2 ]

7 голосов
/ 09 марта 2012

Два предложения

1) Сначала откройте файл с отключенными макросами.А затем проверьте VBA Editor |Инструменты |Ссылки .Проверьте наличие недостающих ссылок, а затем дайте нам знать, что они.Мы возьмем его оттуда.

2) Для ссылок типа " Библиотека объектов времени выполнения сценариев Microsoft " Я никогда не использую Раннее связывание.Раннее связывание является основной причиной подобных ошибок.Просто к сведению: Раннее связывание создает ссылки заранее через VBA Editor |Инструменты |Ссылки .Я бы порекомендовал изменить ваш код на Позднее связывание.Вот 2 примера того же кода с использованием « библиотеки объектов времени выполнения сценариев Microsoft » с ранним и поздним связыванием

ПРИМЕР РАННЕГО СВЯЗАНИЯ

'~~> Set Reference to "Microsoft Scripting Runtime Object Library"

Sub EBExample()
    Dim FSO As Scripting.FileSystemObject
    Dim SourceFolder As Scripting.Folder
    Dim FileItem As Scripting.File

    Set FSO = New Scripting.FileSystemObject
    Set SourceFolder = FSO.GetFolder(SourceFolderName)

    For Each FileItem In SourceFolder.Files
        '~~> You code
    Next FileItem
End Sub

ПРИМЕР позднего связывания

'~~> This doesn't need a reference
Sub LBExample()
    Dim FSO As Object, SourceFolder As Object, FileItem As Object

    Set FSO = CreateObject("Scripting.FileSystemObject")
    Set SourceFolder = FSO.GetFolder(SourceFolderName)

    For Each FileItem In SourceFolder.Files
        '~~> You code
    Next FileItem
End Sub

Что касается меня, я использую раннее связывание, чтобы использовать преимущества Intellisense, но затем преобразую его в позднее связывание, чтобы избежать специфичного для версии кода перед распространением кода.Таким образом, код всегда работает.:)

IMP ПРИМЕЧАНИЕ. Позднее связывание завершается неудачно в тех случаях, когда на целевом компьютере не зарегистрированы соответствующие dll.

РЕКОМЕНДУЕМАЯ ССЫЛКА :

Тема: Использование раннего и позднего связывания в Automation

Ссылка : http://support.microsoft.com/kb/245115

Надеюсь, это поможет

Sid

0 голосов
/ 10 марта 2012

Самый простой способ сравнить ссылки на двух разных машинах - это запустить небольшой макрос на каждом компьютере, чтобы показать мне все детали.

Убедитесь, что Excel настроен на доверительный доступ к VBA.спроектируйте объектную модель и запустите приведенный ниже код для двух версий вашего макроса.

Sub GetReferences()
   Dim r As Object
   For Each r In ActiveWorkbook.VBProject.References
      Debug.Print r.Name, r.Description, r.FullPath
   Next r
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...