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](https://sodocumentation.net/ja/vba/topic/10569/api%E3%82%B3%E3%83%BC%E3%83%AB)
モジュールとしてすべて集めている模様。
ただし、関数名にすべてapiが追加されているが、通常はapiは付けない。

# 年代別
WinApi32は2000で用いられてその後失速するのがわかるけど、重要なことは2000年に集中している
## 1996
[win32 サブルーチンズ](http://www7a.biglobe.ne.jp/~tsuneoka/win32sub/index.html)[Archive](https://web.archive.org/web/20060209033601/http://www7a.biglobe.ne.jp/~tsuneoka/win32sub/index.html#index)
常岡伸二氏のページC言語前提だがWidnows95初期のAPIについて
## 1999
[Welcome to MASAPICO'S Page](http://nienie.com/~masapico/)
CとVBを比較して載せてある。2003年までしか更新がないが、ここに乗っている比較はロゼッタストーンに匹敵する。VBだがVBAにも変換は可能。

## 2000 WinApi 32
[Microsoft Office (全般) >コラム > Office Talk Office VBA と Windows AP 日本語版最終更新日 2001年4月26日](https://msdn.microsoft.com/ja-jp/library/cc326057.aspx)
###[Microsoft Office 2000/Visual Basic プログラマーズ ガイド](https://msdn.microsoft.com/ja-jp/library/cc376607.aspx) 
### [第 2 部 Office ソリューションの開発](https://msdn.microsoft.com/ja-jp/library/cc376647.aspx)
#### [第 10 章 Windows API とその他のダイナミック リンク ライブラリ](https://msdn.microsoft.com/ja-jp/library/cc344343.aspx)の項目一覧
 - [API の基礎](https://msdn.microsoft.com/ja-jp/library/cc376182.aspx)
    - [API とは](https://msdn.microsoft.com/ja-jp/library/cc376921.aspx)
    - [VBA を使用して Windows API を呼び出す目的](https://msdn.microsoft.com/ja-jp/library/cc376990.aspx)
    - [API に関する資料](https://msdn.microsoft.com/ja-jp/library/cc376183.aspx)
    - [DLL の関数にアクセスする](https://msdn.microsoft.com/ja-jp/library/cc344266.aspx)
    - [Declare ステートメントの構造](https://msdn.microsoft.com/ja-jp/library/cc376178.aspx)
    - [定数とユーザー定義型](https://msdn.microsoft.com/ja-jp/library/cc376231.aspx)
       - [ハンドルを理解する](https://msdn.microsoft.com/ja-jp/library/cc344590.aspx)
 - DLL 関数を呼び出す
   - [引数のデータ型](https://msdn.microsoft.com/ja-jp/library/cc376185.aspx
   - [DLL 関数から文字列を返す](https://msdn.microsoft.com/ja-jp/library/cc376816.aspx)
   - [ユーザー定義型を渡す](https://msdn.microsoft.com/ja-jp/library/cc376650.aspx)
   - [Any 型を使用する](https://msdn.microsoft.com/ja-jp/library/cc344627.aspx)
   - [DLL 関数の呼び出し後のエラー情報を取得する](https://msdn.microsoft.com/ja-jp/library/cc376814.aspx)
 - [DLL 関数をラップする](https://msdn.microsoft.com/ja-jp/library/cc344696.aspx)
   - [コールバック関数を使用する](https://msdn.microsoft.com/ja-jp/library/cc344630.aspx)
     - [コールバック関数とは](https://msdn.microsoft.com/ja-jp/library/cc376923.aspx)
     - [コールバック関数を作成する](https://msdn.microsoft.com/ja-jp/library/cc376250.aspx)
     - [コールバック関数を呼び出す](https://msdn.microsoft.com/ja-jp/library/cc376208.aspx)
 - [その他の参考資料](https://msdn.microsoft.com/ja-jp/library/cc376964.aspx)すべてリンク切れ

[Windows 2000 >グラフィックおよびマルチメディア > GDI Windows GDI](https://msdn.microsoft.com/ja-jp/library/cc428835.aspx)
[ユーザー定義型を渡す](https://msdn.microsoft.com/ja-jp/library/cc376650.aspx)

Microsoft Office 2000/Visual Basic プログラマーズ ガイド
[Declare ステートメントの構造](https://msdn.microsoft.com/ja-jp/library/cc376178.aspx)
[Windows 開発 >Windows 2000 > ユーザー インターフェイス デザインおよび開発 ](https://msdn.microsoft.com/ja-jp/library/hh846412(v=vs.85).aspx)

[Windows 開発 >Windows 2000 > グラフィックおよびマルチメディア > GDI >Windows GDI](https://msdn.microsoft.com/ja-jp/library/cc428835.aspx)

[Windows 開発 >Windows 2000 > グラフィックおよびマルチメディア > Image Color Management (ICM) > 色の管理](https://msdn.microsoft.com/ja-jp/library/cc428838.aspx)

[Windows 開発 >Windows 2000 > グラフィックおよびマルチメディア >Windows マルチメディア > リファレンス > Windows マルチメディア 関数一覧](https://msdn.microsoft.com/ja-jp/library/cc428426.aspx)

[Windows API について](https://msdn.microsoft.com/ja-jp/library/cc343992.aspx)
アーカイブコンテンツ
ここで提供しているコンテンツは提供時のままであり、現在でも技術的に正確であるという保証はありません。当時は有効であった URL が、現在では存在しないサイトやページにリンクしているかもしれないことに注意してください。

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

 - ポインタをint、long、ULONG、DWORDなどにキャストしてはならない
 - ポインタの型変換には、PtrToLongやPtrToUlong関数を使うこと
 - Win64はLLP64のプログラミングデータモデルなので、引数によってポインタを得るような関数には注意する
 - ポリモーフィックAPIに注意する
 - 新しいWindowクラス関数および定義を使う
 - size_t、HANDLE、LPARAM、WPARAM、LRESULTなど派生タイプのデータ型はプラットホームによってサイズが変わることに注意

[Windows API 32 のサンプル - NonSoft](http://nonsoft.la.coocan.jp/Win32Api/index.html)
32Bit Apiのみ
[Windows API：VB6・VBAでの宣言一覧（Ａ） フィロの村 Note](http://note.phyllo.net/?eid=1106222)
NONSoftのページと同じく網羅系
32 APIのみ

[MOUG 即効テクニック > AccessVBA > Windows環境・オブジェクト](https://www.moug.net/tech/acvba/0021.html)
この中に実はWinAPIサンプルがあるが、32Bit版のまま

### 2006
#### [The Windows API and Other Dynamic-Link Libraries | Microsoft Docs](https://docs.microsoft.com/ja-jp/previous-versions/aa671849(v=vs.71))
> Microsoft® Visual Basic® for Applications (VBA) の最も強力な機能の 1 つは、その拡張性です。 Microsoft® Windows® アプリケーション プログラミング インターフェイス (API) およびその他のダイナミック リンク ライブラリ (DLL) で関数を呼び出すことにより、アプリケーションを拡張できます。 VBA プログラマーは、Windows API のほとんどの関数を使用できることに気付くでしょう。つまり、アプリケーションを制御できるだけでなく、オペレーティング システムの大部分を制御できる可能性があります。さらに、VBA を使用して DLL 関数を呼び出す方法を習得すると、ほぼすべての DLL で関数を呼び出すことができるため、通常は C および C++ プログラマーのドメインであるテクノロジを活用できます。

2006/9/14に発表された記事、ここから3つのセクションに分かれる。
[API Basics | Microsoft Docs](https://docs.microsoft.com/ja-jp/previous-versions/aa671660(v=vs.71))
[Wrapping DLL Functions | Microsoft Docs](https://docs.microsoft.com/ja-jp/previous-versions/aa709834(v=vs.71))
[Calling DLL Functions | Microsoft Docs](https://docs.microsoft.com/ja-jp/previous-versions/aa671674(v=vs.71))

##### [API Basics | Microsoft Docs](https://docs.microsoft.com/ja-jp/previous-versions/aa671660(v=vs.71))
> Microsoft® Windows® API の目的は、Windows オペレーティング システムおよびユーザー インターフェイスと一貫性のあるプログラムを開発できるようにすることです。フォーム、コマンド ボタン、メニューなどの Windows オペレーティング システムのコンポーネントを作成するコードを個別に作成する代わりに、Windows API で適切な関数を呼び出して、オペレーティング システムにそれらのコンポーネントを作成させることができます。 Windows API は関数の複雑なセットであるため、このドキュメントは開始点を提供し、詳細を知る必要がある場合は他のリソースに案内します。 Windows API の呼び出しで学んだスキルは、他の DLL の DLL 関数の呼び出しにも適用できます。

###### :ping_pong: [Anatomy of a Declare Statement](https://docs.microsoft.com/ja-jp/previous-versions/aa671659(v=vs.71))
> Unicode バージョンには "W" サフィックスがあります。 VBA は内部で Unicode を使用しますが、DLL 内の関数を呼び出す前にすべての文字列を ANSI 文字列に変換するため、通常、VBA から Windows API 関数を呼び出すときは ANSI バージョンを使用します。

##### [Wrapping DLL Functions | Microsoft Docs](https://docs.microsoft.com/ja-jp/previous-versions/aa709834(v=vs.71))
> DLL 関数の呼び出しは、多くの点で Microsoft® Visual Basic® for Applications (VBA) 関数の呼び出しに似ていますが、最初は DLL 関数を混乱させるような違いがあります。このセクションでは、DLL 関数での引数の型指定とプレフィックスの付け方、文字列を返す方法、データ構造を渡す方法、期待できる戻り値、およびエラー情報を取得する方法について説明します。

##### [Calling DLL Functions](https://docs.microsoft.com/ja-jp/previous-versions/aa671674(v=vs.71))
> DLL 関数を頻繁に呼び出す場合は、これらの関数をクラス モジュール内にカプセル化してプロセスを簡素化することができます。 1 つまたは複数の DLL 関数を呼び出すプロパティまたはメソッドを作成することにより、Microsoft® Visual Basic® for Application (VBA) の典型的なオブジェクト指向の方法で DLL 関数を操作できます。さらに、DLL 関数の宣言と呼び出しは困難でエラーが発生しやすいため、DLL 関数の呼び出しを再利用可能なオブジェクトにパッケージ化すると、API を呼び出すたびにこの操作を繰り返す必要がなくなります。


## Office 2010 VBA7 Win64

### 2010
[Declaring API functions in 64 bit Office](https://www.jkp-ads.com/articles/apideclarations.asp)
[Windows API Code Pack連載 第1回〜第10回の一覧](https://blogs.msdn.microsoft.com/ttanaka/2010/10/17/windows-api-code-pack-110/)
※ 特に記載がない限り、開発ツールはVisual Studio 2010、開発言語はC#を使用して説明しています。
Visual Basicのコードが必要な方は、以下のサイトにあるWindows API Code Packのセッションの資料をダウンロードしていただければ、スライドの後半にVBのコードを掲載していますので、ご参照いただけます。
[Office 2010 Help Files: Win32API_PtrSafe with 64-bit Support ](https://www.microsoft.com/en-us/download/details.aspx?id=9970)
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](https://msdn.microsoft.com/en-us/library/default.aspx)
英語版
[Microsoft Office Code Compatibility Inspector ユーザー ガイド](https://docs.microsoft.com/ja-jp/previous-versions/office/office-2010/ee833946(v=office.14))
[VBA から VBA 7(VBA7) に- VBA7で何が出来るのか？](http://vivavba7.web.fc2.com/vba7.html)
[ Office VBA リファレンス VBA 言語リファレンス > 64 ビット Visual Basic for Applications の概要](https://msdn.microsoft.com/ja-jp/vba/language-reference-vba/articles/64-bit-visual-basic-for-applications-overview)
[64bit Windows時代到来：第2回　Win32アプリケーションを実行するWOW64 (1/2)](https://www.atmarkit.co.jp/ait/articles/1007/01/news131.html)
>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 日](https://msdn.microsoft.com/ja-jp/windows/hh240557)
[VBAから64bit の Windows API を使う場合の情報置き場](https://qiita.com/RelaxTools/items/346d0d3b6e8c982015ab)
[VBA-APIコール VBA Tutorial](https://sodocumentation.net/ja/vba/topic/10569/api%E3%82%B3%E3%83%BC%E3%83%AB)
Office 2010のころ。かなりまとまっている。64/32についても記述がある。（2020/09/16追加）
### 2013
[Any 型？](https://wpss10.wordpress.com/2013/05/16/any-%E5%9E%8B%EF%BC%9F/) 
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 に分けてエイリアスを宣言すれば解決です。

```vb
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](https://docs.microsoft.com/ja-jp/dotnet/visual-basic/programming-guide/com-interop/walkthrough-calling-windows-apis)
<UL>
<li>[方法: Windows API (Visual Basic) を呼び出す](https://docs.microsoft.com/ja-jp/dotnet/visual-basic/programming-guide/com-interop/how-to-call-windows-apis)
<li>[方法: 符号なしの型 (Visual Basic) を取得する Windows 関数を呼び出す]
(https://docs.microsoft.com/ja-jp/dotnet/visual-basic/programming-guide/com-interop/how-to-call-a-windows-function-that-takes-unsigned-types)
<UL>
<li>クラス、モジュール、または符号なし整数型のメンバーを含む構造体を使用する場合は、Visual Basic でのこれらのメンバーを表示できます。
</UL>
</UL>

[Office 2010 の 32 ビット バージョンと 64 ビット バージョンとの互換性:最終更新日: 2015年4月24日](https://msdn.microsoft.com/ja-jp/library/office/ee691831(v=office.14).aspx)

### 2016
[入手可能な Windows SDK について Winows 8 / 8.1 / 10 向け](https://blogs.msdn.microsoft.com/japan_platform_sdkwindows_sdk_support_team_blog/2016/10/03/%e5%85%a5%e6%89%8b%e5%8f%af%e8%83%bd%e3%81%aa-windows-sdk-%e3%81%ab%e3%81%a4%e3%81%84%e3%81%a6-winows-8-8-1-10-%e5%90%91%e3%81%91/)

### 2017
[API Chips & Others Last Update:2017/10/15](http://tokovalue.jp/)
[Windows アプリ > API リファレンス](https://msdn.microsoft.com/ja-jp/library/windows/apps/br211369.aspx)
[Windows アプリ > 開発 ユニバーサル Windows アプリのリファレンス](https://msdn.microsoft.com/ja-jp/library/windows/apps/bg124285.aspx)
[VBA から VBA 7(VBA7) に- VBA7で何が出来るのか？](http://vivavba7.web.fc2.com/vba7.html)
[【エクセルVBA】Windows APIで外部プログラムを呼び出すための第一歩 いつも隣にITのお仕事](https://tonari-it.com/windows-api-dll-messagebeep/)
[【エクセルVBA】 URLDownloadToFile関数を使って指定ファイルをワンクリックでダウンロードする方法 いつも隣にITのお仕事](https://tonari-it.com/excel-vba-windowsapi-urldownloadtofile/)
いきなりURLDownloadToFileに飛ぶ2回シリーズ
### 2018
[Docs/Windows/Desktop/API Index/Windows API ListWindows API Index Last Update:05/31/2018](https://docs.microsoft.com/en-us/windows/desktop/apiindex/windows-api-list)
[Access VBA >プリンターの機能をプログラムで取得します。](https://msdn.microsoft.com/ja-jp/vba/access-vba/articles/programmatically-retrieve-printer-capabilities)
[API 技術関連情報 http://madia.world.coocan.jp/](http://madia.world.coocan.jp/)
掲載当時で6年前のデータが変数の解説、サンプルが充実
[目的別 Win32API のサンプル集プログラミングのメモ帳(C/C++/HSP)](https://blog.goo.ne.jp/masaki_goo_2006/e/a0d9e37cce58267daf9512e0f44d7dbf)
このページ自体はVBAではないのだが、この一覧表がWin32APIで何ができるのか、ジャンルごとに分けられている。
[VBAでWin32APIを使う方法と定義一式 Excel作業をVBAで効率化](https://vbabeginner.net/howto-use-win32-api/)
時間に関するTime構造体(Type Statement)と配置の順番の考え方。
Declareの前に置く。
またここでも大文字、小文字は正確に区別して記述する。
[VBAでWindowsAPIを使うには @nukie_53 Qiita 2018年08月13日に更新](https://qiita.com/nukie_53/items/6a88ce82565e238a3c71)
VBAでWin32Apiを使うための基本を解説した記事。
[basUtf8FromString 2018-08-17](https://di-mgt.com.au/basUtf8FromString64.bas.html)
WideCharToMultiByte、MultiByteToWideCharを使用した例。64bit化済
UTF-8への文字列の変換、Byte数などそのままモジュールとなっている。
しかし

```vb
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に表示させるとして、
if pFrom or pTo are unqualified names the current directories are taken from the global current drive/directory settings managed by Get/SetCurrentDrive/Directory  the global confirmation settings
```vb
' 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)](http://nonsoft.la.coocan.jp/SoftSample/SampleModWCMB.html)
実はこのVB6はそのままVBAになる。ポイントはAPIの定義の仕方。2007のため32bit仕様であり、上記サイト等から持ってくる必要がある。
[VBAでWin32APIを使う方法と定義一式](https://vbabeginner.net/vba%E3%81%A7win32api%E3%82%92%E4%BD%BF%E3%81%86%E6%96%B9%E6%B3%95%E3%81%A8%E5%AE%9A%E7%BE%A9%E4%B8%80%E5%BC%8F/)
2018/09/24
Win32 API ( 64 bit 対応なし)のまとめ
### 2020
2020/08/11 [第123回.APIについて（Win32API）EXCELの真髄](https://excel-ubara.com/excelvba1/EXCELVBA423.html)
             ここから[VBAでWEBカメラ操作する](https://excel-ubara.com/excelvba4/EXCEL_VBA_432.html)
             などのWindow操作、ExcelのセルのサイズをDPIで取得する方法など。PtrSafeのついたサンプルとなっている。
### 2021
[Windows Sampleリボンの君とSuyamaSoft](http://suyamasoft.blue.coocan.jp/index.html)
 [Excel VBA Sample](http://suyamasoft.blue.coocan.jp/ExcelVBA/Sample/index.html)
   [WindowsAPI](http://suyamasoft.blue.coocan.jp/ExcelVBA/Sample/WindowsAPI/index.html)
  [C、C++の型とデータータイプ](http://suyamasoft.blue.coocan.jp/ExcelVBA/Sample/WindowsAPI/DataType/index.html)
このサンプル集にはWindowsAPIを使ったものが多数ある。更にUIまで操作している。
またこの項目はSampleだけではなくWindowsAPIをVBAで使うコツがある。
[チュートリアル: Windows API の呼び出し (Visual Basic)](https://docs.microsoft.com/ja-jp/dotnet/visual-basic/programming-guide/com-interop/walkthrough-calling-windows-apis)
VBAに関するのは、Declare を使用した API 呼び出しの項目
[アンマネージ DLL 関数の処理](https://docs.microsoft.com/ja-jp/dotnet/framework/interop/consuming-unmanaged-dll-functions)
[Windows SDK とエミュレーターのアーカイブ](https://developer.microsoft.com/ja-jp/windows/downloads/sdk-archive/)
:ping_pong: [64ビット環境で実行する VBA マクロでは、戻り値の型を明示的に宣言する必要があります。]()
### 2022
[Office の 32 ビット バージョンと 64 ビット バージョン間の互換性](https://docs.microsoft.com/ja-jp/office/client-developer/shared/compatibility-between-the-32-bit-and-64-bit-versions-of-office)
[Office 2010 の 32 ビット バージョンと 64 ビット バージョンとの互換性](https://docs.microsoft.com/ja-jp/previous-versions/office/ee691831(v=office.14))[拓](https://web.archive.org/web/20210507040441/https://docs.microsoft.com/ja-jp/previous-versions/office/ee691831(v=office.14))と同内容だが
>概要 : 2GB 以上のデータを扱っているユーザーのために、Microsoft Office 2010 の 64 ビット バージョンが提供されるようになりました。この記事では、32 ビット バージョンと新しい 64 ビット バージョンとの互換性に関する問題、および以前の 32 ビット Office アプリケーションとそのソリューションについて説明します (7 ページ)。

>32 ビット バージョンの Office と 64 ビット バージョンの Office の互換性についてご確認ください。
Office アプリケーションは、32 ビット バージョンと 64 ビット バージョンでご利用いただけます

冒頭からしてやる気の感じられない展開となっている。
さらに、ダウンロードファイルのURLが違っている。現在はこちら。

https://www.microsoft.com/en-us/download/details.aspx?id=9970

なお、このファイルは`C:\Office 2010 Developer Resources\Documents\Office2010Win32API_PtrSafe`に展開される。

#ソフトウェア(アプリケーション)別
## PHP
VBからでも呼び出せるので、VBS Jscript Powershellについて以下簡記する
[PHPでWin32APIを呼ぶ(Windows) @joh Qiita](https://qiita.com/joh/items/9f54c68768e356c51157)
 - 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 に含まれていない機能](https://msdn.microsoft.com/ja-jp/library/cc392401.aspx)
Declare ステートメント (DLL 参照のための宣言)
キーワード Optional
キーワード ParamArray
Static ステートメント
条件分岐
\#Const ディレクティブ
\#If...Then...#Else ディレクティブ
オブジェクト
Clipboard オブジェクト
Collection オブジェクト
[VBSでuser32.dll（Win32API)を使用する方法を教えてください。](https://oshiete.goo.ne.jp/qa/4612562.html)
できません。
(中略)
　(上記の)項目にありますとおり、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!](http://www.wmifun.net/sample/)
ただしVBScript Powershell （おそらくサンプルはないがJscriptも）WMIを使うとかなりのことができる。

```vb
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 ](https://qiita.com/int_main_void/items/27c5d250f24cbc6ca025)
[Hey, Scripting Guy! クリップボードから URL を取得し、その Web サイトをブラウザで開く方法はありますか](https://gallery.technet.microsoft.com/scriptcenter/c56466b1-73d9-4346-a3a6-3d6c5a1d81c4/view/Reviews)

## Jscript(Excel4Macoを使う方法しかない)
[Win32 API(JScript) CX's Hello, World! 2012/4/21](http://cx20.main.jp/blog/hello/2012/04/21/hello-win32-api-jscript-world/)
Win32 API は、Windows の機能にアクセスする為の API（Application Programming Interface）である。
JScript には Win32 API を直接呼び出す機能は存在しないが、他のコンポーネントを経由することで、呼び出すことが可能である。
Win32 API を呼び出すことが可能なコンポーネントとしては「DynamicWrapper」「SFC mini」「Excel」等がある。
以下は DynamicWrapper を経由した Win32 API 呼出し例である。(後略)
2021/11/03追記:ただしExcel4Mcroはデフォルトでは動かないようになる。

## Powershell
[powershellでWin32 APIを利用する（powershell 2.0以上）](https://qiita.com/y-takano/items/cb752ad6a10e550ec92f)
[PowerShellで演奏する電子オルゴール @gx3n-inue  Qiita](https://qiita.com/gx3n-inue/items/8ca1d987d58235e7f434)
##Microsoft Access
[Office BAリファレンス >Access VBA > 概念> Windows API > 情報をクリップボードに送信する](https://msdn.microsoft.com/ja-jp/vba/access-vba/articles/send-information-to-the-clipboard)
[Office BAリファレンス >Access VBA > 概念> Windows API > クリップボードから情報を取得(retrieve)する](https://msdn.microsoft.com/ja-jp/vba/access-vba/articles/retrieve-information-from-the-clipboard)
[Office BAリファレンス >Access VBA > 概念> Windows API > シェル プロセスの終了日時を調べる](https://msdn.microsoft.com/ja-jp/vba/access-vba/articles/determine-when-a-shelled-process-ends)
[Office BAリファレンス >Access VBA > 概念> Windows API > ネットワークにログオンしたユーザーの名前を取得する](https://msdn.microsoft.com/ja-jp/vba/access-vba/articles/retrieve-the-name-of-the-user-logged-on-to-the-network)
ただし公式のくせに64bitなし。公式からも無視される。


# 機能別
## iniファイルF
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 としても問題ないです、

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

>の ByRef lpBuffer As Any 指定は ByRef lpBuffer As Byte でもＯＫです。

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

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


>```vb
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)](https://msdn.microsoft.com/ja-jp/vba/language-reference-vba/articles/specified-dll-function-not-found-error-453?f=255&MSPPError=-2147217396)
> -     関数宣言で無効な序数を指定しました。適切な序数を確認するか、名前によって関数を呼び出してください。
- 正しい DLL 名を指定しましたが、指定した関数が含まれるバージョンではありません。コンピューター上に正しいバージョンがある可能性はありますが、誤ったバージョンが含まれるディレクトリが、正しいバージョンが含まれるディレクトリよりも前にあると、誤った DLL がアクセスされます。コンピューターに複数のバージョンがないかどうかを確認してください。前のバージョンがある場合は、サプライヤーに連絡して、新しいバージョンがないかどうかを確認してください。
- 32 ビットの Microsoft Windows プラットフォームで作業している場合は、DLL 名とエイリアス (使用されている場合) の両方が正しくなければなりません。DLL 名とエイリアスが正しいかどうかを確認してください。
- 一部の 32 ビット DLL には、 Unicode と ANSI 文字列の両方に対応するように、少しだけ異なるさまざまなバージョンの関数が含まれています。名前の末尾に "A" が付いている関数は ANSI バージョンを、名前の末尾に "W" が付いている関数は Unicode バージョンを指定します。
- 関数が文字列型の引数を取る場合は、"A" を関数名に追加してみてください。
#### GetCurrentDirecotryが関数名にAを追加する
公式の資料では 

```vb
Declare PtrSafe Function GetCurrentDirectory Lib "kernel32" ( _ 
        ByVal nBufferLength As Long, ByVal lpBuffer As String) As Long
```
これでは上記エラーが起きる

```vb
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](https://codezine.jp/article/detail/1718)
[VBAで Windows APIを使った UTF-8 ←→Unicode相互変換 @yamashiroakihito - Qiita 2018/5/30](https://qiita.com/yamashiroakihito/items/9b609653fef6fa8a5ab2)
## Sound
[懐かしすぎて憤死するWIN32API（古の趣味ゲーム開発編） @calcs Qiita ](https://qiita.com/calcs/items/e1e88aabd46bf4fb40bc)
QueryPerformanceTimer Sleep Sound 関係はゲームによく用いられていた。
[サウンドを再生する OfficeTanaka](http://officetanaka.net/excel/vba/tips/tips22.htm)
# Timer
[64ビット環境で実行する VBA マクロでは、戻り値の型を明示的に宣言する必要があります。](https://docs.microsoft.com/ja-jp/previous-versions/office/troubleshoot/office-developer/declare-return-type-in-64-bit-vba)
タイトルと異なり、実はタイマーのことが書いてある。

## クリップボード
[VBA クリップボードの値を取得する方法(API) 64Bit対応版 – Excel -Sakakibara Engneearing](https://www.saka-en.com/office/vba-get-clipboard-api-64bit-excel/)
[Share the Clipboard with VBA and the Windows API-Francesco Foti’s weblog](https://francescofoti.com/2013/12/share-the-clipboard-with-vba-and-the-windows-api/)

## Color RGB ICM
[Image Color Management (ICM) 色の管理 ICM 2.0 > ICM 2.0 API 一覧](https://msdn.microsoft.com/ja-jp/library/cc428371.aspx?f=255&MSPPError=-2147217396)

[XlRgbColor 列挙 (Excel)](https://msdn.microsoft.com/ja-jp/VBA/Excel-VBA/articles/xlrgbcolor-enumeration-excel)
[VBA クラスモジュールを使って色見本(カラーパレット)を作る t-hom’s diary Hateblo 201/2/26](https://thom.hateblo.jp/entry/2017/02/26/115642)
[RGB to RYB & CMYK Conversion ]

## 書籍
[大村あつしのExcel VBA Win64/32 APIプログラミング](www.shuwasystem.co.jp/products/7980html/4734.html)

## 行方不明になったもの
### Office 2000のころにあった API Viewer
[WinAPI ビューア アプリケーションを使用する](https://msdn.microsoft.com/ja-jp/library/cc343975.aspx?f=255&MSPPError=-2147217396)
### Win32Api.txt
ネットにそれらしきものはあるが同一性があるか不明だ。 https://hwiegman.home.xs4all.nl/downloads/Win32API.Txt
※利用は自己責任でお願いします

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

[VBA クラスモジュール 超 入門 t-hom's Diary](https://thom.hateblo.jp/entry/2016/12/31/013555)
[VBAでクラスをつくる @Kamo123 - Qiita 2017/12/16 ](https://qiita.com/Kamo123/items/a4c7749fa30d8f68df28)

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

今回の投稿は以上です。



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

Tags Office クライアント開発 ストア版Office
<h1>以下私見</h1>
つまりWIN32APIを使用している場合、バグが発生する可能性がある。特に環境変数が読めないのはおどろき



[Office の COM オブジェクトに関するセキュリティ設定 ](https://support.microsoft.com/ja-jp/help/4058123/security-settings-for-com-objects-in-office)