仕事に活用できるExcelマクロ

実践的なExcelマクロ、活用方法などを情報発信するサイト

【Excel VBA】SendKeys ステートメント

 SendKeys ステートメントは、キーボードのいづれかのキーが押されたように振舞わせる処理を行います。

 

【構文】

SendKeys ①キー指定,②ウェイト

1.引数(パラメータ)の解説

No
引数
省略
解説
1 キー指定 × いづれかのキーを指定します。
2 ウェイト

True を指定するとSendKeys ステートメントでの処理が完了後に制御が戻ります。Falseを指定または、省略の場合は処理が済むのを待たずに実行が可能になります。(Falseでエラーが起こる場合は、True にすると処理がうまくいくかも)

2.キー指定と解説

キー
解説
SHIFT +
CTRL ^
ALT %
Enter {ENTER}
BackSpace {BS}
CapsLock {CAPSLOCK}
半角/全角 {kanji}
Delete {DEL}
Tab {TAB}
PrintScreen {PRTSC}
{UP}
^
NumLock {NUMLOCK}
PageUp {PGUP}
PageDown {PGDN}
F1 ~ F15 {F1} ~ {F15}

 代表的なキー指定を紹介します。ほかのキー指定もありますが種類が多いので割愛します。

3.コードの例

'1→2→3と押した ----------
SendKeys123'文字列【エクセル】を入力 ----------
SendKeys “エクセル”
	
'Enterを押した ----------
SendKeys “{ENTER}”

'SHIFT+Zを押した ----------
SendKeys+(z)'Enterを10回押した ----------
SendKeys “{ENTER 10}”

 使用頻度が多い例として紹介します。これらを参考にすれば大方のケースに対応できるかと思います。

【Excel VBA】ブックの起動時にIMEを自動的に起動させる

 Excelブックを開いた時に日本語入力ソフト(IME)を自動的に起動させるコードを紹介します。

 通常は、Excelを起動させるとIMEがOFFの状態なので 半角/全角キーを押さなければ文字入力は半角の状態になっています。

 このコードは、Excelの起動時にIMEをONの状態にしてスムーズに全角入力を行えるようにするためのものです。

f:id:Yuki_Kaze:20200316001528p:plain

 「開発」のタブを開き、VBエディター」に入ります。

 上記の画像で説明があるようにコードは「ThisWorkbook」の中に記述します。

Private Sub Workbook_Open()
'ブックの起動時にIMEを自動的に起動させる
    SendKeys "%{kanji}"
End Sub

  上記のコードが「ThisWorkbook」の中に記述するコードになります。

 Private Sub Workbook_Open() というコードは、Excelブックを起動時に自動実行させるコードに対して最初に記述されます。

 意味としては、「これから記述されるコードは、このExcelブックが開かれた時に自動実行されます」と理解するとよいと思います。

 標準モジュールのコードは、マクロをこちらから実行させる必要があり、自動実行させることはできません。

 ブックが開かれた時に自動実行させるには、「イベント処理」という形にする必要があります。

 「イベント処理」とは、ある動作に対してOS がExcel に実行させる処理であり、その場合のコードと記述する場所は、決められています。

 そのために今回の場合は「ThisWorkbook」の中にコードを記述することになります。

 SendKeys ステートメントは、キーボードのいづれかのキーを自動的に押されたことにする場合に使われます。

 SendKeys "%{kanji}" と記述すると半角/全角キーが押されたことになり、IMEがONの状態になります。

ez-info.hatenablog.com

【ファイルを保存】オートシェイプを画像ファイルで出力する

 Excelシート上で描画したオートシェイプ画像ファイルとして出力するコードを紹介します。

 報告書とかマニュアルなどの作成でイラスト画像を使う機会は多いと思います。

 イラストレータなどで作成したりしなくてもExcelには、オートシェイプという便利な機能があります。

 イラストレータとかを起動させると Windows の処理が重くなりますし、むしろシンプルなイラスト画像や略図なら使い慣れている方の多いオートシェイプで作ったほうが効率的ともいえます。

 ただオートシェイプは直接画像で出力はできないので画像として出力するには、ひと工夫する必要があります。

 今回は、それをExcelマクロで自動で行うコードを構築してみました。

Sub オートシェイプを画像ファイルで出力する()
'
' オートシェイプを画像ファイルで出力する Macro
'
'変数の宣言 ----------
Dim filPath As String
Dim sheName As String

sheName = ActiveSheet.Name 'アクティブシート名を変数 sheName に代入する。

Cells.Select

