全部
我有一个很大的模块,在前面的部分中,它检查文件是否正在使用(只读)格式,以及是否正在使用它打开下一个文件。即如果文件一正在使用中,则打开文件二,依此类推。
在模块的后面,我希望使用已打开的文件。但是,我很难确定在自动化的早期部分中打开的文件并设置为WB。
我当前使用的代码是;
Dim wb As Object
On Error Resume Next
Workbooks("\\Csdatg04\psproject\Robot\Project Preload\Transactions\Transactions1.csv").Activate
If Err.Number = 0 Then
wb = GetObject("\\Csdatg04\psproject\Robot\Project Preload\Transactions\Transactions1.csv")
GoTo skipline
End If
On Error GoTo 0
On Error Resume Next
Workbooks("\\Csdatg04\psproject\Robot\Project Preload\Transactions\Transactions2.csv").Activate
If Err.Number = 0 Then
wb = GetObject("\\Csdatg04\psproject\Robot\Project Preload\Transactions\Transactions2.csv")
GoTo skipline
End If
On Error GoTo 0
On Error Resume Next
Workbooks("\\Csdatg04\psproject\Robot\Project Preload\Transactions\Transactions3.csv").Activate
If Err.Number = 0 Then
wb = GetObject("\\Csdatg04\psproject\Robot\Project Preload\Transactions\Transactions3.csv")
GoTo skipline
End If
On Error GoTo 0
On Error Resume Next
Workbooks("\\Csdatg04\psproject\Robot\Project Preload\Transactions\Transactions4.csv").Activate
If Err.Number = 0 Then
wb = GetObject("\\Csdatg04\psproject\Robot\Project Preload\Transactions\Transactions4.csv")
GoTo skipline
End If
skipline:
On Error GoTo 0
谁能建议我如何确定打开哪个文件并将其设置为WB
任何帮助将不胜感激。
谢谢
答案 0 :(得分:1)
请勿尝试匹配路径:映射的驱动器和别名会欺骗您的匹配项。
您的匹配项是带有扩展名的文件名,您可以迭代Excel工作簿集合以查看是否存在匹配的名称:
Option Explicit
Public Function WorkbookIsOpen(WorkBookName As String) As Boolean
' Returns TRUE if a workbook (or csv file open in Excel) is open
Dim wbk As Excel.Workbook
WorkbookIsOpen = False
If IsError(WorkBookName) Then
WorkbookIsOpen = False
ElseIf WorkBookName = "" Then
WorkbookIsOpen = False
Else
For Each wbk In Application.Workbooks
If wbk.Name = WorkBookName Then
WorkbookIsOpen = True
Exit For
End If
Next wbk
End If
End Function
Public Function FileName(FilePath As String) As String
' Returns the last element of a network path
' This is usually the file name, but it mat be a folder name if FilePath is a folder path:
' FileName("C:\Temp\Readme.txt") returns "ReadMe.txt"
' ?FileName("C:\Temp") returns "Temp"
' FileName("C:\Temp\") returns ""
' This function does not perform any file checking - the file need not exist, the path
' can be invali or inaccessible. All we're doing is String-handling.
Dim arr() As String
Dim i As Integer
If IsError(FilePath) Then
FileName = "#ERROR"
ElseIf FilePath = "" Then
FileName = ""
Else
arr = Split(Trim(FilePath), "\")
i = UBound(arr)
FileName = arr(i)
Erase arr
End If
End Function
然后只需检查打开的工作簿是否以只读方式打开:
Dim bReadOnly As Boolean
If WorkbookIsOpen("C:Temp\Brian.csv") Then
bReadOnly = Application.WorkBooks(FileName("C:Temp\Brian.csv")).ReadOnly
End If
如果您需要检查文件是否在另一个Excel会话或另一个应用程序中未打开,事情将变得更加有趣:此代码不会为您测试该文件。
我需要回答您问题的另一点:在Excel中打开文件(如果该会话尚未打开文件)。
我建议为此使用Application.Workbooks.Open(FileName)
,因为它比GetObject()
更智能,并且将Excel中的csv,xml,xls,xlsx文件作为工作簿打开,Excel会猜测必要格式参数。此外,本机的“打开”功能允许您指定其他参数,例如只读。