【エクセルVBA】塵も積もればなんとやら VBAにキーボード入力をさせる方法


excel,vba,sendkeys
みなさまこんにちは、ノグチです。

以前の記事で、エクセルのChangeイベントを使って、指定セルに入力した値でマスタを検索して、検索にヒットした値をプルダウンリストに表示する方法をご紹介しました。

【エクセルVBA】Changeイベントと組み合わせてもっと便利に!検索にヒットした値をドロップダウンリストに表示する方法
エクセルのChangeイベントと、Validationオブジェクトを用いたドロップダウンリストを作成する方法を組み合わせて、セルに入力した値をマスタシートから検索し、検索にヒットした値を入力したセルのドロップダウンリストに表示させる方法をご紹介しています。この方法を使えば、入力作業が楽になるかもしれません。

自分で書いておいてなんですが、実はプルダウンリストを作成した後のステップに、ちょっとしたひっかかりを覚えておりました。

それは、「VBAで作ったプルダウンリスト、手動で開くのは面倒臭いな…」ということ。

どうせなら、VBAでプルダウンメニューを作ったら、シート上ですぐに開いてくれた方が嬉しいですよね。

私が使用しているPCの場合、エクセルシート上でプルダウンメニューを開くには、セルを選択してAlt +を押せばよいので、これらのキーを押したということをVBAに投げてやればよいはず…!

ということで今回は、VBAにキーボードを入力させたことにできる、SendKeysステートメントをご紹介します!

SendKeysステートメントとは

SendKesyステートメントは、今アクティブになっている画面上で、人間がでキーボード入力をしたときの動作を、VBAにさせることができるステートメントです。

簡単に言えば、人間がキーボードのEnterキーを押したときのように、VBAに対して「今開いている画面でEnterキーを押しなさい」と命令できるようなもの。

記述方法も非常に単純です。

SendKeys キーストローク , True or False

キーストロークは、キーボードのキーを指定する引数です。

キーストロークは文字列として指定する必要があるので、コードではこんな感じで指定することになります。

SendKeys "{ENTER}"

キーストロークの後に続く引数True or Falseは、以降の処理を、キーを押したことによって実行される処理が終わってから継続するのか(True)キーが押されたという情報が送られたら即継続するのか(False)、によって使い分けることができます。

この引数は省略可能で、その場合はTrueをがデフォルトになります。

SendKeysステートメントで指定できるキー

このステートメントで指定できるキーは、例えば以下のようなものがあります。

キーボードのキー 引数に指定する文字列
Enter {ENTER}
PageDown {PGDN}
PageUp {PGUP}
{UP}
{DOWN}
{LEFT}
{RIGHT}
Shift +
Ctrl ^
Alt %

今回の場合は、Alt + を指定したいので、「%{DOWN}」をVBAに記述すればよさそうです。

プルダウンメニューをSendKeysステートメントで開く

コードにSendKeysステートメントを組み込む

では、実際にSendKeysステートメントをコードに記述してみましょう。

今回使用するコードはこちら。

Private Sub Worksheet_Change(ByVal Target As Range)
Dim objCustom As Object
Dim myRange As Range    'マスタのセル範囲
Dim varList As Variant  'プロパティFormula1の文字列作成用
Dim strAdr  As String   '最初にヒットしたセル
'マスタリストの範囲をセット
Set myRange = Worksheets("マスタ").Range("A1:A6")
With ActiveSheet
    If Target = .Range("B5") Then
        On Error Resume Next
        Set objCustom = myRange.Find(what:=Target.Value, LookAt:=xlPart)
        Application.EnableEvents = False
        If objCustom Is Nothing Then
            Target.Value = Target.Value
        Else
            '1件目を文字列にセット
            varList = objCustom
            strAdr = objCustom.Address
            Do
                Set objCustom = myRange.FindNext(objCustom)
                If objCustom Is Nothing Then
                    Exit Do
                Else
                    If strAdr <> objCustom.Address Then
                        varList = varList & "," & objCustom
                    End If
                End If               
            Loop While Not objCustom Is Nothing And objCustom.Address <> strAdr
            
            With Target.Validation
                .Delete
                .Add Type:=xlValidateList, _
                Formula1:=varList
                .ShowError = False
            End With
            
            Target.Select
            SendKeys "%{Down}"

        End If
        Application.EnableEvents = True
    End If

End With
End Sub

以前の記事でご紹介した、シートのB5セルに入力した値をマスタシートから検索して、検索にヒットした値を全て入力セルのプルダウンメニューに表示させるというものです。

検索とプルダウンメニューの作成が終わったら、入力セルを選択して、38行目に差し込んだSendKesysステートメントで、Alt + を示す%{Down}を指定することによって、作成したプルダウンメニューを開くという動作にしています。

VBAを実行してプルダウンメニューを開いてみる

実際に上のコードを実行してみましょう。

SendKesys,入力セル

入力セルに「株」を入力して、実行してみると…

SendKeys,検索,プルダウンメニュー,オープン

この通り、VBAで検索した値が全てプルダウンメニューに表示され、且つ、シート上でプルダウンメニューが自動的に開かれていますね。

つまり、プルダウンメニューが作られた後に、キーボードのAlt + が入力されたことと同じ状態になっています。

これで、面倒臭い手動でプルダウンメニューを開く作業ともオサラバです!

最後に

今回は、今アクティブになっている画面上でVBAでキーボード入力をさせられる、SendKeysステートメントをご紹介しました。

今回のプルダウンメニューを開くように、1回1回の手作業は大した作業量ではないとしても、それがエクセルツールを使うたび、それも頻繁に使うとなると塵も積もればなんとやら、無視できない手間になってきます。

今回のSendKeysステートメントを使えば、そんなちょっとした手作業を軽減できるかもしれませんね。

それでは、最後までお読みいただきありがとうございました!

連載目次:エクセルVBAのイベントを使ってもっと便利なツールにしよう!

エクセルVBAでリストの重複を排除する方法として、Dictionaryオブジェクトを使った重複排除の方法をご紹介しています。

  1. 【エクセルVBA】イベントを使ってもっと便利なツールにしてみよう!WorksheetオブジェクトのChangeイベント
  2. 【エクセルVBA】ChangeイベントとEnableEventsプロパティで部分一致検索をする方法
  3. 【エクセルVBA】Validation.Addメソッドで入力規則のドロップダウンを作る方法
  4. 【エクセルVBA】Changeイベントと組み合わせてもっと便利に!検索にヒットした値をドロップダウンリストに表示する方法

コメント

  1. sado より:

    ExcelのSendKeysステートメントでは、Numlockが外れるというバグが発生し、テンキーで数値を入力する場合は非常に困ることになります。

    • ノグチ より:

      sadoさま
      こんにちは!コメントありがとうございます。
      SendKeysの不具合は、Shellを使ったりする方法があるようですね。
      有益な情報ありがとうございます!

タイトルとURLをコピーしました