「No」や「ID」の項目などで重複のない番号を自動入力する際に、以下のようにROW関数を活用して入力することがあります。

しかし、ROW関数を活用して入力していると、表を並べ替えた時に番号が更新されてしまい、番号と他の項目との相関性がなくなってしまいます。

ということで今回は、相関性を保ったまま重複のない番号を自動入力する仕組みの実現方法について解説します。
※こちらで開発したファイルは記事の最後にて配布しています。
1. 開発準備
今回は、以下の表の「Name」の項目に値が入力されると同時に、「No」の項目に重複のない番号を入力するという仕組みを実現します。

そのように、特定のシートで特定のセルが編集された時に処理を自動で実行するには、「シートモジュール」の「イベントプロシージャ」を活用します。
シートモジュールは、該当するシートのタブ上で右クリックし、[コードの表示]を選択することで表示することができます。

選択すると、以下のエディタ画面(VBE)が表示されます。
また、該当するシートのシートモジュールが表示された状態になります。
「Option Explicit」は、VBEの設定内容次第では表示されません。「Option Explicit」についての解説はこちらでは省略します。

次に、該当するシートのセルに値を入力すると同時に処理が実行される特殊なプロシージャ(イベントプロシージャ)を用意する必要があります。
そのためには、シートモジュールの左上のリストから「Worksheet」を選択します。

「Worksheet」を選択すると、自動で「Worksheet_SelectionChange」というプロシージャが表示されます。
このプロシージャは、該当するシート上のいずれかのセルが選択されると同時に処理が実行されるイベントプロシージャになります。

ただ、今回使用するイベントプロシージャは、セルに値を入力すると同時に処理が実行されるものになります。
そのため、右上のリストから「Change」を選択します。

表示された「Worksheet_Change」というプロシージャを活用します。
「Worksheet_SelectionChange」というプロシージャに関しては削除して問題ないです。

2. コードの記述
以下のコードを記述します。
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Row >= 3 And _
Target.Column = 3 Then
If Cells(Target.Row, "B").Value = "" Then
Cells(Target.Row, "B").Value = _
WorksheetFunction.Max(Columns("B")) + 1
End If
End If
End Sub
では、コードについて解説していきます。
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Row >= 3 And _
Target.Column = 3 Then
'省略
End If
End Sub
「Worksheet_Change」というプロシージャの引数の「Target」に、編集されたセルの情報が渡されるため、そのセルの情報から、表の対象のセルが編集されたかどうかを確認しています。
こちらでは、Targetの行番号が3以上、尚且つ、列番号が3の時、要するに「Name」の項目が編集されたかどうかを判定しています。

この条件を満たした場合に、Ifの中の処理を実行します。
If Cells(Target.Row, "B").Value = "" Then
Cells(Target.Row, "B").Value = _
WorksheetFunction.Max(Columns("B")) + 1
End If
先ほどの条件を満たしたときに、編集されたセルと同じ行のB列、即ち「No」の項目が空かどうかを確認しています。
「No」の項目が空の場合に、その項目に、B列に入力されている数値の最大値に1を加えた数値を入力しています。
3. 完成
以上の内容で実現できます。
「Name」の項目に値を入力した時、尚且つ、その行の「No」の項目が空の場合に、今までの番号の最大値に1を加えた数値が自動で入力されます。

また、数式ではなく直接数値が入力されているため、並べ替えた際に他の項目との相関性がなくなってしまうことはありません。

▼サンプルファイル▼
























































































