2017-06-01 4 views
0

データを取得するために別のファイルを開くコードを使用しています。 これは、​​という名前のどこかで見つかった関数を使用して、ファイルがすでに開いているかどうかを確認します。 このコードはうまくいきますが、読み取り専用モードで動作させようとしています。Excel VBAの読み取り専用モードを認識する関数

私がしたいのは、ファイルを読み取り専用モードで開くことです。 だから私は読み取り専用でファイルを開くには、このコードを更新しようとしているが、マクロがファイルを認識しない Workbooks.Open FileName:="R:\Development\Copy of Product Information.xlsm", ReadOnly:=True, Password:="bcd"

を更新し、既に(読み取り専用モードで)開いていると、再びそれを開こうとします。

Ret = IsWorkBookOpen("R:\Development\Copy of Product Information.xlsm") 
If Ret = True Then 
      Workbooks("Copy of Product Information.xlsm").Activate 
      Sheets("Main").Select 
Else 
     Workbooks.Open FileName:="R:\Development\Copy of Product Information.xlsm", Password:="bcd" 
     Sheets("Main").Select 
End If 

​​機能コード:

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 

私は、読み取り専用モードにしてください処理するために​​を変更する方法を知っていただきたいと思います。

答えて

0

このような何かが(追加の参照を必要とせずに)動作すると、ブックは、アプリケーションによって開かれ、そして、ブックが読み取り専用であるかどうかであるかどうかを教えてくれます。既定では、ブックは開いている場合にのみtrueを返し、読み取り専用です。

Function IsWorkBookOpen(ByVal FileName As String) As Boolean 
    Dim TargetWorkbook As Workbook 

    Dim IteratorWorkbook As Workbook 
    For Each IteratorWorkbook In Application.Workbooks 
     If IteratorWorkbook.FullName = FileName Then 
      Set TargetWorkbook = IteratorWorkbook 
     End If 
    Next 

    If Not TargetWorkbook Is Nothing Then 
     If TargetWorkbook.ReadOnly Then 
      IsWorkBookOpen = True 
      Exit Function 
     End If 
    End If 
End Function 
+0

ループでXLA/XLAMワークブックが見つかりません。あなたの文字列比較はバイナリ比較です。 'TargetWorkbook'が設定されるとすぐにループを終了することができます。 'ReadOnly'プロパティは、ファイルが読み取り専用属性を持っているのではなく、Excelがファイルを読み取り専用として開いているかどうかを示します。 – ThunderFrame

1

読み取り専用のブックを開く場合、他のプロセスやユーザーがファイルを開いていない限り、関数は常にfalseを返します。ファイルは読み取り専用でとしてマークされている場合を教えてくれますどの、以下のことを試してみてください

Function IsWorkbookOpen(sWbName As String) As Boolean 
    Dim oWb As Workbook 
    On Error Resume Next 
    Set oWb = Workbooks(sWbName) 
    IsWorkbookOpen = (Err.Number = 0) 
End Function 
+0

このコードを試しましたが、この関数を使用すると、マクロはファイルが既に開いていることを認識しませんでした。私はページの下にある他の解決策の1つを使用しました – Jeanclaude

+0

私は制限を言及しました:ファイルが現在のExcelセッションで開いているかどうかをチェックしてください。あなたのことを思い出してください。関数が期待する引数は、ファイル名であり、パスはありません。 – jkpieterse

+0

あなたのソリューションとコメントをありがとう、私はあなたの答えをupvotedしました。 – Jeanclaude

2

:あなただけのワークブックは、現在のExcelセッションで開いているかどうかを確認する必要がある場合は、あなただけのようなものを使用することができますファイルシステムレベル。アプリケーションによって読み取り専用で開かれたファイルとは異なります。

'Add a reference to Microsoft Scripting Runtime 

Function FileIsReadOnly(filePath As String) As Boolean 

    Dim fso As Scripting.FileSystemObject 
    Set fso = New Scripting.FileSystemObject 

    Dim fil As Scripting.File 
    Set fil = fso.GetFile(filePath) 
    FileIsReadOnly = fil.Attributes And ReadOnly 

End Function 
関連する問題