繁体   English   中英

检查哪个文件已打开VBA

[英]Check which file is open VBA

所有,

我有一个很大的模块,在前面的部分中,它检查文件是否正在使用(只读)格式以及是否正在使用它打开下一个文件。 即,如果文件一正在使用中,则打开文件二,依此类推。

在模块的后面,我希望使用已打开的文件。 但是,我正在努力确定在自动化的早期部分中打开的文件,并将其设置为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

任何帮助将非常感激。

谢谢

不要尝试匹配路径:映射的驱动器和别名会欺骗您的匹配项。

您的匹配项是带有扩展名的文件名,您可以迭代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会猜测必要的格式参数。 另外,本机的“打开”功能允许您指定其他参数,例如“只读”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM