BLOG

---------------------------------------------------

Private Declare PtrSafe Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As LongPtr, ByVal wMsg As LongPtr, ByVal wParam As LongPtr, lParam As Any) As LongPtr

Public Const WM_SETTEXT = &HC

Private Declare PtrSafe Function FindWindow Lib "user32" _

Alias "FindWindowA" _

(ByVal lpClassName As String, _

ByVal lpWindowName As String) As LongPtr

Declare PtrSafe Function FindWindowEx Lib "user32.dll" Alias "FindWindowExA" _

(ByVal hwndParent As LongPtr, ByVal hwndChildAfter As LongPtr, _

ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr


Sub hogeInput()

'メモ帳を起動して、hogeと入力する。

Dim hwndParent As Long '親のウィンドウハンドル

Dim hwndChild As Long '子のウィンドウハンドル

Dim lngRc As Long  'APIの戻り値

Dim taskID As Double

taskID = Shell("notepad.exe", vbNormalFocus)

Application.Wait [Now() + TimeValue("00:00:00.1")]

hwndParent = FindWindow("notepad", vbNullString)

hwndChild = FindWindowEx(hwndParent, 0, "Edit", "") '子ウィンドウのEdit

lngRc = SendMessage(hwndChild, WM_SETTEXT, 0, ByVal "hoge")

End Sub 

---------------------------------------------------

・windows10(64bit)用コードです。32bitの場合は、declareのところの「PtrSafe」が不要であり、かつ、LongPtrはPtrをとってLongとします。

・Shell関数

Shell(pathname[,windowstyle])

pathname:原則、フルパスを指定する。例外として、PATHが通っているフォルダのアプリ(メモ帳など)は、アプリ名のみでOK。

windowstyle:ウィンドウの最大化・最小化などを指定できる。省略可能。

戻り値:アプリのタスクID。

・SendMessageの戻り値を受け取るために「lngRc =」としています。これがないとエラーがでました。

・SendMessageの第4引数に「ByVal」をつけないと文字化けします。

 

・好きなタイミングで、プログラムを自動実行することができる。


 操作→タスクの作成→トリガー(タイミングを指定)→操作(プログラムを指定)

・VBscriptでフォルダごとバックアップする。


「backup.vbs」

Dim fs

Dim source

Dim destination

source1 = "コピー元1"

source2 = "コピー元2"

destination = "コピー先" & Replace(Date, "/", "") 'フォルダ名はバックアップ時の日付

Set fs = WScript.CreateObject("Scripting.FileSystemObject")

fs.CreateFolder(destination)

fs.CopyFolder source1, destination & "\", false 'フォルダが存在していたら上書きはしない

fs.CopyFolder source2, destination & "\", false


*コピー元、コピー先を適宜変更します。

*メモ帳を新規作成し、拡張子はtxt→vbsに変更します。

0.ファイル作成

・AddInsのフォルダにExcelアドイン(拡張子:.xlam)を作成する


1.リボン用コードを作成

・開発→Visual Basic→挿入→標準モジュール

  Sub tamesi(control As IRibbonControl)

    MsgBox "Hello!!"

  End Sub

*IRibbonControl:リボンのオブジェクト型


2.「.rels」ファイルの編集

・Excelアドインの拡張子を「.zip」にする

  *Excelファイルはzip形式ファイルなので拡張子を変更するだけOK

・「_rels」フォルダ内の「.rels」ファイルをデスクトップにコピーして編集する

  *デスクトップなどにコピーしないと編集できない

・最後の</Relationships>の前に以下を追加する

  <Relationship Id="tamesiID" Type="http://schemas.microsoft.com/office/2007/relationships/ui/extensibility" Target="customUI/customUI14.xml"/>

  *Idは何でもOK

・「_rels」フォルダ内の「.rels」ファイルに上書きする


3.「customUI14.xml」の作成

Windows API


ウィンドウ

 画面上の矩形領域(デスクトップ、アプリケーション(Excel)、ユーザーフォーム、タスクバー)


ウィンドウの属性

 ①ウィンドウハンドル:割り当てられた識別子

 ②ウィンドウクラス:外観・動作を定義するもの

   BUTTON:ラジオボタンなど

   COMBOBOX

   EDIT:テキストボックス

   LISTBOX

   SCROLLBAR

   MDICLIENT

   STATIC

 ③ウィンドウスタイル:ウィンドウクラスでは指定できない外観・動作を定義する定数

 ④ウィンドウ名

 ⑤位置・サイズ・Zオーダー(ウィンドウが重なっているときの順序)


コールバック関数


プロセスID


プロセス名


コントロールID


変数

 API関数の戻り値を格納する変数はrc(return code)としましょう。


バージョン

 VBAはUnicodeをANSIに変換してからAPIに渡し、APIから戻ってきたANSIをUnicodeに再変換する

 →ANSIバージョン(末尾がA)を指定しなければならない


関数の例

FindWindowEx

EnumChildWindows

・Application.Hwndプロパティ

 ・GetActiveWindow関数(Win32API)

 ・GetDesktopWindow関数(Win32API)

 ・FindWindow関数(Win32API)

 ・FindWindowEx関数(Win32API)

 ・GetWindow関数(Win32API)

------------------

ダイアログボックス 保存 vba api

'ハンドル取得

 hWnd = FindWindow(vbNullString, "名前を付けて保存")

'保存ボタンのハンドル取得

 hWnd3 = FindWindowEx(hWnd, 0, "Button", "保存(&S)")

'保存ボタンをクリック

 SendMessage hWnd3, &HF5, 0, 0

「ハンドルの値が取れるまでループさせる」といった処理を加えるとより安定する


DOM(Document Object Model):

IE上であらゆる操作(テキスト入力、ボタンクリック等)を行うことができる!

HTMLドキュメント要素(html・head・body・p・aなど)にアクセスして取得や操作ができる