ラベル 連携 の投稿を表示しています。 すべての投稿を表示
ラベル 連携 の投稿を表示しています。 すべての投稿を表示

他のプログラムを動かす: SendKeys

文章を書くのはWordが得意だったり、計算をするのはExcelだったりと、ソフトによって得意な分野が異なることから、用途に応じてソフトを使い分けていると思います。そこで、VBAで他のソフトを動かせるようになるとますます世界が広がります。 "SendKeys"はこの中でも一番ベーシックな関数で、キーストロークを他のプログラムに渡すものです。応用すると、プリントする際に、両面指定や白黒⇔カラー印刷の変更なども、このSendKeysを使って行うことができます。

まず最初の例として、メモ帳を立ち上げて、そこに文字を記録するプログラムです。
'新しくwindowを立ち上げる場合
Sub test()
  Shell "Notepad.exe", 1
  SendKeys "この文字列が記録されます"
End Sub








次は、既に立ち上がっているメモ帳に、文字を記入する場合です。この場合は、"AppActivate"関数を使って、そのwindowをアクティブにします。AppActivateには、該当のプログラムのタイトルバーに表示されている文字列を渡します。
'既に起動しているメモ帳に記録する場合
Sub test2()
  AppActivate "notepad"       'タイトルバーの文字列を指定
  SendKeys "この文字列が記録されます"
  SendKeys "{Enter}"           'Enterキーを押すのに相当
End Sub









Ctrl、Shift、Altなどを押す場合はそれぞれ "^"、"+"、"%"で指定します。
'既に起動しているメモ帳に記録する場合
Sub test3()
  AppActivate "notepad"          'タイトルバーの文字列を指定
  SendKeys "この文字列が記録されます"
  SendKeys "{Enter}"

  SendKeys "^s"                      ' Ctrl + s(保存)
'  SendKeys "+(ab)"                 ' Shiftを押しながらa, bと押す
  SendKeys "%{F4}"                ' Alt + F4(閉じるコマンド)
End Sub

関数の呼び出し: Call

プログラムが大きくなると、一つのプロシージャの中に全てを書いていくと、後で振り返って直したり、プログラムを追加したり、ということが不可能なほど奇奇怪怪、冗長なプログラムになってしまう危険性があります。そこで機能毎にプログラムを小分けすることで、振り返りやすくなります。 ここでは、関数を呼ぶ方法を紹介します。"Call xxx"と記述することで、関数xxxを呼び出すことができます。"Call"をつけるとわかりやすいですが、つけなくても動きます。下の例ではcells(2,2)、B2セルに2を代入する関数を作り、それをmainから呼び出しています。
' 関数を呼び出す
Sub main()
  Call subfunction               '関数を呼ぶ
End Sub

Function subfunction()       '関数の定義
  Cells(2, 2) = 2
End Function











引数をつけて関数を呼び出すこともできます。関数を定義する最初の functionの名前の後の括弧内に、呼び出す引数を定義します。ここではdouble型の引数を一つ定義していて、cells(2,2)、B2セルにその数値を書き込むようになっています。
' 引数を与えて関数を呼び出す
Sub main2()
  Dim a#                               '変数(double型)を定義
  a = 1.5                                '変数の値を入力

  Call subfunction2(a)          '関数を呼び出し
End Sub


Function subfunction2(x#)
  Cells(2, 2) = x
End Function

子プロシージャの呼び出し

プログラムが大きくなると、一つのプロシージャの中に全てを書いていくと、後で振り返って直したり、プログラムを追加したり、ということが不可能なほど奇奇怪怪、煩雑なプログラムになってしまう危険性があります。そこで機能毎にプログラムを小分けすることで、振り返りやすくなります。

ここでは、プロシージャを呼ぶ方法を紹介します。"Call xxx"と記述することで、プロシージャxxxを呼び出すことができます。子プロシージャは同じモジュールに記述する必要は無いので、モジュール自身も上手にカテゴライズすると良いです。
' 親プロシージャ
Sub test()
  Call subtest    '別プロシージャの呼び出し
End Sub

'子プロシージャ(親から呼び出される側)
Sub subtest()
  Cells(2, 2) = 1
End Sub