Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.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
如果两个应用程序同时使用相同的工作簿,则工具in无法关闭这些工作簿(vba)_Vba_Excel - Fatal编程技术网

如果两个应用程序同时使用相同的工作簿,则工具in无法关闭这些工作簿(vba)

如果两个应用程序同时使用相同的工作簿,则工具in无法关闭这些工作簿(vba),vba,excel,Vba,Excel,我的VBA应用程序从.csv文件(作为原始文件)更新一些.xls文件(作为数据库文件)。 要更新这些.xls文件,应用程序将在查找文件(.xls文件)中查找一些信息,并在数据库中进行更新。如果我从不同的文件夹运行相同的应用程序来更新不同的数据库文件,但使用相同的查找文件,则应用程序工作正常,但最终无法关闭所有查找文件和原始文件。 应用程序也不会抛出任何异常。 我正在以只读模式打开这些查找文件。如何关闭这些文件而不保存它们? 请就这个问题提出建议 事实上,我是从windows调度器运行该工具的,所

我的
VBA
应用程序从.csv文件(作为原始文件)更新一些
.xls
文件(作为数据库文件)。
要更新这些.xls文件,应用程序将在查找文件(.xls文件)中查找一些信息,并在数据库中进行更新。如果我从不同的文件夹运行相同的应用程序来更新不同的数据库文件,但使用相同的查找文件,则应用程序工作正常,但最终无法关闭所有查找文件和原始文件。 应用程序也不会抛出任何异常。 我正在以只读模式打开这些查找文件。如何关闭这些文件而不保存它们? 请就这个问题提出建议

事实上,我是从windows调度器运行该工具的,所以当进程完成时,它会自动关闭所有东西。但我观察到的是,该工具没有关闭这些文件: -3查找文件,工具从中提取(读取)一些信息以更新数据库文件。 -最后打开的原始文件。 -上次打开的数据库文件

要打开查找文件和原始文件,我使用以下代码 设置Wbk\u machineLookup\u SN=Workbooks.Open(filenameanText,ReadOnly:=True)

要打开数据库文件,请执行以下操作: 设置wbk\u dtc\u Month=Workbooks.Open(文件名和路径)

我正在关闭查找和原始文件而不保存它们,代码为:

Public Sub CloseAllFiles()
 Dim StrName As String
 Application.ScreenUpdating = False
 On Error Resume Next

    StrName = ToCheckExtention(Form_TopLevel.TextBox_SubSystem_LookUp, 1)
    If Module2.IsXLBookOpen(StrName) = True Then
        Application.DisplayAlerts = False
        Wbk_SubSystem.Close Savechanges:=False
        Application.DisplayAlerts = False
        Set Wbk_SubSystem = Nothing
    End If

    StrName = ToCheckExtention(Form_TopLevel.TextBox_MachineSN_LookUp, 1)
    If Module2.IsXLBookOpen(StrName) = True Then
        Wbk_MachinLookUp_SN.Close Savechanges:=False
        Set Wbk_MachinLookUp_SN = Nothing
    End If

    StrName = ToCheckExtention(Form_TopLevel.TextBox_SwPn_Rel_LookUp, 1)
    If Module2.IsXLBookOpen(StrName) = True Then
        Application.DisplayAlerts = False
        Wbk_SW_ReleseasesLookup.Close Savechanges:=False
        Application.DisplayAlerts = False
        Set Wbk_SW_ReleseasesLookup = Nothing
    End If

    StrName = ToCheckExtention(Form_TopLevel.TextBox_SwPn_ESI_BR, 1)
    If Module2.IsXLBookOpen(StrName) = True Then
        Application.DisplayAlerts = False
        Module2.Wbk_sw_pn.Close Savechanges:=False
        Application.DisplayAlerts = False
        Set Wbk_sw_pn = Nothing
    End If

    Application.ScreenUpdating = True
    Application.EnableEvents = True
    Application.DisplayAlerts = True
    Application.Calculation = xlCalculationAutomatic

