以编程方式添加VBA引用

以编程方式添加VBA引用,vba,ms-office,Vba,Ms Office,我正在尝试更正各种Avaya应用程序版本的引用问题(由于不同用户的目录不同,引用丢失)。我们有多个版本正在运行,需要它处理所有可能的版本,然后给出一个错误。到目前为止,我已经创建了以下代码,以便在开始时内联定义它们,但它不断抛出一个“编译错误:无效的外部过程”。我不熟悉编码,并尝试将此信息添加到现有的VBA设置中 'Start Declarations Dim cvsApp As New ACSUP.cvsApplication Dim cvsConn As New ACSCN.cvsConne

我正在尝试更正各种Avaya应用程序版本的引用问题(由于不同用户的目录不同,引用丢失)。我们有多个版本正在运行,需要它处理所有可能的版本,然后给出一个错误。到目前为止,我已经创建了以下代码,以便在开始时内联定义它们,但它不断抛出一个“编译错误:无效的外部过程”。我不熟悉编码,并尝试将此信息添加到现有的VBA设置中

'Start Declarations
Dim cvsApp As New ACSUP.cvsApplication
Dim cvsConn As New ACSCN.cvsConnection
Dim cvsSrv As New ACSUPSRV.cvsServer
Dim Rep As New ACSREP.cvsReport
Dim Info As Object, Log As Object, b As Object
Dim logged As Boolean

'Start My Code
If Dir("C:\Program Files (x86)\Avaya\CMS Supervisor R16", vbDirectory) <> 
vbNullString Then
    cvsApp.References.AddFromFile "C:\Program Files (x86)\Avaya\CMS 
Supervisor R16\ascApp.exe"
    cvsConn.References.AddFromFile "C:\Program Files (x86)\Avaya\CMS Supervisor R16\cvsCONN.dll"
    cvsSrv.References.AddFromFile "C:\Program Files (x86)\Avaya\CMS Supervisor R16\ascSRV.exe"
    Rep.References.AddFromFile "C:\Program Files (x86)\Avaya\CMS Supervisor R16\ascRep.exe"
    Catalog.References.AddFromFile "C:\Program Files (x86)\Avaya\CMS Supervisor R16\cvsctlg.dll"
    Else
    If Dir("C:\Program Files (x86)\Avaya\CMS Supervisor R17", vbDirectory) <> vbNullString Then
        cvsApp.References.AddFromFile "C:\Program Files (x86)\Avaya\CMS Supervisor R17\ascApp.exe"
        cvsConn.References.AddFromFile "C:\Program Files (x86)\Avaya\CMS Supervisor R17\cvsCONN.dll"
        cvsSrv.References.AddFromFile "C:\Program Files (x86)\Avaya\CMS Supervisor R17\ascSRV.exe"
        Rep.References.AddFromFile "C:\Program Files (x86)\Avaya\CMS Supervisor R17\ascRep.exe"
        Catalog.References.AddFromFile "C:\Program Files (x86)\Avaya\CMS Supervisor R17\cvsctlg.dll"
        Else
        If Dir("C:\Program Files (x86)\Avaya\CMS Supervisor R18", vbDirectory) <> vbNullString Then
            cvsApp.References.AddFromFile "C:\Program Files (x86)\Avaya\CMS Supervisor R18\ascApp.exe"
            cvsConn.References.AddFromFile "C:\Program Files (x86)\Avaya\CMS Supervisor R18\cvsCONN.dll"
            cvsSrv.References.AddFromFile "C:\Program Files (x86)\Avaya\CMS Supervisor R18\ascSRV.exe"
            Rep.References.AddFromFile "C:\Program Files (x86)\Avaya\CMS Supervisor R18\ascRep.exe"
            Catalog.References.AddFromFile "C:\Program Files (x86)\Avaya\CMS 
Supervisor R18\cvsctlg.dll"
            Else
                MsgBox ("ERROR: Avaya Files not found, Contact Admin")
        End If
    End If
End If
编辑#2-这是我获得的原始代码,其中包含基于工具部分构建的参考。我们大多数人都有多台服务器同时启动,所以它会调用cms服务器订单号(所以第三台服务器打开了,等等)。代码前显示的设置窗口:

设置
开始日期:2017年10月15日 截止日期:2017年10月21日 技能:**** 服务器订单:1 ACD:6

Dim cvsApp As New ACSUP.cvsApplication
Dim cvsConn As New ACSCN.cvsConnection
Dim cvsSrv As New ACSUPSRV.cvsServer
Dim Rep As New ACSREP.cvsReport
Dim Info As Object, Log As Object, b As Object
Dim logged As Boolean

Sub Clear_Report()

