オートフィルタ-複数条件で抽出するマクロ
を示す。
■条件
・「部品データ_191108.ods」の
「Sheet1」がアクティブ(選択された)状態とする。
■LibreOffice-VBA-オートフィルタ-【A or B or C】
Option VBASupport 1 Sub sample07a() Cells(1, 1).AutoFilter Field:=15, Criteria1:=Array("AA", "旧方式", "") End Sub15列目(O列)の値が
「AA」か「旧方式」か「ブランク(入力無し)」のデータ行を抽出する。
■オートフィルタ-【A or B or C】実行結果
15列目(O列)の値が「AA」か「旧方式」か「ブランク(入力無し)」のデータ行が抽出された。
■LibreOffice-VBA-オートフィルタ-【A or B or C or…】
Option VBASupport 1 Sub sample07b() Cells(1, 1).AutoFilter Field:=15, Criteria1:=Array( _ "557274999", "522757999", "592724999", "595525999", "595625999", "524498999", "529654999", "556755999", "592262999", "596952999", _ "229289999", "587462999", "599494999", "529525999", "499522999", "555565999", "598822999", "569672999", "599274999", _ "522992999", "522485999", "522562999", "595685999", "594994999", "592579999", "592262999", "599956999", "556959999", "595996999", _ "526288999", "522785999", "596875999", "429555999") End Sub条件項目が複数ある場合、追記する。
VBAは1行の最大文字数が半角1,023文字までなので、
必要に応じて「_」(アンダースコア)記述改行する。
実行結果は15列目(O列)の値に「557274999」…などないので
抽出データなしとなる。
■LibreOffice-VBA-オートフィルタ-【A and B】
Option VBASupport 1 Sub sample07c() Cells(1, 1).AutoFilter 13, ">=10" フィルタ削除01 Cells(1, 1).AutoFilter 13, "<=100" フィルタ削除01 End Sub13列目(M列)の値が
「10以上」かつ「100以下」のデータ行を抽出する。
過去記事
■LibreOffice-VBA-別モジュールのSubプロシージャ呼び出し方法
で記述した「Sub フィルタ削除01()」を呼び出している。
以下に示す。
Option VBASupport 1 Sub フィルタ削除01() Dim SN1 As String 'ω'以下フィルタ非該当行削除 SN1 = ActiveSheet.Name Cells.Select Worksheets(SN1).Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible).Copy Worksheets.Add(After:=Worksheets(Worksheets.Count)).Name = "削除01" Dim DM1 as object Dim DP1 as object DM1 = ThisComponent.CurrentController.Frame DP1 = createUnoService("com.sun.star.frame.DispatchHelper") DP1.executeDispatch(DM1, ".uno:Paste", "", 0, Array()) Worksheets(SN1).AutoFilterMode = False Worksheets(SN1).Rows.Hidden = False Sheets(SN1).Cells.Clear Worksheets("削除01").Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible).Copy Worksheets(SN1).Range("A1").PasteSpecial Paste:=xlPasteAll Sheets("削除01").Delete End Sub
■オートフィルタ-【A and B】実行結果
13列目(M列)の値が
「10以上」かつ「100以下」のデータ行抽出
⇒それ以外の行は削除となる。
「10以上」かつ「100以下」のデータ行抽出
⇒それ以外の行は削除となる。
■LibreOffice-VBA-オートフィルタ-【A and B and C and…】
Option VBASupport 1 Sub sample07c() Cells(1, 1).AutoFilter 13, ">=10" フィルタ削除01 Cells(1, 1).AutoFilter 13, "<=100" フィルタ削除01 Cells(1, 1).AutoFilter 15, "新方式" フィルタ削除01 'ω'…追記 End Sub条件項目が複数ある場合、
AutoFilter⇒「フィルタ削除01」※上記【A and B】参考。
を交互に追記する。
全ての条件に合うデータ行が残る。
■補足-エクセルVBA-オートフィルタ-複数条件で抽出する
エクセルVBAの場合「Option VBASupport 1」を削除する。また、「Sub フィルタ削除01()」は
LibreOffice流の記述が混ざってるので過去記事
■LibreOffice-VBA-オートフィルタで抽出した行以外を削除するマクロ
のエクセルVBAの記述を使う。
■あとがき
今回はオートフィルタで複数条件をつけてデータ抽出するマクロを示した。【A or B or C】は抽出のみだが、「フィルタ削除01」を追記すれば
抽出した行以外を削除可能。
【A and B】オートフィルタはマクロの場合、
複数条件の同時抽出はできなかったと思う。
故に抽出したデータ以外は削除して再抽出する。
※一応オートフィルタ条件「Criteria2:=」まであるけど
「Criteria3:=」ないので使わず。
「Criteria2:=」使わなくても問題ないプログラム人生だった。
余談だがオートフィルタの「Field:=」は省略可。
「Criteria1:=」は「Criteria1:=Array()」の場合必要で
「Array()」不使用なら省略可。
私は配列「Array()」よく使うので
単体条件でも「Criteria1:=Array()」使用して、
ついでに「Field:=」も略さない場合が多い。
「sample07d」やな。好みの問題。
■オートフィルタ-コード省略。実行結果は3つとも同じ。
Option VBASupport 1 Sub sample07d() Cells(1, 1).AutoFilter Field:=15, Criteria1:=Array("AA") End Sub Sub sample07e() Cells(1, 1).AutoFilter Field:=15, Criteria1:="AA" End Sub Sub sample07f() Cells(1, 1).AutoFilter 15, "AA" End Subコード省略した方が見た目スッキリするけどね。
【全体の流れ】
以前の工程については過去記事を参照。
【過去記事】
■LibreOfficeでエクセルVBAマクロを実行する方法
※実際にマクロを動かす準備。
■LibreOfficeマクロ-日付が名前に含まれるxlsxファイルをひらく
※【開始】xlsxファイルをひらく。
■LibreOffice-VBA-Sheet表示倍率指定⇒ファイル名変更保存
※【終了】xlsxファイルを保存する。
■LibreOffice-VBA-アクティブシート以外のシートを全部削除する
※【処理】シート全部削除。
■LibreOffice-VBA-オートフィルタで抽出した行以外を削除するマクロ
※【処理】オートフィルタ該当行以外のデータ削除。
■LibreOffice-VBA-別モジュールのSubプロシージャ呼び出し方法
※【プログラム記述方法】Subプロシージャ呼び出し。
■LibreOffice-VBA-オートフィルタ-複数条件で抽出するマクロ
※【処理】この記事。オートフィルタ複数条件抽出。
以上。