6/03/2019

Excel。プロでない人向け。抽出から別シートにコピー~並び替えという一連の流れのマクロを確認してみよう。【VBA】

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に慣れるようにしていきましょう。