前提・実現したいこと
ある発注機関の発注機関コードおよび組織名をまとめたExcelファイルから、組織名が重複しているレコードを抽出するマクロを作成しています。
Excelファイルのテーブルは以下の通りです。
A列の「ID」で重複はありません。
B列の「発注機関コード」に重複が存在しますが、今回はC列の「発注機関名」の重複のみ抽出します。
D列に「重複」の項目を追加し、C列の組織名が重複するレコードのうち、「ID」が最大値のレコードを抽出するのが目的です。
なお、1行目はテーブルのタイトル(セルA1に「発注機関マスタ」)で、2行目がテーブルの見出しになっています。
また、テーブルの途中には空白行が存在する場合があります。
発注機関マスタ
ID | 発注機関コード | 発注機関名 |
---|---|---|
1 | 11111 | AAA |
2 | 22222 | BBB |
3 | 33333 | CCC |
4 | 11111 | AAA |
5 | 55555 | EEE |
6 | 11111 | CCC |
7 | 77777 | GGG |
8 | 88888 | AAA |
9 | 99999 | JJJ |
このテーブルから、
- セルD2に「重複」の見出しを追加する
- 「ID」の値の大きい順に並べ替え、空白行を無くす
- セルD3にCOUNTIF関数の式を入力する(自分より上の行に同じ組織名が無ければ「1」、あれば「1」より大きな数字になり増えていく)
- 同じ式をオートフィルで最下部までコピーする
以上の操作を行った結果が以下の通りです。
発注機関マスタ
ID | 発注機関コード | 発注機関名 | 重複 |
---|---|---|---|
9 | 99999 | JJJ | 1 |
8 | 88888 | AAA | 1 |
7 | 77777 | GGG | 1 |
6 | 11111 | CCC | 1 |
5 | 55555 | EEE | 1 |
4 | 11111 | AAA | 2 |
3 | 33333 | CCC | 2 |
2 | 22222 | BBB | 1 |
1 | 11111 | AAA | 3 |
該当のソースコード
作成したソースコードは以下の通りです。
Excelの「マクロの記録」を使用しながら編集したので、不要なコードが含まれている可能性があります。もしあればご指摘いただけると幸いです。
VBA
1Option Explicit 2 3Sub sortDuplicate() 4 ' D列に見出しを追加 5 Range("D2").Select 6 With Selection.Interior 7 .Pattern = xlSolid 8 .PatternColorIndex = xlAutomatic 9 .ThemeColor = xlThemeColorDark1 10 .TintAndShade = -0.14996795556505 11 .PatternTintAndShade = 0 12 End With 13 14 Selection.Borders(xlDiagonalDown).LineStyle = xlNone 15 Selection.Borders(xlDiagonalUp).LineStyle = xlNone 16 17 With Selection.Borders(xlEdgeLeft) 18 .LineStyle = xlContinuous 19 .ColorIndex = 0 20 .TintAndShade = 0 21 .Weight = xlThin 22 End With 23 24 Selection.Borders(xlEdgeTop).LineStyle = xlNone 25 Selection.Borders(xlEdgeBottom).LineStyle = xlNone 26 27 With Selection.Borders(xlEdgeRight) 28 .LineStyle = xlContinuous 29 .ColorIndex = 0 30 .TintAndShade = 0 31 .Weight = xlThin 32 End With 33 34 Selection.Borders(xlInsideVertical).LineStyle = xlNone 35 Selection.Borders(xlInsideHorizontal).LineStyle = xlNone 36 37 With Selection 38 .HorizontalAlignment = xlCenter 39 .VerticalAlignment = xlCenter 40 .WrapText = False 41 .Orientation = 0 42 .AddIndent = False 43 .ShrinkToFit = False 44 .ReadingOrder = xlContext 45 .MergeCells = False 46 End With 47 48 ' 先頭行に「重複」と記入 49 ActiveCell.FormulaR1C1 = "重複" 50 ActiveCell.Characters(1, 2).PhoneticCharacters = "チョウフク" 51 52 ' 並べ替えの範囲選択 53 Range("A2:D13").Select 54 55 ' IDの大きい順に並べ替え 56 ActiveWorkbook.Worksheets("発注機関マスタ").sort.SortFields.Clear 57 ActiveWorkbook.Worksheets("発注機関マスタ").sort.SortFields.Add2 Key:=Range( _ 58 "A3:A13"), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:= _ 59 xlSortNormal 60 With ActiveWorkbook.Worksheets("発注機関マスタ (4)").sort 61 .SetRange Range("A2:D13") 62 .Header = xlYes 63 .MatchCase = False 64 .Orientation = xlTopToBottom 65 .SortMethod = xlPinYin 66 .Apply 67 End With 68 69 ' 重複データのうち一番上の行を取得 70 Range("D3").Select 71 ActiveCell.FormulaR1C1 = "=COUNTIF(R3C[-1]:RC[-1],RC[-1])" 72 Range("D3").Select 73 Selection.AutoFill Destination:=Range("D3:D11") 74 Range("D3:D11").Select 75 76 ' ブックを上書き保存 77 ActiveWorkbook.Save 78 79End Sub 80
発生している問題・エラーメッセージ
このマクロでは、レコードの対象範囲を絶対参照で指定し処理した上で成功しました。
ただし、今後、レコードが追加および削除される可能性があり、その度に範囲指定を変更するのは手間がかかるので、最終行を自動で指定するようにコードを修正したいと思っています。
範囲を指定するコード(.SetRangeの行)でUsedRangeに換えて試したのですが、
エラー 9 「インデックスが有効範囲にありません。」
このように表示されてしまいました。
試したこと
途中に空白行が存在するため、UsedRangeと書いても空白行の上の行までで範囲選択されてしまうことが考えられます。
空白セルを無視して最下部の行まで選択し、並び替えおよび重複抽出ができるようにしたいです。
なにか良いアイデアがありましたら、ご教示いただきますよう、何卒よろしくお願いいたします。

回答2件
あなたの回答
tips
プレビュー