<今回やること!>
氏名 | 年齢 | 体重(kg) | 判定 |
---|---|---|---|
佐藤 | 26 | 86.5 | 可 |
鈴木 | 19 | 72.3 | 優 |
高橋 | 31 | 102.5 | 良 |
- セルの自動移動
例)2文字入力したら、Enter等を押さなくても次のセルに移動する
- 小数点の入力を省略
例)865と入力したら、自動的に86.5になる
- テンキーで代替入力
例)優・良・可をテンキーで入力する
どれも入力時のキーボードの操作数を減らすためのマクロです。
Enterや小数点の省略は地味ですが、入力データが多い場合は、労力削減を実感できます。
以降で、詳しいやり方について説明します。
マクロを自分用に改造するには、Visual Basicというプログラム言語の知識が必要です。ただし、ちょっとした変更であれば、知識がなくても勘でなんとかなるかもしれません。
目次
作成するマクロの内容
入力するデータの形式に合わせて、列ごとに異なる処理を行います。
年齢は2ケタ等、入力値の範囲は決まっているものとします。
氏名 | 年齢 | 体重(kg) | 判定 |
---|---|---|---|
佐藤 | 26 | 86.5 | 可 |
鈴木 | 19 | 72.3 | 優 |
高橋 | 31 | 102.5 | 良 |
- 年齢の列
- Enter等を押さずにセルを移動:年齢は2ケタなので、2文字目を入力したら体重の列に移動する
- Enter等を押さずにセルを移動:年齢は2ケタなので、2文字目を入力したら体重の列に移動する
- 体重の列
- 小数点の入力を省略:10倍した値を入力して、セル移動時に自動的に値を10で割る(865と入力すると、自動的に86.5になる)
- Enter等を押さずにセルを移動:
入力値の文字数は、体重が20.0~199.9kgとすると、
『1文字目が1』=『値の範囲は100.0~199.9』=『全て4文字』
『1文字目が2~9』=『値の範囲は20.0~99.9』=『全て3文字』
なので、1文字目が1なら4文字目で、2~9なら3文字目で判定の列に移動する
- 小数点の入力を省略:10倍した値を入力して、セル移動時に自動的に値を10で割る(865と入力すると、自動的に86.5になる)
- 判定の列
- 数字キーで代替入力:1、2、3のキーを押したら、それぞれ優、良、可の文字が入力される
- Enter等を押さずにセルを移動:1文字入力されたら、次の行の年齢の列に移動する
- 数字キーで代替入力:1、2、3のキーを押したら、それぞれ優、良、可の文字が入力される
マクロの設定手順
データ入力先の表を貼り付ける
- 下記の表全体をコピー
氏名 年齢 体重(kg) 判定 佐藤 鈴木 高橋 - Excelの『Sheet1』のA1のセルを右クリックし、『形式を選択して貼り付け』をクリック
- 『貼り付ける形式』で『テキスト』を選択して『OK』をクリック
下記のようになります。
コードを貼り付ける
- Excelで、キーボードの『Alt + F11』を押す
『Visual Basic Editor(以下、VBE)』というマクロを編集するソフトが起動します。
- VBEの『プロジェクトエクスプローラ』で『Sheet1(Sheet1)』をダブルクリック
- 下記のコードをコピー
Private ClearFlg As Boolean 'セルの値の削除フラグ 'セルの選択範囲が変更された時に実行される関数 Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim i As Integer 'For文のカウント用変数 '選択中のセルの数が1つでない場合はReset_Keyラベルの位置まで処理を飛ばす If Target.Count <> 1 Then GoTo Reset_Key ClearFlg = True 'クリアフラグをTrueにする '選択したの列ごとの処理 Select Case Target.Column Case 2, 3, 4 '2、3、4列目のいずれかを選択した場合 'テンキー及びフルキー側の数字キーの0~9に関数を割り当て For i = 0 To 9 Step 1 'i=0~9まで繰り返す 'テンキー側の数字キーにSheet1のPressNumkey(i, Target.Column)を割り当て Application.OnKey "{" & i + 96 & "}", "'Sheet1.PressNumkey """ & i & """,""" & Target.Column & """'" 'フルキー側の数字キーにSheet1のPressNumkey(i, Target.Column)を割り当て Application.OnKey i, "'Sheet1.PressNumkey """ & i & """,""" & Target.Column & """'" Next i 'BackSpaceキーにSheet1ののCellClear()関数を割り当て Application.OnKey "{BS}", "Sheet1.CellClear" 'DeleteeキーにSheet1のCellClear()関数を割り当て Application.OnKey "{DEL}", "Sheet1.CellClear" Case Else GoTo Reset_Key 'Reset_Keyラベルの位置まで処理を飛ばす End Select Exit Sub '以降の処理をせずに関数を終了する Reset_Key: 'Reset_Keyラベル 'テンキー及びフルキー側の数字キーの0~9に関数を解除 For i = 0 To 9 Step 1 'i=0~9まで繰り返す Application.OnKey "{" & i + 96 & "}" 'テンキー側の数字キーの関数を解除 Application.OnKey i 'フルキー側の数字キーの関数を解除 Next i Application.OnKey "{BS}" 'BackSpaceキーの関数を解除 Application.OnKey "{DEL}" 'Deleteキーの関数を解除 End Sub '数字キーを押された時に実行される関数 Private Sub PressNumkey(key As String, Column As String) 'Key:押されたキー、Column:選択した列の番号 Dim MojiSu As Long '入力した文字数 Dim MoveFlg As Boolean 'セルの移動フラグ If ClearFlg = True Then Selection.Value = "" '選択中のセルの値を削除 ClearFlg = False '削除フラグをFalseにする End If Selection.Value = Selection.Value & key '選択中のセルの値の右に入力値つなげる MojiSu = Len(Selection.Value) 'セルの値の文字数を取得 '選択した列ごとの処理 Select Case Column Case 2 '2列目(年齢)の場合 If MojiSu >= 2 Then '2桁以上入力済みの場合 Selection.Offset(0, 1).Select 'セルの選択を次の列に移動 End If Case 3 '3列目(体重)の場合 If Left(Selection.Value, 1) >= 2 Then '1文字目が2以上の場合 If MojiSu >= 3 Then '4桁以上入力済みの場合 MoveFlg = True '移動フラグをTrueにする End If Else If MojiSu >= 4 Then '3桁以上入力済みの場合 MoveFlg = True '移動フラグをTrueにする End If End If If MoveFlg = True Then '移動フラグがTrueの場合 If IsNumeric(Selection.Value) Then 'セルの値が数字の場合 Selection.Value = Selection.Value / 10 'セルの値を10で割る End If Selection.Offset(0, 1).Select 'セルの選択を次の列に移動 End If Case 4 '4列目(判定)の場合 Select Case key Case 1 Selection.Value = "優" 'セルの値を優にする Case 2 Selection.Value = "良" 'セルの値を良にする Case 3 Selection.Value = "可" 'セルの値を可にする End Select Selection.Offset(1, 2 - Column).Select 'セルの選択を次の行の年齢の列(2列目)に移動 End Select End Sub 'セルの値を削除する関数 Private Sub CellClear() Selection.Value = "" '選択中のセルの値を削除 End Sub
- コピーしたコードをVBEの『コードウィンドウ』に貼り付ける
- VBEで、キーボードの『Alt + q』を押して、VBEを終了する
マクロ有効ブックとして保存する
マクロを設定した場合、そのまま保存しようとすると下記のメッセージ表示されます。
マクロを保存するには『ファイルの種類』を選ぶ必要があります。
作成したマクロのコードの説明
大まかな仕組み
セルの自動移動は、マクロによって、下記のようにキーボードの機能を切り替えることで実現しています。
通常:『1』キーを押す → セルに1を入力
変更:『1』キーを押す → 自作関数を実行
自作関数には、『セルに1を入力し、2文字目なら次のセルに移動』等の処理が記述されています。
特定の列のセルだけ、変更後の機能を使いたいので、セルの選択範囲が変更された時に、列によってキーボードの機能を切り替えます。
各関数について
『Private Sub Worksheet_SelectionChange(ByVal Target As Range)』はセルの選択範囲が変更された時に実行されるイベント関数です。
『Private Sub PressNumkey(key As String, Column As String)』は数字キー操作時の処理を記述した自作関数です。
『Private Sub CellClear()』は削除キー操作時の処理を記述した自作関数です。
コードの改良例
5列目のセルに4文字入力されたら、次のセルに移動させるようにします。
下記の2箇所を変更します。
- 『Private Sub Worksheet_SelectionChange(ByVal Target As Range)』内
-
変更前
'選択したの列ごとの処理 Select Case Target.Column Case 2, 3, 4 '2、3、4列目のいずれかを選択した場合
変更後
'選択したの列ごとの処理 Select Case Target.Column Case 2, 3, 4, 5 '2、3、4、5列目のいずれかを選択した場合 ←『, 5』を追加
- 『Private Sub PressNumkey(key As String, Column As String)』内
-
変更前
Case 4 '4列目(判定)の場合 Select Case key Case 1 Selection.Value = "優" 'セルの値を優にする Case 2 Selection.Value = "良" 'セルの値を良にする Case 3 Selection.Value = "可" 'セルの値を可にする End Select Selection.Offset(1, 2 - Column).Select 'セルの選択を次の行の年齢の列(2列目)に移動
変更後
Case 4 '4列目(判定)の場合 Select Case key Case 1 Selection.Value = "優" 'セルの値を優にする Case 2 Selection.Value = "良" 'セルの値を良にする Case 3 Selection.Value = "可" 'セルの値を可にする End Select Selection.Offset(0, 1).Select 'セルの選択を次の列に移動 ←次の列に移動するように変更 Case 5 '5列目の場合 ←5列目の処理を追加 If MojiSu >= 4 Then '4桁以上入力済みの場合 Selection.Offset(1, 2 - Column).Select 'セルの選択を次の行の年齢の列(2列目)に移動 End If
『Selection.Offset(0, 1).Select』は、セルの選択位置を変更する関数です。引数が(0, 1)の場合は、同じ行の1つ右の列のセルに移動します。
あとがき
マクロを設定したファイルを、誰かに渡す場合、マクロを設定したままで良いか注意して下さい。
あくまで個人的に作業を楽にするためにマクロを設定したのであれば、削除する必要があります。
マクロを削除するには、キーボードの『F12』を押して、『名前をつけて保存』を実行し、『ファイルの種類』に『Excel ブック(*xlsx)』を選択して保存します。
下記のメッセージが表示されたら、『はい』をクリックします。