Excelから拡張子で関連付けられたアプリを起動 [VBA/VBS]
以前「Word差込印刷をExcelから起動」でWordの差込印刷で苦労したが、
win32APIを使用すれば簡単に実現できたので、その時のコード。
サンプル
サンプルのexcelファイルはこちらでダウンロードできます。
'=============================================================== ' Win32 API shell32.dllによる拡張子に関連付けされたアプリ起動 ' shellEx(myFile As String)関数として定義 ' 引数: 起動したいファイル名 #If VBA7 Then Public Declare PtrSafe Function ShellExecute Lib "shell32.dll" _ Alias "ShellExecuteA" ( _ ByVal hwnd As Long, _ ByVal lpOperation As String, _ ByVal lpFile As String, _ ByVal lpParameters As String, _ ByVal lpDirectory As String, _ ByVal nShowCmd As Long) As Long Declare PtrSafe Function GetDesktopWindow Lib "user32" () As Long #Else Public Declare Function ShellExecute Lib "shell32.dll" _ Alias "ShellExecuteA" (ByVal hwnd As Long, _ ByVal lpOperation As String, _ ByVal lpFile As String, _ ByVal lpParameters As String, _ ByVal lpDirectory As String, _ ByVal nShowCmd As Long) As Long Public Declare Function GetDesktopWindow Lib "user32" () As Long #End If Global Const SW_SHOWNORMAL = 1 Function shellEx(myFile As String) As Long Dim lngRet As Long lngRet = ShellExecute(0, "open", myFile, vbNullString, vbNullString, SW_SHOWNORMAL) End Function
Access2003から2013への移行(Windows API) [VBA/VBS]
Access2003から2013作業した時の備忘録。
Access2003で作成されたアプリをAccess2013で動作するよう
修正依頼があり作業を開始。
Access2013で起動すると直ぐに
「コンパイルエラー:DeclareステートメントがPtrSafeを指定しない場合、
DeclareステートメントはWin32プラットフォーム上でのみコンパイルします。」
のエラーメッセージ。
どうやら起動したAccessが64Bit版なのでwin32 APIを使用している箇所で
エラーしている
ようなのでメッセージに従ってwin32 APIの宣言箇所にPtrSafeを追加。
追加前 Declare Function GetDesktopWindow Lib "user32" () As Long 追加後 Declare PtrSafe Function GetDesktopWindow Lib "user32" () As Long
これでこちらの環境で動作するようになったので依頼先渡した。
しかし、依頼先では動作しないとのこと。依頼先のAccessが32bit版だった
ので動作しないことが分かり、API宣言部を32/64bitで分けてコンパイル
するように変更。
#If VBA7 Then Declare PtrSafe Function GetDesktopWindow Lib "user32" () As Long #Else Declare Function GetDesktopWindow Lib "user32" () As Long #End If
のようにすると#Else以下が赤字でエラー表示。32bit側にもPtrSafeを追加すると
エラーしなくなたので依頼先に渡した。
#If VBA7 Then Declare PtrSafe Function GetDesktopWindow Lib "user32" () As Long #Else Declare PtrSafe Function GetDesktopWindow Lib "user32" () As Long #End If
ところが、また動かないとのこと。こちらには32bit版のAccessがないため
エラー詳細が分からない。やはりAPI宣言で32/64bitの切り分け部がおかしいとの
結論に達し、赤字でエラー表示する最初の宣言部に戻しコンパイルしてみると
なんとエラー無し。
これでやっと相手先でも動いた。
赤字でエラー表示したのでエラーかなと思って安易にPtrSafeを追加したのが
悪かった。
Excelでワイルドカードを含む名前を指定してブックを開く [VBA/VBS]
Excel VBAを使用してダウンロードしたデータを開く必要があり以下のコードで実現していた。しかし、ダウンロードフォルダー内にファイルが溜まり、必要なファイルを捜すのが面倒になってきた。
csvFile = Application.GetOpenFilename("Microsoft Excelブック, *.csv")
ワイルドカードを使用して必要ファイルのフィルターを試みたが"GetOpenFilename"は
拡張子のみワイルドカードに対応とのことでNG。
調べてみると、Dialogs.Showでワイルドカードで実現できることが分かったので
備忘録として記載。
Application.Dialogs(xlDialogOpen).Show "xxデータ_*.csv"
csvFile = ActiveWorkbook.Name