[[20170803012254]] 『VBAでWin32APIを動的に呼び出すには』(:;:;:;:;:;) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『VBAでWin32APIを動的に呼び出すには』(:;:;:;:;:;)

VBAでは、DLLの関数を使用する時に、Declareステートメントで最初に宣言するようになっています。使う関数が変わる(例えば、BitBltを使っている所をAlphaBlendに置き換える)度に宣言文も変更していくのは大変で、ミスも増えます。宣言をせずにコードの中で動的に呼び出す方法はないでしょうか。

< 使用 Excel:Excel2013、使用 OS:Windows10 >


.NETのFrameWorkの部品等なら、CreateObjectで動的に宣言し開放できるのですが、DeclareするAPIの場合は固定宣言だけですね。

というか、宣言文を変えるのは使用するAPIが変わる今回だけであり、将来は変更しないと思うのですが、いかがでしょうか? API自身の引数体系がコロコロ変わる訳ではないですよね。 面倒でも、全てのマクロを書き換えるしか無いのではないかと思います。

以前のExcelならば、肝心のコードはサーバ等に置き、マクロ自身でマクロを書き換える手法で、1つ変えれば利用している全てが変わる、なんて事が実現できたのですが、近年はExcelのセキュリティが向上し、デフォルトでは自身の書き換えができなくなってしまいました。(今でもセキュリティレベルを下げれば動作しますが、お薦めはしていない方法です)

または、環境変数を使って、#If 文で、以下のように使用する Declare を変える事もできますが、やりたいのはこういう事でしょうか?
(32bit環境と64bit環境で、API宣言を変える例)

 #If VBA7 Then
    Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr)
 #Else
    Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
 #End If
(???) 2017/08/03(木) 09:14

???さん、ありがとうございます。

>やりたいのはこういうことでしょうか?
>#If VBA7 Then
> Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr)
>#Else
> Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
>#End If

コンパイル時ではなく、実行時に変数の値によって使い分けたいのですが、やはりその場合はすべてはじめに宣言するしかないですかね。
(:;:;:;:;:;) 2017/08/03(木) 10:39


AlphaBlendとなると、画像の透過処理ですよね。 私もAPIでしか知らないのですが、APIなら、始めに宣言するのみかと思います。 ただし、同じ事ができるFrameWork等があれば違ってきますので、探してみてください。(ありそうで、無さそう…)

または、シート上ならば、Excelの図形オブジェクトとして画像を貼ってしまえば、これはプロパティに透明度があるのですが、この方法では目的を果たせませんかね?(API使うくらいだし、おそらくUserForm上の話であり、駄目なのかなぁ、とは推測しますが…)
(???) 2017/08/03(木) 10:50


とりあえず、使いそうな関数は全て最初に宣言しておくようにします。
???さん、無茶な質問に付き合ってくださり、ありがとうございました。
(:;:;:;:;:;) 2017/08/03(木) 12:37

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.