LibreOffice-VBA-オートフィルタ-複数条件で抽出するマクロ

2019/11/12

プログラム

t f B! P L
LibreOfficeでVBAマクロ実行。今回は
オートフィルタ-複数条件で抽出するマクロ
を示す。

■条件
・「部品データ_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 Sub
15列目(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 Sub
13列目(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以下」のデータ行抽出
⇒それ以外の行は削除となる。

■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-オートフィルタ-複数条件で抽出するマクロ
※【処理】この記事。オートフィルタ複数条件抽出。

以上。

ブログ アーカイブ

ラベル

このブログを検索

スポンサーリンク

自己紹介

機械メーカー総合職正社員10年勤務後退職。 エクセルVBAプログラム歴 5年。 LibreOffice(無料)でVBAマクロ検証。
■Fortniteクエスト攻略動画■
■Twitter■
⇒詳細プロフィールを表示

QooQ