Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.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 如果宏在调用VBS时引发错误,如何安全地退出EXCEL_Vba_Vbscript - Fatal编程技术网

Vba 如果宏在调用VBS时引发错误,如何安全地退出EXCEL

Vba 如果宏在调用VBS时引发错误,如何安全地退出EXCEL,vba,vbscript,Vba,Vbscript,我的VBS: 全流: Dim WshShell, strCurDir Set objExcel = CreateObject("Excel.Application") Set WshShell = CreateObject("WScript.Shell") strCurDir = WshShell.CurrentDirectory Set objworkBook = objExcel.Workbooks.Open(strCurDir & "\MasterSheetFetchJob.xls

我的VBS:

全流:

Dim WshShell, strCurDir
Set objExcel = CreateObject("Excel.Application")
Set WshShell = CreateObject("WScript.Shell")
strCurDir = WshShell.CurrentDirectory
Set objworkBook = objExcel.Workbooks.Open(strCurDir & "\MasterSheetFetchJob.xlsm")
objworkBook.Fullflow
objExcel.ActiveWorkbook.Close
objExcel.Application.Quit
WScript.Quit
Sub-Fullflow()
黯淡的主人
设置Host=CreateObject(“BZWhll.WhllObj”)
Retval=Host.Connect(“A”)
如果(返回)那么
“Host.MsgBox”连接到会话A时出错!”,48
如果结束
Host.ReadScreen localorvpn,28,2,2
'根据连接类型在TPXA或L TPX中输入命令
如果localorvpn=“请输入‘命令’登录”,则
Host.WriteScreen“tpx”,3,4
其他的
Host.ReadScreen vpn,13,17,5
如果vpn=“L应用程序”,则
Host.WriteScreen“L TPX”,24,7
其他的
'MsgBox(“已登录”)
退出功能
如果结束
如果结束
Host.SendKey“”
'等待用户ID文本出现在登录屏幕中
WaitForScreen“Userid”,11,5
Host.SendKey用户名
Host.SendKey“”
Host.SendKey mfp
Host.WaitReady 101000
Host.SendKey“”
WaitForScreen“MSGID”,1,2
Host.SendKey“”
“TPXMenu…”。。。。
等待屏幕“sessiond”,6,6
端接头
一切正常时,它工作正常。。但在执行过程中,如果主机出现问题。。它停止了死刑没关系。。但如果我们打开excel,它会显示它只准备好了,没有打开。。如果我们在不杀死excel的情况下再次运行。。工作簿已损坏,无法使用

所以每次我们在excel开始执行之前杀死它。。但问题是,如果我们还有其他未保存的工作簿也正在关闭。。这是处理此错误的唯一方法吗

有什么建议吗

  • 首先,我将以不同的方式调用
    FullFlow
    Sub
    (在脚本代码中): 我会改变

    objworkBook.Fullflow

  • 那么,避免向“主机”应用程序发送密钥是否还有其他可能性?我的意思是,使用API(FindWindow、FindWindowEx和SendMessage)。使用Spy++查看窗口子窗口三,并找到确定控件处理程序的适当方法。。。我不使用此应用程序。否则,我可以帮助您编写一些特定的代码

  • 出于好奇:为什么要使用Excel来运行该函数,而该函数不会在工作表上返回任何内容(从我看到的情况来看),并且不直接在VBScript中编写该函数?这不会有太大的不同,我想。。。除了需要API时,VBScript在这方面有问题

  • 首先,我将以不同的方式调用
    FullFlow
    Sub
    (在脚本代码中): 我会改变

    objworkBook.Fullflow

  • 那么,避免向“主机”应用程序发送密钥是否还有其他可能性?我的意思是,使用API(FindWindow、FindWindowEx和SendMessage)。使用Spy++查看窗口子窗口三,并找到确定控件处理程序的适当方法。。。我不使用此应用程序。否则,我可以帮助您编写一些特定的代码

  • 出于好奇:为什么要使用Excel来运行该函数,而该函数不会在工作表上返回任何内容(从我看到的情况来看),并且不直接在VBScript中编写该函数?这不会有太大的不同,我想。。。除了需要API时,VBScript在这方面有问题


  • 这是主机自动化使用火箭蓝区。它只支持宏和vbs如果我们使用Run调用它,它不会锁定Excel?@ChanGan:如果支持vbs,为什么还要使用Excel?然后,我不能确定是否会产生错误锁,但使用Excel automation从工作簿调用sub是一种更合适的方法…最初计划仅使用vbs。。但对于vbs,每当我更改代码时,我都会使用bit9块来解锁它。。所以我淘汰了that@ChanGan:关于API方法,为了避免
    Sendkey
    ,这可能是错误的来源…它是使用Rocket Bluezone的大型机自动化。它只支持宏和vbs如果我们使用Run调用它,它不会锁定Excel?@ChanGan:如果支持vbs,为什么还要使用Excel?然后,我不能确定是否会产生错误锁,但使用Excel automation从工作簿调用sub是一种更合适的方法…最初计划仅使用vbs。。但对于vbs,每当我更改代码时,我都会使用bit9块来解锁它。。所以我淘汰了that@ChanGan:API方法如何,以避免
    Sendkey
    ,这可能是错误源。。。
    Sub Fullflow()
        Dim Host
        Set Host = CreateObject("BZWhll.WhllObj")
        Retval = Host.Connect("A")
        If (Retval) Then
            'Host.MsgBox "Error connecting to session A!", 48
        End If
        Host.ReadScreen localorvpn, 28, 2, 2
        'Enter Command in the TPXA or L TPX based on the connection Type
        If localorvpn = "PLEASE ENTER 'Command' TO LOGON" Then
            Host.WriteScreen "tpx", 3, 4
        Else
            Host.ReadScreen vpn, 13, 17, 5
            If vpn = "L application" Then
                Host.WriteScreen "L TPX", 24, 7
            Else
               'MsgBox ("Already logged in")
               Exit Function
            End If
        End If
        Host.SendKey "<ENTER>"
        'Waitfor UserId Text to appear in Login screen
        WaitForScreen "Userid", 11, 5
        Host.SendKey Username
        Host.SendKey "<TAB>"
        Host.SendKey mfp
        Host.WaitReady 10, 1000
        Host.SendKey "<ENTER>"
        WaitForScreen "MSGID", 1, 2
        Host.SendKey "<ENTER>"
        'TPXMenu....
        WaitForScreen "Sessid", 6, 6
    End Sub
    
    objExcel.Application.Run "'" & strCurDir & "\MasterSheetFetchJob.xlsm" & "'!Fullflow"