Excel。プロでない人向け。抽出から別シートにコピー~並び替えという一連の流れのマクロを確認してみよう。
<Excel VBA>
ビジネスシーンで、単純処理は、マクロで処理したほうが楽ということが多々あります。そこで今回は、Excel VBAで作成するもののなかで基本形である。
1・データから抽出処理
2・該当データを別シートにコピー
3・貼り付けたデータを並び替え
という一連の流れのマクロをExcel VBAで作って確認してみましょう。
次のようなデータを用意しました。
出荷管理シートと、新宿というシートがあるファイルです。新宿シートは何もデータはありません。
実際に作るExcel VBAの構文は、
Sub 新宿抽出()
Worksheets("出荷管理").Range("a1").AutoFilter field:=2, Criteria1:="新宿"
Worksheets("出荷管理").Range("a1").CurrentRegion.Copy Worksheets("新宿").Range("a1")
Worksheets("出荷管理").Range("a1").AutoFilter
With Worksheets("新宿").Sort
.SortFields.Clear
.SortFields.Add Key:=Range("c1"), SortOn:=xlSortOnValues, Order:=xlAscending
.SetRange Range("a1").CurrentRegion
.Header = xlYes
.Apply
End With
End Sub
行数自体は少ないですが、Excel VBAに不慣れだと、なんか難しそうな感じですよね。
【抽出処理】
最初に行うのは、B列の店舗名が新宿を抽出する処理ですね。「Excel VBAではどうしたらいいの?」と考えてしまう人が結構いますが、マクロと同じで、オートフィルターで店舗名が新宿を抽出するやり方通りに記述していけば、イメージしやすいと思います。
実際の処理を確認してみると、
1・表の中見出し行にオートフィルターを設定しますので見出しのA1を選択
2・データタブのオートフィルターをONにします。
3・抽出条件を設定します。
4・データをコピーして、貼り付けます。
5・オートフィルターを解除して作業終了。
という流れですね。
まさにこの通りの構文を書いていきます。
次の3行で1~5を行っています。
Worksheets("出荷管理").Range("a1").AutoFilter field:=2, Criteria1:="新宿"
Worksheets("出荷管理").Range("a1").CurrentRegion.Copy Worksheets("新宿").Range("a1")
Worksheets("出荷管理").Range("a1").AutoFilter
Worksheets("出荷管理").Range("a1").AutoFilter field:=2, Criteria1:="新宿"
これは、A1にある表にオートフィルター(AutoFilter)を設定する処理です。
特に範囲選択しなくても、オートフィルターを設定できますよね。
field:=2は、フィールド(field)が2なので、2列目という意味ですね。
Criteria1は、クライテリアといって、抽出条件のことで、抽出条件の1つ目は、”新宿”ということを設定しています。1~3までをこの一行で行っています。
Worksheets("出荷管理").Range("a1").CurrentRegion.Copy Worksheets("新宿").Range("a1")
この行で、抽出されたA1から連続したセル(CurrentRegion)、つまり”表”をコピーして、Worksheets("新宿").Range("a1")なので、新宿シートのA1に貼り付ける。
という処理をしています。
Worksheets("出荷管理").Range("a1").AutoFilter
AutoFilterってまたオートフィルターを設定するの?と思っちゃいますが、Excelでオートフィルターをやめる時って、オートフィルターのボタンを””””オフ”にしますよね。
だから、同じような行を書くことで、オートフィルターを終了することができます。
【並び替えはダイアログボックスのままを構文にすればいい】
続いて、抽出したデータを、出荷数の「昇順」で並び替えを行います。それが、次の行ですね。
With Worksheets("新宿").Sort
.SortFields.Clear
.SortFields.Add Key:=Range("c1"), SortOn:=xlSortOnValues, Order:=xlAscending
.SetRange Range("a1").CurrentRegion
.Header = xlYes
.Apply
End With
なんか敷居が一気にあがちゃった感じがしますが、これ、並び替えのダイアログボックスと全く同じなんですよ。
With Worksheets("新宿").Sort~End Withですが、Withの間、「Worksheets("新宿").Sort」という文字を省略することができるという意味です。
Withの間の行のすべてに本来は、Worksheets("新宿").Sortを付けないといけないわけですが、長くなって煩雑になるということもありますが、ただ単に、『面倒』なので、省略ができるならそのほうが楽な訳ですね。
まず、確認のために、並び替えダイアログボックスを表示して、流れを確認してみましょう。
.SortFields.Clear
並び替えが残っていると、第1優先キーにならないので並び替え処理をクリアするしょりが、この行ですね。
.SortFields.Add Key:=Range("c1"), SortOn:=xlSortOnValues, Order:=xlAscending
何とかプロパティーが…とかテキストに書かれていますが、ダイアログボックスを見れば一目瞭然。
SortFields.Addは、「レベルの追加」ボタンを押す作業です。通常はダイアログボックスを開くと、自動的に最優先されるキーが表示されていますが、これが必要ですね。
Key:=Range("c1")は、「最優先されるキー」を設定します。
今回は、出荷数なので、C1ですね。
SortOn:=xlSortOnValuesは、「並び替えのキー」を設定します。
値で並び替えなので、xlSortOnValuesを記入します。
Order:=xlAscendingは、「順序」の設定。
Office365は、昇順・降順でなくて、「小さい順」「大きい順」と表示がわかりやすいように(?)変わりました。
xlAscendingは、昇順ですね。xlDescendingは、降順ですね。今回は、昇順なので、xlAscendingを使います。
.SetRange Range("a1").CurrentRegion
並び替えを実行すると自動的に範囲選択されますよね。あの処理ですね。
.Header = xlYes
ヘッダーをYesってなんだ?と思うかもしれませんが、これも、並び替えのダイアログボックスの右上にある、「先頭行をデータの見出しとして使用する」のことですね。
今回は、先頭行を見出しとして使用しますので、xlYesと設定します。
.Applyは、ご存知、実行ボタンですね。
ということで、ダイアログボックスの設定を構文にしましたって感じですね。
では、実行してみましょう。
このように、データの抽出~コピー&ペースト~並び替えのマクロを簡単に作ることができますので、少しずつExcel VBAに慣れるようにしていきましょう。