モーリーのメモ

プログラミングやCG作成等、アプリ開発を中心に情報を収集中!

入力した文字数によってセルを自動で移動する!:Excel

<今回やること!>

    氏名年齢体重(kg)判定
    佐藤2686.5
    鈴木1972.3
    高橋31102.5
 Excelに上の表のデータを楽に入力出来るように次のマクロを設定します。
  • セルの自動移動
    例)2文字入力したら、Enter等を押さなくても次のセルに移動する
  • 小数点の入力を省略
    例)865と入力したら、自動的に86.5になる
  • テンキーで代替入力
    例)優・良・可をテンキーで入力する
 
 どれも入力時のキーボードの操作数を減らすためのマクロです。
 Enterや小数点の省略は地味ですが、入力データが多い場合は、労力削減を実感できます。
 
 以降で、詳しいやり方について説明します。
 
 マクロを自分用に改造するには、Visual Basicというプログラム言語の知識が必要です。ただし、ちょっとした変更であれば、知識がなくても勘でなんとかなるかもしれません。

使用環境

 今回使用した環境です。

作成するマクロの内容

 入力するデータの形式に合わせて、列ごとに異なる処理を行います。
 年齢は2ケタ等、入力値の範囲は決まっているものとします。

    氏名年齢体重(kg)判定
    佐藤2686.5
    鈴木1972.3
    高橋31102.5
  • 年齢の列
    • 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文字目で判定の列に移動する
  • 判定の列
    • 数字キーで代替入力1、2、3のキーを押したら、それぞれ優、良、可の文字が入力される
    • Enter等を押さずにセルを移動1文字入力されたら、次の行の年齢の列に移動する

マクロの設定手順

データ入力先の表を貼り付ける

  1. 下記の表全体をコピー
    氏名年齢体重(kg)判定
    佐藤
    鈴木
    高橋
  2. Excelの『Sheet1』のA1のセルを右クリックし、『形式を選択して貼り付け』をクリック
    f:id:mmorley:20170603132514p:plain:w250
  3. 『貼り付ける形式』で『テキスト』を選択して『OK』をクリック
    f:id:mmorley:20170519103402p:plain:w350
    下記のようになります。
    f:id:mmorley:20170627164540p:plain

コードを貼り付ける

  1. Excelで、キーボードの『Alt + F11』を押す
    Visual Basic Editor(以下、VBE)』というマクロを編集するソフトが起動します。
  2. VBEの『プロジェクトエクスプローラ』で『Sheet1(Sheet1)』をダブルクリック
    f:id:mmorley:20170627114240p:plain
  3. 下記のコードをコピー

    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 '234列目のいずれかを選択した場合
                'テンキー及びフルキー側の数字キーの0~9に関数を割り当て
                For i = 0 To 9 Step 1  'i=09まで繰り返す
                    'テンキー側の数字キーに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=09まで繰り返す
            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
    

  4. コピーしたコードをVBEの『コードウィンドウ』に貼り付ける
    f:id:mmorley:20170627163747p:plain
  5. VBEで、キーボードの『Alt + q』を押して、VBEを終了する

マクロ有効ブックとして保存する

 マクロを設定した場合、そのまま保存しようとすると下記のメッセージ表示されます。
f:id:mmorley:20170627170044p:plain
 マクロを保存するには『ファイルの種類』を選ぶ必要があります。

  1. Excelで、キーボードの『Ctrl + s』を押す
  2. 『ファイルの種類』で、『Excel マクロ有効ブック(*xlxm)』を選択し、『ファイル名』を入力した後、『保存』ボタンをクリック
    f:id:mmorley:20170628152208p:plain

マクロを設定したExcelファイルを開く

 マクロが設定されたExcelファイルを開くと、次のようセキュリティの警告が表示されます。

    f:id:mmorley:20170704231701p:plain
 設定されているマクロに覚えがあり、問題がなければ、『コンテンツの有効化』ボタンを押してマクロを有効にします。
『x』を押して閉じると、マクロが無効になります。

作成したマクロのコードの説明

大まかな仕組み

 セルの自動移動は、マクロによって、下記のようにキーボードの機能を切り替えることで実現しています。
 通常:『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箇所を変更します。

  1. 『Private Sub Worksheet_SelectionChange(ByVal Target As Range)』内
      変更前

          '選択したの列ごとの処理
          Select Case Target.Column
              Case 2, 3, 4 '234列目のいずれかを選択した場合
      

      変更後

          '選択したの列ごとの処理
          Select Case Target.Column
              Case 2, 3, 4, 5 '2345列目のいずれかを選択した場合 ←『, 5』を追加
      

  2. 『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)』を選択して保存します。
 下記のメッセージが表示されたら、『はい』をクリックします。
f:id:mmorley:20170627170044p:plain