ここから本文です

VBAで今まで動いていたWin64 APIのコードが突然、2019年のゴールデンウイーク中に...

love2mytomさん

2019/5/800:32:44

VBAで今まで動いていたWin64 APIのコードが突然、2019年のゴールデンウイーク中に動かなくなりました。

「型が一致しません」のエラーが出るのですが、どうやらウィンドハンドルの取得に失敗しているようです。

プロシージャはいくつかあるのですが、その中の1つを掲示しますので、原因がお分かりの方、もしくは対処法がお分かりの方、ご教授をいただけますと幸いです。

環境は以下のとおりです。
Windows10(自動アップグレード)+バージョン1809(ビルド17763.475)
Excel365(バージョン1904、ビルド11601.20144クイック実行)32bit

(宣言部分)
Declare PtrSafe Function GetNextWindow Lib "user32" _
Alias "GetWindow" _
(ByVal hwnd As Long, _
ByVal wFlag As Long) As LongPtr

Declare PtrSafe Function IsWindowVisible Lib "user32" _
(ByVal hwnd As Long) As LongPtr

Declare PtrSafe Function GetWindowText Lib "user32" _
Alias "GetWindowTextA" _
(ByVal hwnd As Long, _
ByVal lpString As String, _
ByVal cch As Long) As LongPtr

(コードの抜粋)

Sub Sample()
Dim hwnd As LongPtr
Dim strClassName As String * 100
Dim strCaption As String * 80

hwnd = FindWindow(vbNullString, _
vbNullString)

Do
If IsWindowVisible(hwnd) Then

GetWindowText hwnd, strCaption, Len(strCaption)

GetClassName hwnd, strClassName, Len(strClassName)

End If

hwnd = GetNextWindow(hwnd, GW_HWNDNEXT)

Loop Until hwnd = GetNextWindow(hwnd, GW_HWNDLAST)

End Sub

上記コードで、IsWindowVisible関数のところでエラーが出ます。

他のプロシージャでも、ウィンドウハンドルの取得のところでエラーが出るときがありますので「hwnd」が原因と思われますが、今まで問題なく動いておりましたので、まったく原因がわかりません。

お分かりの方、ご教授のほどよろしくお願い申し上げます。

閲覧数:
142
回答数:
2
お礼:
250枚

違反報告

ベストアンサーに選ばれた回答

プロフィール画像

カテゴリマスター

hot********さん

2019/5/815:18:49

回答ではないのですが、hat********さんへ

LongPtr はVBAのバージョン7以降(Excel2010以降だったと思う)から用意された疑似変数で、例えば

Dim d as LongPtr

と言う命令があった場合、32ビットのExcelでは4バイトの

Dim d as Long

に解釈され、64ビットのExcelでは8バイトの

Dim d as LongLong

に解釈されます。
これを使えば、32ビットも64ビットも同じAPIの宣言で済みます。

なので質問の
Dim hwnd As LongPtr
は、32ビット版では
Dim hwnd As Long
と同じ事になります。

  • hot********さん

    2019/5/1204:34:40

    >Dim hwnd As LongPtr
    >Declare PtrSafe Function IsWindowVisible Lib "user32" _
    (ByVal hwnd As Long) As LongPtr

    と宣言されていて

    >If IsWindowVisible(hwnd) Then

    で「型が一致しません」が出る場合は、最初に考えるのは64ビットのExcelだからという事です。
    エラーが出るExcelで以下を試してみて下さい。
    64ビット版か32ビット版かを表示します。

    Sub sample()
    #If Win64 Then
    MsgBox "64ビット"
    #Else
    MsgBox "32ビット"
    #End If
    End Sub




返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

この回答は投票によってベストアンサーに選ばれました!

ベストアンサー以外の回答

1〜1件/1件中

プロフィール画像

カテゴリマスター

hat********さん

2019/5/811:17:34

> Excel365(バージョン1904、ビルド11601.20144クイック実行)32bit

Excel は 32bit版なんですよね。
LongPtr は64bit版しか使えません。
すべての LongPtr を Long に変更してください。

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる