Help us understand the problem. What is going on with this article?

VBAでWinAPI32を使うためのリンク集

重要 2018/09/24よりOfficeは64bitでインストールされます

https://it.srad.jp/story/18/09/28/0614240/
このため、そのままインストールしてすると従前は32Bitでしたが、この日以降は64Bitになります。これはOffice2016でもクリーンインストールすれば発生します。Windows Storeでも同様です。インストールした場合は一度アンインストールする必要があります。同居はできません。
また64bit版にはなんのメリットもなく、デメリット以外存在しません。MSが64bitに乗り遅れたくないということだけです。ユーザーには1円も1分も全く意味やメリット、恩恵はありません。MSやITメディアが記述する64Bitのメリットなど全く関係がありません。高速化もしません。逆に使えないDLLがでてきて、しかもそのDLLに対してマイクロソフトはなんの対策も取っておらずサードパーティもなにもありません。そうしたことをマイクロソフトは全く説明しておらず、極めて悪質であると言わざるを得ません。また、すべてのITに関するメディアも信用ができないです。このため必ず32Bitにしてください。だまされて64Bitにして「〇〇が動かない」といったときのQAサイトの「だまされたお前が悪い。」「大体のDLL、そんなもんねーよ。使うお前が悪いんだ」みたいに罵倒され嘲笑されるだけです。こんなくやしくお金も時間もかかる後悔をするよりまず32Bitにしましょう。
Win32APIに関してはデメリットははっきりしています。

64Bit化がだめな理由 DeclareがDeclare PTRSAFE が必要で全部エラーになる

このため、すべてのDeclareに Declare PtrSafe をつけないと全く動きません。すべて必ずエラーになります。例外はありません。
これをすべての宣言で行わなければいけません。ですが、それでもほぼすべて動かないのです。

64Bit化がだめな理由PointerがLongPtrになる。これがDim Typeまで及ぶ

ポインターを表すLongをLongPtrに変える必要がありますが、このような記述は肝心なことが抜けています。これにともないTypeステートメント(構造体/Constractor)及びConstにも変更するものがあります。Dimステートメントもそうです。Declare部分だけではなく、Subプロシージャでもあり得ます。このためConstディレクティブ IFディレクティブを使用し、複雑で長くなります。この変更はいまのところ確定した技術がすべてネットで検索できるわけでもなく、マイクロソフトが公式に情報を提供しているわけでもありません。Win64bit APIの情報はC++やVBを前提としており、VBAはほとんどありません。2005年のITメディアは移行は簡単と書いていますが、VBAに関してはあてはまりません。

64bit化対応のモジュール(2020/11/23追加)

VBA APIコール sodocumentation.net
モジュールとしてすべて集めている模様。
ただし、関数名にすべてapiが追加されているが、通常はapiは付けない。

年代別

WinApi32は2000で用いられてその後失速するのがわかるけど、重要なことは2000年に集中している

1999

Welcome to MASAPICO'S Page
CとVBを比較して載せてある。2003年までしか更新がないが、ここに乗っている比較はロゼッタストーンに匹敵する。VBだがVBAにも変換は可能。

2000 WinApi 32

Microsoft Office (全般) >コラム > Office Talk Office VBA と Windows AP 日本語版最終更新日 2001年4月26日

Microsoft Office 2000/Visual Basic プログラマーズ ガイド

第 2 部 Office ソリューションの開発

第 10 章 Windows API とその他のダイナミック リンク ライブラリの項目一覧

Windows 2000 >グラフィックおよびマルチメディア > GDI Windows GDI
ユーザー定義型を渡す

Microsoft Office 2000/Visual Basic プログラマーズ ガイド
Declare ステートメントの構造
Windows 開発 >Windows 2000 > ユーザー インターフェイス デザインおよび開発

Windows 開発 >Windows 2000 > グラフィックおよびマルチメディア > GDI >Windows GDI

Windows 開発 >Windows 2000 > グラフィックおよびマルチメディア > Image Color Management (ICM) > 色の管理

Windows 開発 >Windows 2000 > グラフィックおよびマルチメディア >Windows マルチメディア > リファレンス > Windows マルチメディア 関数一覧

Windows API について
アーカイブコンテンツ
ここで提供しているコンテンツは提供時のままであり、現在でも技術的に正確であるという保証はありません。当時は有効であった URL が、現在では存在しないサイトやページにリンクしているかもしれないことに注意してください。

2005

時代に遅れないためのWin64用アプリケーション開発 (2/3) 2005年06月15日 00時00分 ITMedia EnterPrise
Windows API
 64ビットWindows環境でも、大部分のWindows APIはWin32から変更なしで利用することができます。ただし、いくつかのAPIは拡張されたデータ型を使用するために引数の型が変更されました。
 また、64ビット引数を2つの引数に分割するなど、APIそのものが変更されたものもあります。そして、Windowとクラスに関するポリモーフィック(〜Ptr)なAPIも追加されています。
時代に遅れないためのWin64用アプリケーション開発 (3/3) 2005年06月15日 00時00分 ITMedia EnterPrise

?ポインタをint、long、ULONG、DWORDなどにキャストしてはならない
?ポインタの型変換には、PtrToLongやPtrToUlong関数を使うこと
?Win64はLLP64のプログラミングデータモデルなので、引数によってポインタを得るような関数には注意する
?ポリモーフィックAPIに注意する
?新しいWindowクラス関数および定義を使う
?size_t、HANDLE、LPARAM、WPARAM、LRESULTなど派生タイプのデータ型はプラットホームによってサイズが変わることに注意
Windows API 32 のサンプル - NonSoft
32Bit Api
Windows API:VB6・VBAでの宣言一覧(A) フィロの村 Note
NONSoftのページと同じく網羅系
32 APIのみ

MOUG 即効テクニック > AccessVBA > Windows環境・オブジェクト
この中に実はWinAPIサンプルがあるが、32Bit版のまま

Office 2010 VBA7 Win64

2010

Declaring API functions in 64 bit Office
Windows API Code Pack連載 第1回〜第10回の一覧
※ 特に記載がない限り、開発ツールはVisual Studio 2010、開発言語はC#を使用して説明しています。
Visual Basicのコードが必要な方は、以下のサイトにあるWindows API Code Packのセッションの資料をダウンロードしていただければ、スライドの後半にVBのコードを掲載していますので、ご参照いただけます。
Office 2010 Help Files: Win32API_PtrSafe with 64-bit Support
Windows API Declarations and Constants for Visual Basic (Updated for the 64-bit version of Microsoft Office 2010) provides declarations for Microsoft Visual Basic programmers who want to call Windows API routines. This file is updated to include calls to the 64-bit version of Microsoft Office 2010.
Version:0410
File Name: Office2010Win32API_PtrSafe.exe
Date Published: 4/28/2010
File Size: 688 KB
Versions of MicrosoftR Office and Microsoft Visual BasicR for Applications (VBA) prior to Microsoft Office 2010 and Visual Basic for Applications 7.0 (VBA 7) included the file, Win32API.txt, which facilitated making calls to the Microsoft Windows API. With the addition of 64-bit support in Microsoft Office 2010, an update to this file is needed to support 64-bit API calls. Win32API_PtrSafe.txt is a new version of Win32API.txt that supports API calls on both 32-bit and 64-bit versions of Windows.
Win32API_PtrSafe.txt contains the following:
?32-bit (x86) and 64-bit (x64) compatible Declare statements for the Windows API functions that were included in the original Win32API.txt file.
?Global constant declarations for the constants that the provided Declare statements use.
?Type declarations for the user-defined types (structures) that the provided Declare statements use.
Microsoft API and reference catalog
英語版
Microsoft Office Code Compatibility Inspector ユーザー ガイド
VBA から VBA 7(VBA7) に- VBA7で何が出来るのか?
Office VBA リファレンス VBA 言語リファレンス > 64 ビット Visual Basic for Applications の概要
64bit Windows時代到来:第2回 Win32アプリケーションを実行するWOW64 (1/2)

16bitアプリケーション(Win16アプリケーション)を呼び出すことはできない。Win32やWin64 APIで利用されるハンドル情報は16bit幅には格納できないので、16bitアプリケーションに渡したり、結果を受け取ったりできない。そのため、WOW64ではWin16アプリケーションを実行できない。
 ただし、64bit CPUにしたからといって、32bit CPUの2倍速くなるといったことはまずない。せいぜい1割から2割高速化する程度である。ほかにもいくつかベンチマークなどを実行してみたが、そもそもクライアント用途向けでは32bit OSでも十分なプログラムやアプリケーションが多く、64bit OSでなければ実行できないといったプログラムはほとんどない。となると、現状ではやはりオーバー4Gbytesのメモリが利用できる、という点が64bit Windowsの一番のメリットといえるだろう。なおサーバ用途ではすでに64bit専用アプリケーションがいくつか登場しているし、大容量のメモリを要求する処理も少なくないので、サーバ環境では64bitシステムの優位性が揺らぐことはないだろう。

2011

Windows API リスト 更新日: 2011 年 6 月 1 日
VBAから64bit の Windows API を使う場合の情報置き場
VBA-APIコール VBA Tutorial
Office 2010のころ。かなりまとまっている。64/32についても記述がある。(2020/09/16追加)

2013

Any 型?
Visual Basic 6 では、データの型としてAny 型がありました。

これは普段 Declare 宣言の API 使用時に String 型で値を渡す変数に対し、ブランク文字(“”)ではなく、Null 値が収納されたアドレスをセットした際に、Null ポインタ(Long 型)を String 型に代入すると型の不一致でエラーが発生します。個人的には String 型に例外で Null がセットできればよいと考えますが、DLL 側で起こるエラーでもあり、うまいことエラーを処理できないことがあります。スマートに対処するには都合よく変数を扱える変数があればよいと考案されたと思われるデータ型です。毎回 Byte 型で渡せばよいのではとも思いますが、これも文字コードやらなんやらの問題を引き起こすので Visual Basic たるもの、やはり簡潔に表現するための型が作られたと思います。

Visual Basic .Net の変換ツールで移行すると、Any 型は過去のものなのでなにかに置き換えなさいと言われます。これにうまいこと対処するには Any 型が現れる前の概念を復古させればよいと思います。

Visual Basic の Declare 宣言部は DLL を指定し、基の関数名とエイリアスを指定して、どんな変数、型を使用するかを指定します。

たとえば、メッセージフックで使用する API でも、lParam で文字列か Null ポインタを扱う Any 型を使用していました。
Public Declare Function CallNextHookEx Lib “user32” (ByVal hHook As Integer, ByVal nCode As Integer, ByVal wParam As Integer, ByRef lParam As Any) As Integer

これを Visual Basic .Net に移行する際は、文字列を渡す API と Null を渡す API に分けてエイリアスを宣言すれば解決です。

Public Declare Function CallNextHookEx Lib user32 (ByVal hHook As Integer, ByVal nCode As Integer, ByVal wParam As Integer, ByRef lParam As String) As Integer
Public Declare Function CallNextHookExNull Lib user32 (ByVal hHook As Integer, ByVal nCode As Integer, ByVal wParam As Integer, ByRef lParam As Long) As Integer

2015

Docs .NET Visual Basic のガイド COM 相互運用 チュートリアル: Windows API の呼び出し (Visual Basic)2015/07/20

Office 2010 の 32 ビット バージョンと 64 ビット バージョンとの互換性:最終更新日: 2015年4月24日

2016

入手可能な Windows SDK について Winows 8 / 8.1 / 10 向け

2017

API Chips & Others Last Update:2017/10/15
Windows アプリ > API リファレンス
Windows アプリ > 開発 ユニバーサル Windows アプリのリファレンス
VBA から VBA 7(VBA7) に- VBA7で何が出来るのか?

2018

Docs/Windows/Desktop/API Index/Windows API ListWindows API Index Last Update:05/31/2018
Access VBA >プリンターの機能をプログラムで取得します。
API 技術関連情報 http://madia.world.coocan.jp/
掲載当時で6年前のデータが変数の解説、サンプルが充実
目的別 Win32API のサンプル集プログラミングのメモ帳(C/C++/HSP)
このページ自体はVBAではないのだが、この一覧表がWin32APIで何ができるのか、ジャンルごとに分けられている。

