【问题标题】:Advice on Debugging Machine-Specific Excel VBA Issue关于调试机器特定的 Excel VBA 问题的建议
【发布时间】:2012-03-09 03:28:25
【问题描述】:

我有一个 Excel 工作簿,它依赖于其他 Excel 工作簿中的代码(这些依赖的 .xls 是 VB 级引用,即通过 VBA 编辑器中的工具->引用对话框),以及对 dll 的一些依赖关系,例如: Microsoft 脚本运行时 Microsoft Forms 2.0 对象库

这张表已经在大约 20 台运行 Windows XP 和 Office XP 的机器上运行了大约 2 年。最近我们收到了 3 台拒绝运行此表的新机器(相同的操作系统,相同的办公版本)。当工作表打开时,它会引发“编译错误”,并且会话挂起。

如果我在“坏”机器上打开工作表,按住左移键停止宏运行,然后转到 VBA Editor->Debug->Complie VBAProject,它编译正常。然后我可以保存工作表并在“坏”机器上正常打开它。然而,这个新版本的工作表拒绝在“好”机器上运行!!

我认为“好”和“坏”机器上的某些 dll 之间一定存在某种版本不匹配。如何确定导致问题的原因?是否有任何工具可用于比较 com 组件的版本?

【问题讨论】:

    标签: vba excel


    【解决方案1】:

    两个建议

    1) 首先打开禁用宏的文件。然后检查 VBA Editor |工具 |参考文献。检查是否有任何缺失的参考资料,然后让我们知道它们是什么。我们将从那里拿走它。

    2) 对于“Microsoft 脚本运行时对象库”之类的引用,我从不使用早期绑定。早期绑定是导致此类错误的主要原因。仅供参考:早期绑定是通过 VBA 编辑器预先创建引用 |工具 |参考文献。我建议将您的代码更改为后期绑定。以下是使用“Microsoft Scripting Runtime Object Library”与早期绑定和后期绑定的相同代码的 2 个示例

    早期绑定示例

    '~~> 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 的情况下,后期绑定会失败。

    推荐链接

    主题:在自动化中使用早期绑定和后期绑定

    链接http://support.microsoft.com/kb/245115

    希望对你有帮助

    席德

    【讨论】:

    • +1 有趣的策略。应该指出的是,它与微软的不同。引用the link 的话:“早期绑定的优势使其成为最好的选择。[...] 早期绑定是首选方法。[..] Microsoft 建议在几乎所有情况下进行早期绑定。”虽然可能不是在 这个 特殊情况下。
    • @Jean-François Corbett:谢谢 :) 我相信(我可能是错的),但 MS 推荐它基于两个主要原因。 1) Intellisense 对大众的吸引力。 2)EB比LB快得多。但就像我之前提到的那样,我可能是错的。 :)
    • LB 很慢,因为它通过调度而不是原始接口。
    • +1 我通常使用后期绑定,尤其是在自动化其他 Office 软件时,但 Microsoft Scripting Runtime Object Library 是我使用过的早期绑定 - 它在我的 Dupe Master addin 上将运行时间提高了 25-30%
    • 当决定将一些用户从 2003 年升级到 2010 年的权力时,LB 对我来说也更有效。
    【解决方案2】:

    我发现比较两台不同机器上的参考的最简单方法是在每台电脑上运行一个小宏来显示所有细节。

    确保 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
    

    【讨论】:

    • 您好,我在一台好机器和一台坏机器上运行该代码并得到相同的输出。 IE。存储在工作簿 vba 项目中的所有引用都是相同的。
    • @nickos556,很奇怪。如果您像其他人建议的那样使用后期绑定,问题会消失吗?
    猜你喜欢
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 2011-10-28
    • 2011-09-13
    • 2021-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多