Проверьте, какой файл открыт 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
Любая помощь приветствуется.
Спасибо
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()
и откроет файл - csv, xml, xls, xlsx - в Excel, как рабочую книгу, в которой Excel угадает необходимые параметры формата. Кроме того, встроенная функция "open" позволяет указывать дополнительные параметры, например, только для чтения.