グループなどを管理している表で、隣のグループの表に氏名を移動したいことってありませんか?
今回は、そんな時に便利な右クリックするだけで氏名を移動できる仕組みを実現していきます。
左側の表から右側の表へ、右側の表から左側の表へ移動することができる仕組みになります。

※こちらで開発したファイルは記事の最後にて配布しています。
1. 開発準備
今回は、表の中のセルを右クリックすることで、隣の表にデータを移動するという仕組みを実現してきます。
特定のシートの特定のセルを右クリックすることで何かしら処理を実行するには、該当するシートのシートモジュールを活用します。
シートモジュールは、該当するシートのタブ上で右クリックし、[コードの表示]を選択することで表示することができます。

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

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

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

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

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

2. コードの記述
以下のコードを記述します。
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
If Target.CountLarge = 1 And _
Target.Row >= 3 Then
Dim lRow As Long
If Target.Column = 2 Then
Cancel = True
lRow = Cells(Rows.Count, "C").End(xlUp).Row
Cells(lRow + 1, "C").Value = Target.Value
Target.Delete xlUp
ElseIf Target.Column = 3 Then
Cancel = True
lRow = Cells(Rows.Count, "B").End(xlUp).Row
Cells(lRow + 1, "B").Value = Target.Value
Target.Delete xlUp
End If
End If
End Sub
では、コードについて解説していきます。
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
If Target.CountLarge = 1 And _
Target.Row >= 3 Then
'省略
End If
End Sub
「Worksheet_BeforeRightClick」というプロシージャの引数の「Target」に、右クリックされたセルの情報が渡されるため、そのセルの情報から、表の対象の範囲内が右クリックされたかどうかを確認しています。
こちらでは、「右クリックされたセルが単体(複数範囲を選択した上での右クリックでない)で3行目以上のセル」と、まずは対象の表のデータ行が右クリックされたかどうかを確認しています。

この条件を満たした場合に関してのみ、Ifの中の処理を実行します。
Dim lRow As Long
If Target.Column = 2 Then
'省略
ElseIf Target.Column = 3 Then
'省略
End If
lRowという変数は、移動先の表の最終行の行番号を格納する用の変数になります。
こちらは後で使用します。
その次のIfで、右クリックされたセルが2列目(B列)なのか3列目(C列)なのかによって、処理を分岐しています。
Cancel = True
lRow = Cells(Rows.Count, "C").End(xlUp).Row
Cells(lRow + 1, "C").Value = Target.Value
Target.Delete xlUp
右クリックされたセルが2列目(B列)の場合は、「Cancel = True」で右クリック時のメニューが表示されないようにし、lRowに移動先の表(C列)の最終行の行番号を格納しています。
行番号は、C列の一番下のセルからCtrlキーとカーソルキーの上を押して止まった位置のセルの行番号を最終行の行番号として取得しています。
その次に、その取得した行番号の1つ下のセルに、右クリックされたセルの値を格納し、右クリックされたセルを削除して上に詰めています。
Cancel = True
lRow = Cells(Rows.Count, "B").End(xlUp).Row
Cells(lRow + 1, "B").Value = Target.Value
Target.Delete xlUp
右クリックされたセルが3列目(C列)の場合は、先ほどのB列とC列を入れ替えた処理を行っています。
3. 完成
以上の内容で実現できます。
移動したい氏名が入力されているセルの上で、右クリックすることで、その氏名を隣の表に移動することができます。

▼サンプルファイル▼