Technet フォーラムでの質問を私なりに解釈しサンプルを作ってみました。
もっといいアイディアをお持ちの方がいらっしゃいましたら、是非コメントをお願いします。
こんな時に使いたい
- マルチ ディスプレイ環境を構築
- マクロ付エクセル1を起動
- エクセル1からマクロ付エクセル2を起動
- エクセル1はメイン ディスプレイに最大化して表示
- エクセル2はサブ ディスプレイに最大化して表示
Excelを複数起動し各ディスプレイにWorkbookを自動的に配置する前作業を簡略化、パンチャーには入力業務にだけ集中してもらえるのではないかなと。
「たったこれだけの作業なら手動で出来るだろう!?」とお思う方、それが普通の考え方です。
それであっています!
しかし、実際の現場ではこれさえも嫌がるユーザが多かったりします。本当に・・・
サンプルの説明
サンプルを作りました。開発環境は、Windows 8.1 Pro 64bit + Excel 2013 32bit。
※Windows 7 Pro SP1 64bit + Excel 2013 32bitでもテスト、問題ありません。
ファイルは、test01.xlsmとtest02.xlsmの二つになります。
http://sdrv.ms/1m8NS8dVBAはtest01.xlsmのみのため、test02は.xlsxでもいいはずです。
サンプルのVBAは下記の通り動作します。
- test01.xlsmとtest02.xlsmをデスクトップに配置(手動で)
- test01.xlsmを起動
- シート1の[Open]ボタンをクリック
- test02.xlsmを起動
- test02.xlsmをサブ ディスプレイに移動、かつ、最大化
- test01.xlsmをアクティブ、かつ、最大化
- test02.xlsmをチェック、あれば保存し終了
- test01.xlsmを保存、終了
この終了処理を行う事で、次回Excelを起動するとtest01.xlsmはメイン ディスプレイで起動します。
サンプルの詳細説明
ExcelからAeroSnapを実行する処理は[keybd_event]関数を使いました。keybd_event 関数 - msdnApplicatin.SendKeysを使用しAeroSnapの最大化([Win]+[↑]キー)”^{ESC}{UP}”を送信しましたが、[Win]キーのみ処理されるため、[keybd_event]関数を使った次第です。
[keybd_event]関数を使用したAeroSnapの処理は下記のようになります。
'--標準モジュール内 Public Declare Sub keybd_event Lib "user32.dll" (ByVal bVk As Byte, _ ByVal bScan As Byte, _ ByVal dwFlags As Long, _ ByVal dwExtraInfo As Long) Public Const VK_WIN = &H5B Public Const VK_LSHIFT = &HA0 Public Const VK_LEFT = &H25 Public Const VK_UP = &H26 Public Const VK_RIGHT = &H27 Public Const VK_DOWN = &H28 Public Const KEYEVENTF_KEYUP = &H2 '--クリック イベント内 '最大化 keybd_event VK_WIN, 0, 0, 0 keybd_event VK_UP, 0, 0, 0 keybd_event VK_UP, 0, KEYEVENTF_KEYUP, 0 keybd_event VK_WIN, 0, KEYEVENTF_KEYUP, 0 '標準状態 or 最小化 keybd_event VK_WIN, 0, 0, 0 keybd_event VK_DOWN, 0, 0, 0 keybd_event VK_DOWN, 0, KEYEVENTF_KEYUP, 0 keybd_event VK_WIN, 0, KEYEVENTF_KEYUP, 0 '左半分に最大化 keybd_event VK_WIN, 0, 0, 0 keybd_event VK_LEFT, 0, 0, 0 keybd_event VK_LEFT, 0, KEYEVENTF_KEYUP, 0 keybd_event VK_WIN, 0, KEYEVENTF_KEYUP, 0 '右半分に最大化 keybd_event VK_WIN, 0, 0, 0 keybd_event VK_RIGHT, 0, 0, 0 keybd_event VK_RIGHT, 0, KEYEVENTF_KEYUP, 0 keybd_event VK_WIN, 0, KEYEVENTF_KEYUP, 0 'サブ ディスプレイに移動/メイン ディスプレイに戻る keybd_event VK_WIN, 0, 0, 0 keybd_event VK_LSHIFT, 0, 0, 0 keybd_event VK_RIGHT, 0, 0, 0 keybd_event VK_RIGHT, 0, KEYEVENTF_KEYUP, 0 keybd_event VK_LSHIFT, 0, KEYEVENTF_KEYUP, 0 keybd_event VK_WIN, 0, KEYEVENTF_KEYUP, 0