Sheets(Array("-1 (2)", "-2 (2)", "-3 (2)", "-4 (2)", "-5 (2)", "-6 (2)", "-7 (2)", _
    "-8 (2)", "-9 (2)", "-10 (2)", "-11 (2)", "-12 (2)", "-13 (2)", "-14 (2)", "-15 (2)", _
    "-16 (2)", "-17 (2)", "-18 (2)", "-19 (2)", "-20 (2)", "-21 (2)", "-22 (2)", "-23 (2)" _
    , "-24 (2)", "-25 (2)")).Select
Sheets("-1 (2)").Activate
Sheets(Array("-26 (2)", "-27 (2)", "-28 (2)", "-29 (2)", "-30 (2)", "-31 (2)", _
    "-32 (2)", "-33 (2)", "-34 (2)", "-35 (2)")).Select Replace:=False
Columns("A:AB").Select
Selection.ClearContents
Sheets("Auto").Select
End Sub

Sub Report_Run()
Call Unhide
Call Clear_Report
Call Report_a

End Sub



Public Sub Report_a()

Application.ScreenUpdating = 0


Call Move_down2


Sheets("Report Drop").Select
Range("b2:x4500").Select
Selection.ClearContents
Selection.Clear

Dim Serv As Integer
Dim Report As String
Dim Report2 As String
Dim B1 As String
Dim B2 As String
Dim B3 As String
Dim B1A As String
Dim B2A As String
Dim B3A As String
Dim ACDset As String
Dim B4 As String
Dim B4A As String
Dim Dropline As Integer

Serv = ThisWorkbook.Sheets("Auto").Cells(8, 2)
Report = ThisWorkbook.Sheets("Auto").Cells(2, 2)
'Report2 = ThisWorkbook.Sheets("Auto").Cells(51, 26)
'B1 = ThisWorkbook.Sheets("Auto").Cells(4, 2)
'B2 = ThisWorkbook.Sheets("Auto").Cells(5, 2)
'B3 = ThisWorkbook.Sheets("Auto").Cells(5, 26)
B1A = ThisWorkbook.Sheets("Auto").Cells(4, 3)
B2A = ThisWorkbook.Sheets("Auto").Cells(5, 3)
'B3A = ThisWorkbook.Sheets("Auto").Cells(8, 26)
Dropline = ThisWorkbook.Sheets("Auto").Cells(3, 2)