Selection.CopyPicture Appearance:=xlScreen, Format:=xlPicture
ActiveSheet.PasteSpecial Format:="図 (拡張メタファイル)", Link:=False, _
    DisplayAsIcon:=False
    
filePath = Application.GetSaveAsFilename(InitialFileName:="規定の名称.html", FileFilter:="Webファイル,*.html*") ' 保存のダイアログを表示 ----------

If filePath = "False" Then
    Selection.Delete
    MsgBox "キャンセルされました処理を終了します。"
    Exit Sub ' キャンセルした場合は、処理を終了する ----------
End If

' 保存する処理 ----------
filePath = filePath & "html"

'Call wb.SaveAs(filePath) ' 名前を付けて保存 ----------

'アクティブシートのA1~Z50の範囲の画像を書き出す処理 ----------
    With ActiveWorkbook.PublishObjects.Add(xlSourceRange, _
        filePath, sheName, "$A$1:$Z$50", _
        xlHtmlStatic, "Shape", "")
        .Publish (True)
        .AutoRepublish = False
    End With
    Selection.Delete ' 貼り付けた画像を削除する ----------
    Range("A1").Select
    MsgBox "オートシェイプを画像ファイルとして出力しました。"
End Sub

  上記のコードは、Excel上でWebページとして保存する処理を利用しています。

 Webページとしての保存を行うとファイル名.files という名前のフォルダーが作成されてフォルダー内にワークシート上のオートシェイプが PNG 画像として保存されます。

 このコードは、その一連の処理を「マクロの記録」で作成し、それにオートシェイプのグループ化、保存のダイアログ表示などを追加したものです。

 それとこのコードは、注釈にもあるようにアクティブシート内についてセル範囲(A1~Z50)にあるオートシェイプしか処理できません。

 オートシェイプのある範囲を所得するコードを追加すると記述が長くなるので今回は、省略しました。

 それと画像ファイルのみを出力させようとするなら作成されたフォルダーから対象の画像をフォルダー外に移動させてその後にフォルダーを削除する処理が必要です。

 今回は、シンプルな例としてさきほどのコードを紹介しました。

 次回は、画像ファイルのみを出力し、なおかつコードの記述をコンパクトにして紹介をしたいと思います。

【Excel VBA】Application.GetOpenFilename メソッド

 ファイルの開くためのダイヤログボックスを表示するには、ApplicationオブジェクトのGetOpenFilenameメソッドを使います。

【構文】

Application.GetOpenFilename=(FileFilter, FilterIndex, Title, ButtonText, MultiSelect)

パラメータ 省略 データ型 内容
FileFilter Variant ファイル形式を文字列で指定します。
FilterIndex Variant FileFilterで指定したファイル形式のペアに対して何番目を既定として表示するのかを指定します。
Title Variant ファイルの選択するウィンドウのタイトルを指定します。
ButtonText Variant Macintoshのみ指定できます。
MultiSelect Variant 複数ファイルの選択が可能であるかをTrueかFalseをで指定します。

【例】

filName = Application.GetOpenFilename("Microsoft Excelワークブック,*.xlsx,Microsoft Excelマクロブック,*.xlsm", 1, Excelブックを開く, , False)

 上記の例は、Excelのワークブックとマクロブックのいずれかを指定するコードです。

 パラメータ(FileFilter)の部分は””で囲むようにして記述し、"Microsoft Excelワークブック,*.xlsx”のように表示する文字列とワイルドカードを含んだファイル形式を1ペアとします。

 その後のパラメータ(FilterIndex)は、パラメータ(FileFilter)で指定したペアの内、何番目を既定とするかそ指定します。

 上記のコードでは、1を指定しているので最初のペアである"Microsoft Excelワークブック,*.xlsx”が既定となります。

 2を指定すればMicrosoft Excelマクロブック,*.xlsm"が既定となります。

【ファイルを開く】ファイルのアイコンを非表示または、最小表示で開く

 Excelマクロを処理する上で他のExcelファイルを開くなどファイルを開いて表示させる機会は多いと思います。

 ファイルを開くときにタスクバーに表示されるファイルのアイコンを非表示か最小表示で開くと処理の時間は、少なくてすみ処理時間の短縮になります。

ファイルのアイコンを最小表示で開く

Sub アイコンを最小表示でファイルを開く()
'
filName = Application.GetOpenFilename
    Workbooks.Open filName
    ActiveWindow.WindowState = xlMinimized
