「Excelの指定列でリストにある値だけを抽出したい」という問題についての解決案【UWSC】
「Excelの指定列でリストにある値だけを抽出したい」というテーマを取り上げてみたいと思います。
解決案
解決案としては、Excel の操作は「Excel(VBA)のマクロ」で作成して、作成した「Excel(VBA)のマクロ」を UWSC で実行するという方法ではどうでしょうか。
「UWSCでExcelのマクロを実行」することや「終了を待って続行する」ことについては「UWSCでExcelのマクロを実行し終了を待って続行するUWSCの使い方【UWSC】」という記事で書いています。
ここではUWSCで実行する「Excel(VBA)のマクロ」をどのようにすればよいかについて考えてみました。
Excel(VBA)のマクロでオートフィルタに関わる処理を行う場合の注意点
Excel(VBA)のマクロでオートフィルタに関わる処理を行う場合、汎用性を持たせるために抽出用の列をデータの配列とは別に設け、追加した抽出用の列にフラグを立て、フラグを選択して抽出するという方法がよいと思います。後から条件に変更があった場合でも対応が容易になるからです。
「母集団となるデータの配列」、「抽出対象を含むデータの配列」、「抽出の条件」という3つの要素
「母集団となるデータの配列」、「抽出対象を含むデータの配列」、「抽出の条件」のいずれも変更の可能性があるものとして取り扱います。
配列データの取り込み
「母集団となるデータの配列」、「抽出対象を含むデータの配列」をそれぞれ同一の Excel マクロ有効ブック(*.xlsm)の別々のシートに取り込みます。
(ここでは「母集団となるデータの配列」が Sheet1、「抽出対象を含むデータの配列」が Sheet2 に取り込まれたものとします)
例では、「母集団となるデータの配列」を「FIFA_LIST」、「抽出対象を含むデータの配列」を「AFC_LIST」としています。
「抽出の条件」の反映
取り込んだ「母集団となるデータの配列」、「抽出対象を含むデータの配列」をそれぞれ変数に格納します。ここでは仮に「母集団となるデータの配列」に1列分を加えたものを変数v1、「抽出対象を含むデータの配列」を変数v2に格納することにします。
変数v1のキー項目が何列目にあるか、変数v2のキー項目が何列目にあるかを確認してキー項目同士を照合し、条件に一致した場合には追加した1列分の配列に所定のフラグを立てます。(その際、キー項目が複数同士の場合でも同様の処理になります)
照合の結果(変数v1)を「母集団となるデータの配列」を取り込んだシートに上書きします。
例では、各配列の2列目を照合キーにしています。また、追加した1列分の配列を事前にクリアした後にフラグを立てています。
抽出
書き込まれた照合の結果(変数v1)には、追加した1列分の配列に所定のフラグが立っているはずなので、オートフィルタをかけ所定のフラグを選択することで対象が絞り込まれます。
Public MaxRow As String
Public MaxCol As String
Sub 照合_抽出_サンプルコード()
'-------------------------------------------------------------------
Sheets("Sheet2").Select
Application.Run "オートフィルタ解除"
Application.Run "最後のセルを選択"
v2 = Range(Cells(1, 1), Cells(MaxRow + 0, MaxCol + 0)).Value
'-------------------------------------------------------------------
Sheets("Sheet1").Select
Application.Run "オートフィルタ解除"
Application.Run "最後のセルを選択"
Range(Cells(2, 4), Cells(MaxRow + 0, 4)).ClearContents
v1 = Range(Cells(1, 1), Cells(MaxRow + 0, 4)).Value
'-------------------------------------------------------------------
For i = 2 To UBound(v1)
For j = 2 To UBound(v2)
If (v1(i, 2) = v2(j, 2)) Then
v1(i, 4) = 1
End If
Next
Next
Range(Cells(1, 1), Cells(UBound(v1), 4)).Value = v1
'-------------------------------------------------------------------
Sheets("Sheet1").Select
Application.Run "最後のセルを選択"
Application.Run "オートフィルタ設定"
ActiveSheet.Range("$A$1:$D$" & MaxRow + 0).AutoFilter Field:=4, Criteria1:="<>"
'-------------------------------------------------------------------
End Sub
Private Sub 最後のセルを選択()
'値の入った最後のセルを選択(開始)------------------------------------------
MaxRow = 1
MaxCol = 1
With ActiveSheet.UsedRange
On Error GoTo ErrHandler
MaxRow = .Find("*", , xlFormulas, , xlByRows, xlPrevious).Row
MaxCol = .Find("*", , xlFormulas, , xlByColumns, xlPrevious).Column
End With
Cells(MaxRow + 0, MaxCol + 0).Select
'値の入った最後のセルを選択(終了)------------------------------------------
ErrHandler:
End Sub
Private Sub オートフィルタ解除()
'オートフィルタでフィルタされていれば解除して全ての行を表示させる
If ActiveSheet.AutoFilterMode = True Then
'オートフィルタを解除する
ActiveSheet.AutoFilterMode = False
End If
End Sub
Private Sub オートフィルタ設定()
'オートフィルタモードになっているかどうか調べ、
'ONならまま、OFFならONにする
If ActiveSheet.AutoFilterMode = False Then
Application.Run "最後のセルを選択"
Range(Selection, "A1").Select
'オートフィルタを実行
Selection.AutoFilter
Else
'
End If
ErrHandler:
End Sub
まとめ
配列データの取り込み、「抽出の条件」の反映、抽出 という各段階をひとまとめにして実行する「Excel(VBA)のマクロ」にして、UWSCから実行することで、「母集団となるデータの配列」、「抽出対象を含むデータの配列」をそれぞれ取り込み、照合、抽出することが実現できると思います。
概要をまとめましたので必要に応じてアレンジしてみてください。
Excelで処理を行う際に配慮すべきいくつかの注意点
データに「,」(カンマ)が含まれるケースでは、取り込み元となるデータを「CSV(カンマ区切り) (*.csv)」にすべきではありません。ズレの原因になります。
「CSV(カンマ区切り) (*.csv)」で保存して、再度開いてみた際にデータの内容が変わる場合も同様です。郵便番号や電話番号の例で数字の先頭の「0」がなくなってしまう場合や住所の一部が日付に変更されてしまったりするのはよくある例です。ミスの原因になります。
データが、どのような値やフォーマットになっているのかについても注目する必要があります。文字列と数値など見え方が同じでも値の扱いや書式、フォーマットが違う場合がありますので、照合の際には条件を整える必要があります。照合が上手くいかない原因になります。
「Excelの指定列でリストにある値だけを抽出したい」という問題についての解決案について書いてみました。この記事が皆さんのお役に立てば幸いです。
有料エリアには何も情報がありません
記事を評価してくれた方はサポートもお願いします
ここから先は
¥ 100
この記事が気に入ったらサポートをしてみませんか?