我使用下面的连接字符串创建了与Excel文件的ADODB连接。即使在执行SQL CloseConnection proc之后,文件仍保持打开状态。我运行我的IsWorkBookOpen函数来检查文件是否打开并返回true,但是当我尝试关闭文件时,我得到的"下标超出范围"信息。这显然是无稽之谈,因为我不仅可以看到它开放,而且前一行告诉我它是。文件名和文件扩展名是正确的,并且'隐藏已知文件类型的扩展程序'在Windows资源管理器中设置为true。我尝试手动键入没有扩展名的文件名,并尝试使用set wb = workbooks(OutputFile)无济于事。任何有关这方面的帮助都会非常感激,因为我感到困惑,而且我必须锁定应用程序,直到我能解决这个问题。
以下是输出文件路径变量的定义:
Public Const OutputFile As String = OutputName & " v" & OutputVersion & ".xlsx"
Public Const OutputDir As String = RootDir & "\output\" & OutputFile
这是打开ADODB的连接字符串; ConnectionInfo.DataSource设置为OutputDir:
ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ConnectionInfo.DataSource & ";" & "Extended Properties=""Excel 12.0 XML;READONLY=" & CStr(ConnectionInfo.XLReadOnly) & ";HDR=YES"";"
这是关闭连接过程:
Public Sub CloseConnection()
On Error Resume Next
If Not cnn Is Nothing Then
cnn.Close
Set cnn = Nothing
End If
End Sub
这是我检查工作簿是否已打开的过程:
Public Function IsWorkBookOpen(FileName As String)
Dim ff As Long, ErrNo As Long
On Error Resume Next
ff = FreeFile()
Open FileName For Input Lock Read As #ff
Close ff
ErrNo = Err
On Error GoTo 0
Select Case ErrNo
Case 0: IsWorkBookOpen = False
Case 70: IsWorkBookOpen = True
Case Else: Error ErrNo
End Select
End Function
这是我用来关闭的行。 FYI在早期的脚本中使用InputDir和InputFile,它们的文件格式相同:
If modWindows.IsWorkBookOpen(OutputDir) Then Workbooks(OutputFile).Close SaveChanges:=0