SSブログ

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


この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。