2

これは前の質問からの続きです。Excel ファイルが Outlook マクロ (Office 2010) からローカルで開いているかどうかを確認するために、提案された修正を試みました。

Public Sub UpdateFileIndex(ByVal FullFilePath As String, ByVal DocNo As String)
    Dim xlApp As Excel.Application
    Dim xlBook As Excel.Workbook
    Dim xlSheet As Excel.WorkSheet
    
    On Error Resume Next
    Set xlApp = GetObject(FullFilePath).Application
    Debug.Print "Error = " & Err

    If Err.Number = 0 Then ' Workbook is open locally
        ' Do stuff
    ElseIf Err.Number = 429 Then ' Workbook is not open locally
        ' Do different stuff
    End If

    ' Do a bunch of other stuff
End Sub

FullFilePath(例: )で指定された開いているファイルまたは閉じているファイルの場合"C:\Data\Data.xlsx":

  • Set xlApp = GetObject(FullFilePath).Application

どちらの方法でもエラーは0です。(つまり、ファイルが開いていない場合は開きます。)

  • Set xlApp = GetObject(Dir(FullFilePath)).Application

どちらの場合も -214722120 になります。(自動化エラー)

  • Set xlApp = GetObject(, "Excel.Application")

開いているときは0、開いていないときは429になります。下記参照。

  • Set xlApp = GetObject(Dir(FullFilePath), "Excel.Application")

どちらの場合も432になります。(自動化操作中にファイル名またはクラス名が見つからない)

  • Set xlApp = GetObject(FullFilePath, "Excel.Application")

どちらの場合も432になります。

そのため、最初に提案された修正 (上部のリンクを参照) が機能する唯一のケースは、ローカルで開いている Excel の最初のインスタンスにない限り、ファイルを見つけることができません。実例)。

最終的に、ファイルがネットワーク上で開いているかどうかを確認し、ローカルで開いているかどうかを確認したいと思います。

4

4 に答える 4

2

Excelファイルが開いているかどうかを確認するには、この関数を使用できます。

Sub Sample()
    Dim Ret
    Dim sFile As String

    sFile = "C:\Users\Chris\Desktop\Data.xlsx"
    Ret = IsWorkBookOpen(sFile)

    If Ret = True Then
        MsgBox "File is Open"
    Else
        MsgBox "File is not Open"
    End If
End Sub

'~~> Function to check if file is open
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
于 2012-06-28T08:03:32.720 に答える
-1

ファイルが開いているかどうかを確認し、開いている場合はオブジェクトを取得できます

Public Shared Function isFileAlreadyOpen(ByVal xlFileName As String) As Boolean
    Return CBool(Not getIfBookOpened(xlFileName) Is Nothing)
End Function

Public Shared Function getIfBookOpened(ByVal xlFileName As String) As Excel.Workbook
    Dim wbBook As Excel.Workbook
    Dim xlProcs() As Process = Process.GetProcessesByName("EXCEL")
    If xlProcs.Count > 0 Then
        Dim xlApp As Excel.Application = CType(System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application"), Excel.Application)
        For Each wbBook In xlApp.Workbooks
            If wbBook.FullName.ToUpper = xlFileName.ToUpper Then
                Return wbBook
                Exit For
            End If
        Next
    End If
    Return Nothing
End Function

また

Public Shared Function getOrOpenBook(ByVal xlFileName As String) As Excel.Workbook
    Return System.Runtime.InteropServices.Marshal.BindToMoniker(xlFileName)
End Function
于 2013-09-10T09:26:17.590 に答える