VBAでExcelの機能をブーストさせる使い方

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に対する機能追加、カスタマイズという意味でより使いやすくするという目的でも使えるということを伝えたかったのです。

▼実際の動作ファイルはこちら

autovlookup

コメント

タイトルとURLをコピーしました