大学時代の先輩から、VBAに関して困っていると連絡がありマクロを組んでみることにしました。想像していたよりもうまく機能したので、組み込んだ内容について説明したいと思います。
※全てについて書くと情報量が多くなると思うので、あくまでざっくりとした説明です。
詳細が知りたければご連絡ください。(笑)
依頼内容:対象は一つのファイル
一つのファイルの中に、たくさんシートがあって、それぞれ一つの項目ごとに数値が割り当てられているといったものでした。
項目名や数値は説明のために適当にしています。
上図のようなシートがたくさんあり、項目名や数値はバラバラです。そのたくさんのシートを下図のように一つにまとめるという依頼でした。
もしない項目があれば空欄にし、項目は随時足していきます。
まず初めに着手したこと
- 上図のA列のように手作業で項目を並べる
(重複しないように注意) - 一つ目のシートの項目名と比較して、一致するならB列に値をコピー&ペーストする
- 一致しないなら罫線を追加
ざっくりとコード記述
If Range A.Value = Range B.Value Then
Range C.Copy
Range D.Select
ActiveSheet.Paste
Else : Range E.Select
Selection.Borders.LineStyle = xlCountinuous
End If
※Range A~Eは任意の範囲です。
その他補足情報
Range A~Eにあたる部分は、Cells(a,b)として変数に対応できるようにしました。
※a,bは任意の値です。
For文の導入
まずは、上図であれば繰り返しを行うのは1~6行なので
For i =1 To 6
※任意の箇所のaをiに置き換える
で上記の記述がうまくいくことを確認します。
変数の取得
上図であれば具体的な6という数値がありますが、状況によってA列の長さは変わってきます。そこでこのように任意の変数を取得し、6をnに置換します。
n = Sheets(“シート名”).Cells(Rows.Count, 1).End(xlUp).Row
詳しい内容についてはコチラを見たほうが分かりやすいと思いますが、要するに『行番号が最も大きい値かつ、Aの列のセルから”Ctrl + 上”を押して選択された行番号』ということになります。”行番号が最も大きい値”は”Rows.Count”に、”Aの列”は”1″に相当します。
これで考えられうる最大の行番号を取得することができました。
照合する際の注意点
上述のFor iで一つループを作り、集約される方のシートにてループを行うように設定しましたが、集約する方のシートにもループが必要であり、同様にFor j = 1 To nとしました。
※初めに項目数の多くをA列に入力しておくことで、照合漏れは回避できるかと思います。しかしながら、項目数の差異が広がるほど無駄なループが発生してしまう問題があります。各シートごとに最大行数を取得するのがベストかと思われますが、かえってコードの記述が手間になってしまうと思ったのでスルーしました。
まとめ
これで主な一つ目の機能はほぼ完成です。
しかし、このままだと1対1のシートしか照合できません。
1対複数のシートを照合させるためには、複数のシートの数を把握し上述と似たような形でループさせないといけません。
次回は、シート数の取得と上述のざっくりとしたコードの少し詳細な部分についてまとめていきたいと思います。