Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何以编程方式添加对VBA项目的引用?_Vba - Fatal编程技术网

如何以编程方式添加对VBA项目的引用?

如何以编程方式添加对VBA项目的引用?,vba,Vba,我正在部署一个早期绑定样式的VBA模块,它需要Scripting.Dictionary和RegExp 可以预见,脚本在另一台计算机上运行时会失败。 用户必须在VBA IDE中转到工具->引用,并手动添加对这两个库的引用以使其工作 这就是问题所在。要求非技术性的最终用户转到IDE并手动添加引用,要求的太多了 另一种选择是重写整个脚本(其他人编写的很长的脚本)以使用后期绑定。如果有其他方法,我宁愿不走这条路 作为替代方案,有些人建议按如下方式添加一个参考: Application.VBE.Activ

我正在部署一个早期绑定样式的VBA模块,它需要Scripting.DictionaryRegExp

可以预见,脚本在另一台计算机上运行时会失败。 用户必须在VBA IDE中转到工具->引用,并手动添加对这两个库的引用以使其工作

这就是问题所在。要求非技术性的最终用户转到IDE并手动添加引用,要求的太多了

另一种选择是重写整个脚本(其他人编写的很长的脚本)以使用后期绑定。如果有其他方法,我宁愿不走这条路

作为替代方案,有些人建议按如下方式添加一个参考:

Application.VBE.ActiveVBProject.References.AddFromFile[Path to library]

  • 这是正确的解决方案吗?如果是的话,这一策略是否有任何缺点
  • 如果没有,是否有其他方法可以使代码保持早期绑定,但不需要用户手动添加引用 还欢迎涉及直接调用Win32/64 API的建议


    谢谢。

    在我自己有限的环境中(很少有人使用我开发的电子表格,相对标准的机器设置),如果我创建文件并添加引用,然后给其他人一份副本,他们可以毫无问题地打开它,也不必做任何事情,所以请记住这个答案。(我想知道为什么这对你不起作用。)还有,这是用Excel做的

    <>而不是从文件路径添加引用,您可以考虑使用GUID属性代替.< /P> 下面是我曾经用来在新创建的工作簿中自动创建引用的一些代码。(它是脚本的一部分,可以将工作表上的代码、引用和单元测试导出为文本,以便与Subversion一起使用,然后再从文本文件中重新构建工作簿。)您可能会发现它对您的情况很有用。(EH和清理已移除以保持简短…)

    “将现有工作簿中的引用导出到文本文件
    私有子导出引用(srcWbk作为工作簿)
    将fs设置为文件系统对象
    Set fs=New FileSystemObject
    将TST设置为文本流
    Set tsout=fs.CreateTextFile(fs.BuildPath(getTargetPath_(srcWbk),“refs.refs”))
    尺寸参考作为参考
    对于Application.ThisWorkbook.VBProject.References中的每个引用
    调用tsout.WriteLine(ref.GUID)
    下一个参考
    '
    端接头
    '根据以前导出的文本文件向新创建的工作簿添加引用
    私有子导入文件(wbk作为工作簿,路径作为字符串)
    将fs设置为文件系统对象
    Set fs=New FileSystemObject
    Dim tsin作为文本流
    设置tsin=fs.OpenTextFile(路径)
    将线变暗为字符串
    尺寸参考作为参考
    而不是在tsin.AtEndOfStream
    line=tsin.ReadLine()
    Set ref=无
    出错时继续下一步
    Set ref=wbk.VBProject.References.AddFromGuid(行,0,0)
    错误转到0
    如果ref为空,那么
    调试。打印“添加失败:”&行
    如果结束
    温德
    '
    端接头
    

    就像我说的,有限的环境,但希望能有所帮助。

    我能想到的VBE路线的唯一缺点是,用户必须专门启用对VBA项目模型的编程访问。不过,这是一个相当小的问题。如果我处在你的位置,我会走这条路。看起来很有趣。我试试看。谢谢
    'Export refs in existing workbook to text file
    Private Sub exportRefs_(srcWbk As Workbook)
        Dim fs As FileSystemObject
        Set fs = New FileSystemObject
    
        Dim tsout As TextStream
        Set tsout = fs.CreateTextFile(fs.BuildPath(getTargetPath_(srcWbk), "refs.refs"))
    
        Dim ref As Reference
        For Each ref In Application.ThisWorkbook.VBProject.References
            Call tsout.WriteLine(ref.GUID)
        Next ref
    
        '<EH + cleanup...>
    End Sub
    
    
    'Add refs to newly created workbook based on previously exported text file
    Private Sub importRefs_(wbk As Workbook, path As String)
        Dim fs As FileSystemObject
        Set fs = New FileSystemObject
    
        Dim tsin As TextStream
        Set tsin = fs.OpenTextFile(path)
    
        Dim line As String
        Dim ref As Reference
    
        While Not tsin.AtEndOfStream
            line = tsin.ReadLine()
    
            Set ref = Nothing
    
            On Error Resume Next
                Set ref = wbk.VBProject.References.AddFromGuid(line, 0, 0)
            On Error GoTo 0
    
            If ref Is Nothing Then
                Debug.Print "add failed: " & line
            End If
        Wend
    
        '<EH + cleanup...>
    End Sub