Edited at

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


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

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に関してはあてはまりません。


年代別

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 を使う場合の情報置き場


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を使うための基本を解説した世界で最も新しい記事。

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 オブジェクトに関するセキュリティ設定