VBAでWindowsAPIを使うには @nukie_53 Qiita 2018年08月13日に更新
VBAでWin32Apiを使うための基本を解説した世界で最も新しい記事。
basUtf8FromString 2018-08-17
WideCharToMultiByte、MultiByteToWideCharを使用した例。64bit化済
UTF-8への文字列の変換、Byte数などそのままモジュールとなっている。
しかし

Public Sub Test_Utf8String()
    Dim b() As Byte
    Dim s As String

    b = Utf8BytesFromString("áéíóñ")
    s = Utf8BytesToString(b)
    Debug.Print "[" & s & "]"
End Sub

このテストはの文字列自体がVBEで書けないので áéíóñ をA2というセルに入れる。MessageboxEx関数でMessageBoxに表示させるとして、

' QUICK TEST
' For Excel Need Windows API
Public Sub Test_Utf8String()
    Dim b() As Byte
    Dim s As String

    b = Utf8BytesFromString([A2]) 'セルから文字列を取得
    s = Utf8BytesToString(b)
    Call MsgBoxEx("[" & s & "]") 'Debug.Printでは写らないので、MessageBoxExを使う
End Sub

2つのAPIの各パラメータの役割及び定数はこちら。
http://chokuto.ifdef.jp/urawaza/api/MultiByteToWideChar.html
http://chokuto.ifdef.jp/urawaza/api/WideCharToMultiByte.html
WideCharToMultiByteとMultiByteToWideCharによる文字コード変換のサンプル(VB6)
実はこのVB6はそのままVBAになる。ポイントはAPIの定義の仕方。2007のため32bit仕様であり、上記サイト等から持ってくる必要がある。
VBAでWin32APIを使う方法と定義一式
2018/09/24
Win32 API ( 64 bit 対応なし)のまとめ

ソフトウェア(アプリケーション)別

PHP

VBからでも呼び出せるので、VBS Jscript Powershellについて以下簡記する
PHPでWin32APIを呼ぶ(Windows) @joh Qiita
- DynamicWrapper をインストールする
- php.ini で php_com_dotnet.dll を有効化する
- サンプル・コード
- 参考

Dynamic Wrapper

下記のVBSとリンク先が異なっている
Écrit par Gilles LAURENT

27-06-2008
http://glsft.free.fr/index.php?option=content&task=view&id=47

SFC Mini

最新版は2015年
Vectorは古いようだ
http://sfcmini.osdn.jp/help/
SFC mini (ver 1.1)

https://www.vector.co.jp/soft/winnt/prog/se387565.html
VBScript/JScriptでWin32API・構造体・コールバック関数・ウィンドウプロシージャを扱う
https://ja.osdn.net/projects/sfcmini/
最新リリース
sfcmini ver 1.1.0 (日付: 2015-05-12)
suppon ver 0.1.1 (日付: 2015-05-12)
suppon 0.1.0_beta (日付: 2008-07-26)
oyagame 0.1.0_beta (日付: 2008-06-02)
sfcmini 1.0.5_beta (日付: 2008-04-25)

VBS

VBA の機能で VBScript に含まれていない機能
Declare ステートメント (DLL 参照のための宣言)
キーワード Optional
キーワード ParamArray
Static ステートメント
条件分岐
#Const ディレクティブ
#If...Then...#Else ディレクティブ
オブジェクト
Clipboard オブジェクト
Collection オブジェクト
VBSでuser32.dll(Win32API)を使用する方法を教えてください。
できません。
(中略)
 (上記の)項目にありますとおり、Declare ステートメントがサポートされていない
ためです。
  [SFC mini]
  http://kandk.cafe.coocan.jp/sfcmini/catid-19.html
