January 29, 2015

VBAのコードをコピーしたのですがWindows 8で動きません、というときは

VBAやVBScriptのコードは様々なところにサンプルがあるので、何かしたいと思ったときにコピーするだけで必要な機能を実現できることも多いのですが、これらのプログラミング言語は単体で機能するというよりも、他のアプリケーションやオブジェクトを使用してこそ真価が発揮されるという性質がある故に、64bit版と32bit版では色々と違いがあるようです。

1. VBAではホストアプリケーションにより使えるコマンドと使えないオブジェクトがある
別記事で書きましたが、例えば、ScriptingControlは64bit環境では使えません。

2. WIN APIも異なっており、同じ式では呼び出せません。
例えば、urlmonを呼び出す場合でも、書き方を変えなえればなりません。

32 bit
Private Declare Function URLDownloadToFile Lib "urlmon" _ 
Alias "URLDownloadToFileA" (ByVal pCaller As Long, _ 
ByVal szURL As String, ByVal szFileName As String, _ 
ByVal dwReserved As Long, ByVal lpfnCB As Long) As Long

64 bit
Private Declare PtrSafe Function URLDownloadToFile Lib "urlmon" _
    Alias "URLDownloadToFileA" _
    (ByRef pCaller As LongPtr, _
     ByVal szURL As String, _
     ByVal szFileName As String, _
     ByVal dwReserve As Long, _
     ByRef lpfnCB As LongPtr) _
As LongPtr

Web上の情報は時間が古いものでも残っているために、解決法として書かれたコードがどのソフトウエア環境を前提としているのか、を良く確かめないと思わぬエラーの続発に悩まされることにななりそうです。
なお、2015年現在、既にWindows 8への移行は確実に進んでおり、Windows 10の時代になればほぼ64bit環境になるとは思うのですが、OSが大きく変化するときは今後も同じような問題が発生することはあるでしょう。言語仕様が変わらないだけに、安易に同じように書てしまってハマらないようにしたいものです。

No comments :

Post a Comment