昨日、imihitoさんからのアドバイスを利用するために書き換えてみました。
読み取り専用でファイルを開く1 - C#ATIA
VBA.FileSystem.SetAttr/GetAttr関数を利用して進めていたのですが、
ファイルの存在をチェックや拡張子を取得する関数類がVBA.FileSystemには
存在していないようなので、結局FileSystemObjectを利用し、
(文句を書いた)VBA.VbFileAttribute列挙型のみを利用しました。
'vba sample_FileOpen_ReadOnly_ver0.0.2 '読み取り専用でCATIAなファイルを読み込む Option Explicit Sub CATMain() 'ファイル選択 Dim OpenFilePath As String Dim Msg As String: Msg = "読み取り専用で開くファイルを選択してください" OpenFilePath = CATIA.FileSelectionBox(Msg, "*.CAT*", CatFileSelectionModeOpen) If OpenFilePath = vbNullString Then Exit Sub 'ファイルを開く Call CatOpen_ReadOnly(OpenFilePath) End Sub '読み取り専用で開く ''' @param:Path(string) ファイルパス ''' @return:Boolean True-成功 False-失敗 Private Function CatOpen_ReadOnly(ByVal Path As String) As Boolean CatOpen_ReadOnly = False 'FileSystemObject Dim Fso As Object Set Fso = CreateObject("Scripting.FileSystemObject") '許可する拡張子リスト Dim ExtensionAry As Variant ExtensionAry = Array("CATProduct", "CATPart", "CATDrawing") '拡張子チェック If UBound(Filter(ExtensionAry, Fso.GetExtensionName(Path))) < 0 Then MsgBox Path & vbNewLine & "は、該当しない拡張子です" Exit Function End If 'ファイル有無 If Not Fso.FileExists(Path) Then MsgBox Path & vbNewLine & "が見つかりませんでした。" Exit Function End If 'ファイル属性取得 Dim Original As VbFileAttribute Original = Fso.GetFile(Path).Attributes '属性チェックし読み込み If Original And vbReadOnly = vbReadOnly Then Call CATIA.Documents.Open(Path) Else Fso.GetFile(Path).Attributes = vbReadOnly Call CATIA.Documents.Open(Path) Fso.GetFile(Path).Attributes = Original End If CatOpen_ReadOnly = True End Function
利用しやすいように、CatOpen_ReadOnly関数一本のみとしてます。
FileSelectionBoxを利用せずに、直接ファイルパス指定する場合は
Sub CATMain() 'ファイルを開く If CatOpen_ReadOnly("C:\temp\CubeInCube.CATPart") Then MsgBox "開けました" Else MsgBox "開けませんでした" End If End Sub
こんな感じで大丈夫です。
(厳密な成功失敗の判断は、ウィンドウ数をチェックした方が正しいかも)
実は、ファイル属性に読み込み専用が含まれているかどうかを判断する関数を
こんな感じで作ってみたのですが
Private Function IsReadOnly(ByVal AttrType As VbFileAttribute) As Boolean IsReadOnly = AttrType And vbReadOnly = vbReadOnly End Function
一行に二つの "=" が・・・。 左は代入のイコールで、右が比較のイコールです。
VBAの悪魔仕様が出てきて気持ち悪かったので、却下しました。