End Sub

  ファイルを開くウィンドウで選択したファイルを最小表示にすることができます。

 filName = Application.GetOpenFilename

 によって選択したファイル名を 変数 filName に代入させます。

 次に Workbooks.Open メソッドに  変数 filName を割り当ててファイルを開きます。

 最後に ActiveWindow.WindowStat プロパティ に xlmaximized を指定することでファイルのウィンドウ表示について最小化を行います。

 以上が一連の処理となります。 

ファイルのアイコンを非表示で開く

Sub アイコンを非表示でファイルを開く()
'
filName = Application.GetOpenFilename
    Workbooks.Open filName
    ActiveWindow.Visible = False
End Sub

 こちらは、ファイルを開くウィンドウで選択したファイルを非表示にすることができます。

 ActiveWindow.WindowStat プロパティ に False を指定することでファイルのウィンドウ表示を非表示にしています。

ez-info.hatenablog.com

 

【メッセージ】メッセージボックスを表示する

 Excelマクロにおいて色々なタイプのメッセージボックスの表示方法があります。

 msgBox 変数における定数どうしの組み合わせで多種多様のパターンが作り出せるのですが今回は、その中でも代表的なものを紹介します。

Sub メッセージボックスその1()
'
'シンプルなメッセージを表示する
'
    MsgBox "Excelマクロ"

'
End Sub

  最初に最もシンプルなメッセージボックスのパターンを紹介します。

 msgBox 変数に直接、表示する文字列を組み込んだものです。

Sub メッセージボックスその2()
'
'メッセージボックスにタイトルと改行した文章を表示する
'
    MsgBox "Excelマクロ" & vbCrLf & "「で作業速度アップ」", , "メッセージ"

'
End Sub

  次にメッセージボックスにタイトル文改行した文章を表示するパターンです。

 文字列の間に 「& vbCrLf &」を入れることで改行することができます。

  タイトル文は、msgBox 変数における定数の中で最後尾で指定します。

Sub メッセージボックスその3()
'
'メッセージボックスに変数を組み込んだ場合
'
'変数の宣言 ----------
Dim strWord1 As String
Dim strWord2 As String
Dim strWord3 As String

'変数に文字列を代入する ----------
strWord1 = "Excelマクロ"
strWord2 = "で作業速度アップ"
strWord3 = "メッセージ"

'メインの処理 ----------
    MsgBox strWord1 & vbCrLf & strWord2, , strWord3 & "1"
    
    MsgBox strWord1 & strWord2, , strWord3 & "2"

'
End Sub

  メッセージボックスに変数を組み込んだものです。

 割と使う機会は、多いと思います。

 メッセージボックスは、改行ありとなしの2パターンが表示されます。

Sub メッセージボックスその4()
'
'メッセージボックスで「はい」と「いいえ」を選択する
'
'変数の宣言 ----------
Dim Sel As Integer

'メインの処理 ----------
    Sel = MsgBox("続けますか?", vbYesNo + vbQuestion)
    
    If Sel = vbYes Then
        MsgBox "あなたは、はいを選びました。"
    ElseIf Sel = vbNo Then
        MsgBox "あなたは、いいえを選びました。" & vbCrLf & "これで終わります"
    End If

'
End Sub

  「はい」と「いいえ」のようにメッセージボックスの中で選択ができるようにしたパターンです。

 これも使う機会は多そうです。

Sub メッセージボックスその5()
'
'メッセージでいろいろなタイプのアイコンを表示する
'
    MsgBox "問い合わせです。", vbQuestion, "問い合わせメッセージ"
    
    MsgBox "注意です。", vbExclamation, "注意メッセージ"
    
    MsgBox "情報です。", vbInformation, "情報メッセージ"

'
End Sub

  最後に紹介するのは、メッセージボックスにメッセージのタイプに応じたアイコンを表示するパターンです。

 vbExclamation を指定すると出る注意メッセージのパターンは、表示されるときにWindowsで設定されているサウンドを鳴らします。

 用途によって使い分けるとよいと思います。

【Excel VBA】RmDir ステートメント

Excel VBARmDir ステートメントによってフォルダーを作成することができます。

【構文】

RmDir フォルダー名

Sub フォルダーの作成()
'
'変数の宣言 ----------
Dim foName As String

foName = "MyFolder"

  'フォルダーを作成する ----------
      MsgBox (foName & "のフォルダーを削除します。"), vbInformation
      RmDir ThisWorkbook.Path & "\" & foName
  End If

End Sub

 上記のコードは、変数 foName に"MyFolder"というフォルダー名の代入しています。

 その後、RmDir ステートメント にワークブックの直下を表すActiveWorkbookというパス名と変数 foNameを合算させて"MyFolder"というフォルダーを削除しています。