Excelでは、データ処理をする時に何度も同じ作業をするということがありますが、そういう機能を一つ一つショートカットキーで操作しても結局は操作の手数が減らないので最終的な効率化にはならないのではないかなと思っています。
せっかくショートカットキーにするのであれば、複数の機能を一気に操作できるようにマクロにしてそのマクロをショートカットキーに登録すればいいのではないかなということなのですがその記事がこちらです。
究極のショートカットキーの使い方。ショートカットキーは自分で作れ!
今回はその応用で3年くらい前からずっとやりたかったことなのですが今までスキルがそこまでなくて作れないでいたのですが、やっとそれを作ることができたのでそれを紹介したいと思います。
二つの表があってその表の間でデータをガッチャンコするにはVLOOKUP関数を使うのですが、ひとつVLOOKUP関数を作成して縦方向にはコピーできるのですが横方向にはコピーできないので一つ一つ列番号を変えながら作っていくしかないのですね。何よりも今日のどこがキー項目でとか判断するのもVLOOKUP関数を、エラー回避を含めて作成するとか一切面倒でやりたくないというところが本音なのです。
だから、いわゆるトランザクションの表とマスターの表をクリックするだけで、VLOOKUP関数で連携する項目が追加されるというのが理想だと思っていたのです。
そこで作成したものがこちらです。
クリックしただけでというのはなかなか難しかったので、トランザクションの表のうち一つのセルをクリックしたらCtrl+Shift+V、その後、マスターの表のうち一つのセルをクリックしたらCtrl+Shift+Lのショートカットキーを押したらそれだけでVLOOKUP関数がエラー回避も含めて作成されて、トランザクションに不足しているマスターの項目が追加されるという動作にしました。
VBAソースは以下の通りです。
'* * * * * *
'VLOOKUP関数を自動的に作成する
'トランザクションの1セルを選択してFuncVLOOKUPsetTransactionを実行、
'マスターの1セルを選択してFuncVLOOKUPsetMasterを実行すると
'トランザクションにマスターデータを追加するVLOOKUP関数を挿入します。
'* * * * * *
Dim D1 As Range 'トランザクションの中の1セルを選択
Dim D2 As Range 'マスターの中の1セルを選択
'トランザクション選択
Sub FuncVLOOKUPsetTransaction()
'選択セルが表データではない場合エラー
If ActiveCell.CurrentRegion.Count = 1 Then
MsgBox ("トランザクションを選択してください")
End
End If
'アクティブセルをグローバル変数D1に格納
Set D1 = ActiveCell
End Sub
'マスター選択しVLOOKUP関数生成
Sub FuncVLOOKUPsetMaster()
'トランザクションが選択されていなかったらエラー
If D1 Is Nothing Then
MsgBox ("はじめにトランザクションを選択してください")
End
End If
'選択セルが表データではない場合エラー
If ActiveCell.CurrentRegion.Count = 1 Then
MsgBox ("マスターを選択してください")
End
End If
'トランザクションとマスターが同じ範囲ならエラー
If D1.CurrentRegion.Address = ActiveCell.CurrentRegion.Address Then
MsgBox ("範囲が同じです")
End
End If
'アクティブセルをグローバル変数D2に格納
Set D2 = ActiveCell
'トランザクションの四つ角の位置を計算
Dim c1 As Long
Dim c2 As Long
Dim r1 As Long
Dim r2 As Long
r1 = D1.CurrentRegion(1).Row
r2 = r1 + D1.CurrentRegion.Rows.Count - 1
c1 = D1.CurrentRegion(1).Column
c2 = c1 + D1.CurrentRegion.Columns.Count - 1
'トランザクションにキーがなかったらエラー
If WorksheetFunction.CountIf(D1.CurrentRegion.Rows(1), D2.CurrentRegion(1).Value) = 0 Then
MsgBox ("トランザクションにキーが見つかりません")
Set D1 = Nothing
End
End If
'グローバル変数D1をトランザクションのキーのセルに再計算
Set D1 = D1.CurrentRegion(1).Offset(0, _
WorksheetFunction.Match(D2.CurrentRegion(1).Value, D1.CurrentRegion.Rows(1), 0) - 1 _
)
'マスターにあってトランザクションにない項目の抽出
Dim colx1 As Range, colx2 As Range
Dim colx()
Dim i As Long
Dim fl As Boolean
For Each colx2 In D2.CurrentRegion.Rows(1).Columns
fl = True
For Each colx1 In D1.CurrentRegion.Rows(1).Columns
If colx1.Value = colx2.Value Then
fl = False
End If
Next
If fl Then
i = i + 1
ReDim Preserve colx(i)
colx(i) = colx2
End If
Next
'トランザクションに追加する項目数の列を挿入
Range(Columns(c2 + 1), Columns(c2 + i)).Insert
'トランザクションの挿入した列に項目名とVLOOKUP関数を入力
Dim D2adr As String
D2adr = "[" & D2.Parent.Parent.Name & "]" & D2.Parent.Name & "!" _
& D2.CurrentRegion.Address(ReferenceStyle:=xlR1C1)
Dim i2 As Long
Dim keycol As Long
Dim colnum As Long
For i2 = 1 To i
D1.Parent.Cells(r1, c2 + i2).Value = colx(i2)
keycol = D1.Column - (c2 + i2)
colnum = WorksheetFunction.Match(colx(i2), D2.CurrentRegion.Rows(1), 0)
D1.Parent.Cells(r1 + 1, c2 + i2).Formula _
= "=IFERROR(VLOOKUP(RC[" & keycol & "]," & D2adr & "," & colnum & ",FALSE),"""")"
D1.Parent.Cells(r1 + 1, c2 + i2).Copy _
Range( _
D1.Parent.Cells(r1 + 1, c2 + i2), D1.Parent.Cells(r2, c2 + i2) _
)
Next
'グローバル変数D1をリセット
D1.Parent.Parent.Activate
D1.Parent.Select
D1.Parent.Range("A1").Select
Set D1 = Nothing
End Sub
このマクロに前出の記事にある方法でショートカットキーを設定して呼び出すようにするだけです。
この記事で言いたいことは、VBAやマクロって何かの一覧表の管理とか電子カルテとまではいきませんがそのような業務遂行ツールを作るだとか、そのようなイメージが強いかもしれません。確かにそういうものを作れば業務効率化に直接影響するのでそれが魅力とも言えます。
でも、このようなExcelに対する機能追加、カスタマイズという意味でより使いやすくするという目的でも使えるということを伝えたかったのです。
▼実際の動作ファイルはこちら




コメント