End Sub

Function ToCheckExtention(Str As String, Flag As Byte) As String

Dim IndexNo As Integer
Dim temp As String
Application.ScreenUpdating = False
IndexNo = InStr(Str, "\")
If IndexNo <> 0 Then
    temp = StrReverse(Str)
    IndexNo = InStr(temp, "\")
    Str = VBA.MID(temp, 1, IndexNo - 1)
    Str = StrReverse(Str)
End If

    IndexNo = InStr(Str, ".")
    If IndexNo <> 0 Then
        temp = VBA.MID(Str, IndexNo + 1, Len(Str))
        If temp = "xls" Or temp = "csv" Then
            ToCheckExtention = Str
            Exit Function
        End If
    ElseIf IndexNo = 0 Then
        If Flag = 1 Then
            Str = Str & ".xls"
            ToCheckExtention = Str
            Exit Function
        ElseIf Flag = 0 Then
            Str = Str & ".csv"
            ToCheckExtention = Str
            Exit Function
        End If
    End If
ToCheckExtention = Str
Application.ScreenUpdating = False
End Function


Function IsXLBookOpen(StrName As String) As Boolean
Dim i As Long, XLAppFx As Excel.Application, NotOpen As Boolean
Dim IndexNo As Integer
Dim temp As String
Application.ScreenUpdating = False
 'Find/create an Excel instance

IndexNo = InStr(StrName, "\")
If IndexNo <> 0 Then
    temp = StrReverse(StrName)
    IndexNo = InStr(temp, "\")
    StrName = VBA.MID(temp, 1, IndexNo - 1)
    StrName = StrReverse(StrName)
End If

On Error Resume Next
Set XLAppFx = GetObject(, "Excel.Application")
If Err.Number = 429 Then
    NotOpen = True
    Set XLAppFx = CreateObject("Excel.Application")
    Err.Clear
End If

 'Loop through all open workbooks in such instance
For i = XLAppFx.Workbooks.Count To 1 Step -1
    If XLAppFx.Workbooks(i).Name = StrName Then Exit For
Next i

 'Set all to False
IsXLBookOpen = False

 'Perform check to see if name was found
If i <> 0 Then IsXLBookOpen = True

 'Close if was closed
If NotOpen Then XLAppFx.Quit

 'Release the instance
Set XLAppFx = Nothing
Application.ScreenUpdating = False
End Function

我已经解决了不关闭所有文件的问题。 我已对函数“函数IsXLBookOpen”进行了修改

变化是:

Function IsXLBookOpen(StrName As String) As Boolean

Dim oBk As Workbook
On Error Resume Next
Set oBk = Workbooks(StrName)
On Error GoTo 0
If oBk Is Nothing Then
    IsXLBookOpen = False
Else
    IsXLBookOpen = True
End If

End Function

如果我以只读模式打开文件,则先前的函数没有返回正确的值。

我们需要查看一些编解码器。您能提供更多详细信息吗?你怎么知道他们没有关门?尝试关闭但显然不关闭excel文件的代码是什么?它们是怎么开的?等我们需要了解您的问题才能提供帮助。我已经编辑了我的帖子供您参考。原始文件,您是否正在将它们打开到Excel对象中?我接受了吗?如果是这样,在打开文件之前,不要试图解析所有打开的Excel实例,而是为它们指定一个对象变量。这将删除一个可能的断开连接。未关闭的工作簿只是查找文件。我正在为不同的查找文件创建不同的对象。我还使用excel对象打开和关闭查找文件。
Function IsXLBookOpen(StrName As String) As Boolean

Dim oBk As Workbook
On Error Resume Next
Set oBk = Workbooks(StrName)
On Error GoTo 0
If oBk Is Nothing Then
    IsXLBookOpen = False
Else
    IsXLBookOpen = True
End If

End Function