または、
  [Dynacall] DynWrap.DLL ダウンロードページ(En)
  (リンク切れ上記Frのページを参照)
  [Dynacall] サンプル(リンク切れ発掘 https://qiita.com/Q11Q/items/616fe24a1fe83acdf1c2 )
などの Dll をインストールして、そこを経由することになります。
私見ですが、新たなインストールを避けたい場合や面倒に感じるので
あれば Excel VBA を使った方が良いと思います

WMI Sample - WMI Fun!

ただしVBScript Powershell (おそらくサンプルはないがJscriptも)WMIを使うとかなりのことができる。

Dim wmiLocator
Set wmiLocator = CreateObject("WbemScripting.SWbemLocator")

さらにWMIはVBAの場合は参照設定可能

Microsoft WMI Scripting VX.X Libraryに参照設定する

Excel4Macro Process

VBScriptでProcessIDからHWNDを取得する。 @nezuq Qiita

クリップボードはIEかPowershellを使う

クリップボードのテキストを取り出して、VBScriptで扱う @int_main_void Qiita
Hey, Scripting Guy! クリップボードから URL を取得し、その Web サイトをブラウザで開く方法はありますか

Jscript(Excel4Macoを使う方法しかない)

Win32 API(JScript) CX's Hello, World! 2012/4/21
Win32 API は、Windows の機能にアクセスする為の API(Application Programming Interface)である。
JScript には Win32 API を直接呼び出す機能は存在しないが、他のコンポーネントを経由することで、呼び出すことが可能である。
Win32 API を呼び出すことが可能なコンポーネントとしては「DynamicWrapper」「SFC mini」「Excel」等がある。
以下は DynamicWrapper を経由した Win32 API 呼出し例である。(後略)

Powershell

powershellでWin32 APIを利用する(powershell 2.0以上)
PowerShellで演奏する電子オルゴール @gx3n-inue Qiita

Microsoft Access

Office BAリファレンス >Access VBA > 概念> Windows API > 情報をクリップボードに送信する
Office BAリファレンス >Access VBA > 概念> Windows API > クリップボードから情報を取得(retrieve)する
Office BAリファレンス >Access VBA > 概念> Windows API > シェル プロセスの終了日時を調べる
Office BAリファレンス >Access VBA > 概念> Windows API > ネットワークにログオンしたユーザーの名前を取得する
ただし公式のくせに64bitなし。公式からも無視される。

機能別

iniファイル

iniファイル操作関数
http://addinbox.sakura.ne.jp/Excel_Tips16.htm

VBA から VBA 7(VBA7) に

http://vivavba7.web.fc2.com/vba7.html
As Any
OVERLAPPED
について説明あり。

As Any , Alias 指定

As Any 指定とは対象がなんでも良いという事です。
例えば readFile Lib "kernel32" Alias "ReadFile" は As Any を As Byte としても問題ないです、

Declare PtrSafe Function ReadFile Lib "kernel32" Alias "ReadFile" (ByVal hFile As LongPtr, ByRef lpBuffer As Any, ```

 ByRef lpBuffer As Any 指定は ByRef lpBuffer As Byte でもOKです。

```vb
Declare PtrSafe Function ReadFile Lib "kernel32" (ByVal hFile As Integer, ByRef lpBuffer As Byte, ・・・

OVERLAPPED

引数の最後の lpOverlapped As OVERLAPPED も lpOverlapped As Integer でも同じです、この時は lpOverlapped で受け取ったアドレスを OVERLAPPED に入れ替える必要が有ります。

Declare PtrSafe Function readFile Lib "kernel32" Alias "ReadFile" (ByVal hFile As LongPtr, ByRef lpBuffer As Any, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, lpOverlapped As OVERLAPPED) As Long
Declare PtrSafe Function ReadFile Lib "kernel32" (ByVal hFile As Integer, ByRef lpBuffer As Byte, ByVal nNumberOfBytesToRead As Long, ByRef lpNumberOfBytesRead As Long, ByVal lpOverlapped As Integer) As Long

実行時エラー453

指定された DLL 関数が見つかりません (エラー 453)

  • 関数宣言で無効な序数を指定しました。適切な序数を確認するか、名前によって関数を呼び出してください。
  • 正しい DLL 名を指定しましたが、指定した関数が含まれるバージョンではありません。コンピューター上に正しいバージョンがある可能性はありますが、誤ったバージョンが含まれるディレクトリが、正しいバージョンが含まれるディレクトリよりも前にあると、誤った DLL がアクセスされます。コンピューターに複数のバージョンがないかどうかを確認してください。前のバージョンがある場合は、サプライヤーに連絡して、新しいバージョンがないかどうかを確認してください。
  • 32 ビットの Microsoft Windows プラットフォームで作業している場合は、DLL 名とエイリアス (使用されている場合) の両方が正しくなければなりません。DLL 名とエイリアスが正しいかどうかを確認してください。
  • 一部の 32 ビット DLL には、 Unicode と ANSI 文字列の両方に対応するように、少しだけ異なるさまざまなバージョンの関数が含まれています。名前の末尾に "A" が付いている関数は ANSI バージョンを、名前の末尾に "W" が付いている関数は Unicode バージョンを指定します。
  • 関数が文字列型の引数を取る場合は、"A" を関数名に追加してみてください。 ####GetCurrentDirecotryが関数名にAを追加する 公式の資料では
Declare PtrSafe Function GetCurrentDirectory Lib "kernel32" ( _ 
        ByVal nBufferLength As Long, ByVal lpBuffer As String) As Long

これでは上記エラーが起きる

Private Declare PtrSafe Function GetCurrentDirectory Lib "kernel32" _ 
       Alias "GetCurrentDirectoryA" ( _ 
       ByVal nBufferLength As Long, _ 
       ByVal lpBuffer As String) As Long
http://madia.world.coocan.jp/vb/API/GetCurrentDirectory.htm
Private Sub Sampe()
  Dim nName As String, nLeng As Long, Ret As Long
  'バッファを確保
  nName = String(250, Chr(0))
  nLeng = Len(nName)
  Ret = GetCurrentDirectory(nLeng, nName)
  Debug.Print nName
End Sub

文字コード 変換

VBAからUnicode版のWindows API を使う 2008/01/31 14:00 Codezine
VBAで Windows APIを使った UTF-8 ←→Unicode相互変換 @yamashiroakihito - Qiita 2018/5/30

Sound

懐かしすぎて憤死するWIN32API(古の趣味ゲーム開発編) @calcs Qiita
QueryPerformanceTimer Sleep Sound 関係はゲームによく用いられていた。
サウンドを再生する OfficeTanaka

クリップボード

VBA クリップボードの値を取得する方法(API) 64Bit対応版 – Excel -Sakakibara Engneearing
Share the Clipboard with VBA and the Windows API-Francesco Foti’s weblog

Color RGB ICM

Image Color Management (ICM) 色の管理 ICM 2.0 > ICM 2.0 API 一覧

XlRgbColor 列挙 (Excel)
VBA クラスモジュールを使って色見本(カラーパレット)を作る t-hom’s diary Hateblo 201/2/26
[RGB to RYB & CMYK Conversion ]

書籍

大村あつしのExcel VBA Win64/32 APIプログラミング

行方不明になったもの

Office 2000のころにあった API Viewer

WinAPI ビューア アプリケーションを使用する

Win32Api.txt

ネットにそれらしきものはあるが同一性があるか不明だ。 https://hwiegman.home.xs4all.nl/downloads/Win32API.Txt
※利用は自己責任でお願いします

Other Class Module

ClassModule化しないとコードの上が重い。このためにはClassModuleにするのがどうも有効なようだ。

VBA クラスモジュール 超 入門 t-hom's Diary
VBAでクラスをつくる @Kamo123 - Qiita 2017/12/16

注 :Surfaceは致命的は現時点ではデスクトップ版がインストールできない

Surface Laptop の場合は、Windows 10S OS 自体がストア アプリのみの動作を許可する仕組みとなるため、デスクトップ アプリ版 Office 2016 をインストールすることはできません。

今回の投稿は以上です。

本情報の内容 (添付文書、リンク先などを含む) は、作成日時点でのものであり、予告なく変更される場合があります。

Tags Office クライアント開発 ストア版Office

以下私見


つまりWIN32APIを使用している場合、バグが発生する可能性がある。特に環境変数が読めないのはおどろき

Office の COM オブジェクトに関するセキュリティ設定

Q11Q
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away