ACDset = ThisWorkbook.Sheets("Auto").Cells(9, 2)
Set cvsSrv = cvsApp.Servers(Serv) '(cvsApp.Servers.Count) '''''' we set a reference to the server here
Call Report_b(Report, ACDset, B1, B2, B3, B1A, B2A, B3A, B4, B4A)
ThisWorkbook.Sheets("Report Drop").Cells(Dropline, 2).PasteSpecial
logout
Application.ScreenUpdating = 1

    Sheets("Report Drop").Select
Range("A1:ab5000").Select
Selection.Copy
Sheets("-1 (2)").Select
Range("A1").Select
ActiveSheet.Paste



Application.ScreenUpdating = 1
Call Rep2
Sheets("Output").Select
End Sub

Sub Report_b(sReportName As String, ByVal ACDset As String, ByVal B1 As String, B2 As String, B3 As String, B1A As String, B2A As String, B3A As String, B4 As String, B4A As String)

On Error Resume Next
cvsSrv.Reports.ACD = ACDset ' In server03 ACD1=AD2  ACD2=KC ACD3=Core
Set Info = cvsSrv.Reports.Reports(sReportName)
If Info Is Nothing Then
If cvsSrv.Interactive Then
MsgBox "The Report " & sReportName & " was not found on ACD 1", vbCritical Or vbOKOnly, "CentreVu Supervisor"
Else
Set Log = CreateObject("ACSERR.cvslog")
Log.AutoLogWrite "The Report " & sReportName & " was not found on ACD 1"
Set Log = Nothing
End If
Else
b = cvsSrv.Reports.CreateReport(Info, Rep)
If b Then
Rep.Window.Top = 0
Rep.Window.Left = 0
Rep.Window.Width = 0
Rep.Window.Height = 0


Debug.Print Rep.SetProperty("Split/Skill(s)", B1A)
Debug.Print Rep.SetProperty("Date(s)", B2A)
Debug.Print Rep.SetProperty("Times", "00:00-23:30")
'Debug.Print Rep.SetProperty(B4, B4A)
b = Rep.ExportData("", 9, 0, True, False, True)
Rep.Quit
If Not cvsSrv.Interactive Then cvsSrv.ActiveTasks.Remove Rep.TaskID
Set Rep = Nothing
End If
End If
Set Info = Nothing
End Sub

Sub Rep2()
If ThisWorkbook.Sheets("Auto").Cells(6, 3) = "Y" Then Call Report_a
Sheets("Output").Select
'Call Macro4
Sheets("Output").Select
End Sub

Sub Hide()
'
Sheets("Report Drop").Visible = False
Sheets("-1 (2)").Visible = False
Sheets("-2 (2)").Visible = False
..(And so on)
'
End Sub

Sub Unhide()
'
Sheets("Report Drop").Select
Sheets("-1 (2)").Visible = True
..(And so on)
'
End Sub

Sub logout()
Set Log = Nothing
Set Rep = Nothing
Set cvsSrv = Nothing
Set cvsApp = Nothing
End Sub

对不起,这太多了,不能放在评论中,但这不是一个“答案”。 试着运行这个小程序。运行即时窗口时将其打开。也许它会帮助你看到你需要做什么来解决你的问题


注意:如果未识别作为参考的尺寸或误差:

  • 添加对VBIDE的引用:
    thispoolk.VBProject.References.AddFromGuid:=“{0002E157-0000-0000-C000-0000000000 46}”,主调:=5,副调:=3
  • 信任VBA项目对象模型(
    选项
    信任中心
    宏设置


您可以尝试替换4个早期绑定声明:

Dim cvsApp As New ACSUP.cvsApplication
Dim cvsConn As New ACSCN.cvsConnection
Dim cvsSrv As New ACSUPSRV.cvsServer
Dim Rep As New ACSREP.cvsReport
后期绑定,并从项目中删除Avaya CMS主管参考:

Dim cvsApp As Object, cvsConn As Object, cvsSrv As Object, Rep As Object
Set cvsApp = CreateObject("ACSUP.cvsApplication")
Set cvsConn = CreateObject("ACSCN.cvsConnection")
Set cvsSrv = CreateObject("ACSUPSRV.cvsServer")
Set Rep = CreateObject("ACSREP.cvsReport")

您的代码不能放在模块的
声明
部分。它必须位于
Sub
函数中
Sub FixReference()…如果…那么…如果结束Sub
那么现在它显示由于引用而丢失的对象。下面一行突出显示。那么我的推荐人的名字是错的吗?我怎么知道应该用什么名字来定义它们?Set cvsSrv=cvsApp.Servers(Serv)“”(cvsApp.Servers.Count)“”“我们在这里设置了对服务器的引用。您可以通过删除引用和类型来使用后期绑定,并且
Set cvsApp=CreateObject(“acsup.cvsApplication”)
好的,可能我遗漏了什么,但是上面列出的第一部分(Set cvsSrv)在报告运行中。我试图纠正的部分只是引用,不是完全的重建,而是在我的脚本中添加(我列出了脚本顶部定义的声明,这些声明也会导致ISSEU吗?)它会导致错误,就像它缺少其他正在定义的东西一样。现在子问题已经解决,部分代码不会抛出错误,只是在脚本的后期才抛出错误。还有什么我需要定义的来加载这些引用吗?为了澄清
Set-cvsApp=CreateObject(“acsup.cvsApplication”)
部分在报告中。如果有帮助的话,我可以在整个脚本中添加,但我也会在阅读过程中尝试学习,因为这必须在一系列其他不同的报告中实现(没有人制作所有这些…)什么是Application.References?它在Office 2010中对我不起作用-我需要添加引用吗?;-)它是Access应用程序对象的一部分。它保存数据库中的所有引用。我不知道为什么你不能使用它???尝试后期绑定为@slai recommendedAh-我的系统上没有安装MS Access。。。遗憾的是,Word&Excelah抱歉@slowI会在最初的报告或声明部分中这样做我需要保留cvscrlg.dll(目录dll)吗@Slai Edit-在所有具有早期binding.cvs声明(例如
as New ACSUP.cvsApplication
)的地方,放入声明会导致编译错误“Invalid outer Procedure”@user2907651。另外,如果使用后期绑定,则无需调用FixReference,所以我想我已经纠正了所有问题。我在模块中搜索了我们列出的所有内容,并对其进行了更改,但现在这一行
ThisWorkbook.Sheets(“Report Drop”).Cells(Dropline,2)。PasteSpecial
出现了1004错误。环顾四周,这似乎与范围不正确有关,但报告没有改变,只与我引用的应用程序有关。那么为什么会出现错误呢?您可以注释掉
子报告b
中的
On error Resume Next
行,查看错误是什么。如果您仅在
子报告_a
中使用上述4个cvs变量,我建议仅在
子报告_a
中声明它们,而不是将它们声明为子报告之外的全局变量。您还可以尝试编译项目(调试菜单>编译VBAProject),以查看是否出现任何错误。
Dim cvsApp As New ACSUP.cvsApplication
Dim cvsConn As New ACSCN.cvsConnection
Dim cvsSrv As New ACSUPSRV.cvsServer
Dim Rep As New ACSREP.cvsReport
Dim cvsApp As Object, cvsConn As Object, cvsSrv As Object, Rep As Object
Set cvsApp = CreateObject("ACSUP.cvsApplication")
Set cvsConn = CreateObject("ACSCN.cvsConnection")
Set cvsSrv = CreateObject("ACSUPSRV.cvsServer")
Set Rep = CreateObject("ACSREP.cvsReport")