LibreOffice-VBA 重複セルに連番をふって1以外削除するマクロ

2019/11/22

プログラム

t f B! P L
LibreOfficeでVBAマクロ実行。今回は
重複セルに連番をふって1以外削除するマクロ
を示す。

■LibreOffice-VBA 重複セルに連番をふって1以外削除するマクロ

  1. Option VBASupport 1
  2.  
  3. Sub sample16()
  4. Dim MR As Long
  5. Dim MC As Long
  6. Dim DP As Long
  7. Dim i As Long
  8. Dim j As Long
  9.  
  10. MR = Cells(Rows.Count, 2).End(xlUp).Row 'ω'最終行,B:B
  11. MC = Cells(1, Columns.Count).End(xlToLeft).Column 'ω'1:1,最終列
  12. DP = 15 'ω'重複セル削除列指定
  13. j = 1
  14.  
  15. Range(Cells(1, 1), Cells(MR, MC)).Sort _
  16. Key1:=Cells(1, DP), Order1:=xlAscending, _
  17. Header:=xlYes
  18.  
  19. ZZ = Range(Cells(1, MC + 1), Cells(MR, MC + 1))
  20. AA = Range(Cells(1, DP), Cells(MR + 1, DP))
  21. For i =2 To MR
  22. ZZ(i, 1) = j
  23. j = j + 1
  24. If AA(i, 1) <> AA(i + 1, 1) Then
  25. j = 1
  26. End If
  27. Next i
  28.  
  29. Range(Cells(1, MC + 1), Cells(MR, MC + 1)) = ZZ
  30. Cells(1, MC + 1) = "削除"
  31. Cells(1, 1).AutoFilter Field:=MC + 1, Criteria1:=1
  32. フィルタ削除01
  33. End Sub
※[1.] LibreOffice BasicでVBA使用に必要。
※[4.~8.] 変数宣言。
※[10.~11.] セル指定範囲取得。■過去記事■
※[12.] 重複セル削除列、15列目(O列)指定。
※[15.~17.] 重複セル並べ替え。■過去記事■
※[19.] 配列ZZ。連番値格納用。空白セルを仮格納。
※[20.] 配列AA。15列目(O列)の値を格納。
※[21.~27] For Next。2行目から最終行まで処理。
If Then End If。次セルと数値比較して
・同じ場合 j = j + 1 (連番カウント)
・違う場合 j = 1 (連番リセット)
※[29.] 配列ZZの連番値を最終列に格納。
※[31.] 連番列先頭行に名前「削除」をつける。
※[32.~33.] オートフィルタ。1以外削除。■過去記事■
「フィルタ削除01」部分
  1. Option VBASupport 1
  2.  
  3. Sub フィルタ削除01()
  4. Dim SN1 As String 'ω'以下フィルタ非該当行削除
  5. SN1 = ActiveSheet.Name
  6.  
  7. Cells.Select
  8. Worksheets(SN1).Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible).Copy
  9. Worksheets.Add(After:=Worksheets(Worksheets.Count)).Name = "削除01"
  10.  
  11. Dim DM1 as object
  12. Dim DP1 as object
  13. DM1 = ThisComponent.CurrentController.Frame
  14. DP1 = createUnoService("com.sun.star.frame.DispatchHelper")
  15. DP1.executeDispatch(DM1, ".uno:Paste", "", 0, Array())
  16.  
  17. Worksheets(SN1).AutoFilterMode = False
  18. Worksheets(SN1).Rows.Hidden = False
  19. Sheets(SN1).Cells.Clear
  20.  
  21. Worksheets("削除01").Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible).Copy
  22. Worksheets(SN1).Range("A1").PasteSpecial Paste:=xlPasteAll
  23. Sheets("削除01").Delete
  24. End Sub
※ペーストはLibreOffice流のコード使用。

■マクロ実行対象

「部品データ_191108.ods」の「部品表」シート。15列目(O列)。

■マクロ実行結果

実行すると、「AA」、「旧方式」、「新方式」、「」(ブランク)の
連番「1」以外の重複セルはすべて削除される。

■補足-エクセルVBA-重複セルに連番をふって1以外削除するマクロ

  1. Sub sample16e()
  2. Dim MR As Long
  3. Dim MC As Long
  4. Dim DP As Long
  5. Dim i As Long
  6. Dim j As Long
  7.  
  8. MR = Cells(Rows.Count, 2).End(xlUp).Row 'ω'最終行,B:B
  9. MC = Cells(1, Columns.Count).End(xlToLeft).Column 'ω'1:1,最終列
  10. DP = 15 'ω'重複セル削除列指定
  11. j = 1
  12.  
  13. Range(Cells(1, 1), Cells(MR, MC)).Sort _
  14. Key1:=Cells(1, DP), Order1:=xlAscending, _
  15. Header:=xlYes
  16.  
  17. ZZ = Range(Cells(1, MC + 1), Cells(MR, MC + 1))
  18. AA = Range(Cells(1, DP), Cells(MR + 1, DP))
  19. For i =2 To MR
  20. ZZ(i, 1) = j
  21. j = j + 1
  22. If AA(i, 1) <> AA(i + 1, 1) Then
  23. j = 1
  24. End If
  25. Next i
  26.  
  27. Range(Cells(1, MC + 1), Cells(MR, MC + 1)) = ZZ
  28. Cells(1, MC + 1) = "削除"
  29. Cells(1, 1).AutoFilter Field:=MC + 1, Criteria1:=1
  30. フィルタ削除01
  31. End Sub
※「Option VBASupport 1」なし。

  1. Sub フィルタ削除01()
  2. Dim SN1 As String 'ω'以下フィルタ非該当行削除
  3. SN1 = ActiveSheet.Name
  4.  
  5. Worksheets(SN1).Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible).Copy
  6. Worksheets.Add(After:=Worksheets(Worksheets.Count)).Name = "削除01"
  7. Worksheets("削除01").Range("A1").PasteSpecial Paste:=xlPasteAll
  8.  
  9. Worksheets(SN1).AutoFilterMode = False
  10. Sheets(SN1).Cells.Clear
  11.  
  12. Worksheets("削除01").Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible).Copy
  13. Worksheets(SN1).Range("A1").PasteSpecial Paste:=xlPasteAll
  14. Sheets("削除01").Delete
  15. End Sub
※LibreOffice流とはPasteやxlCellTypeVisibleコピーが異なる。

■あとがき

エクセルVBAの
重複セルに連番をふって1以外削除するマクロ
LibreOffice Basicでも使用できることを確認した。

「重複セルの最大値を残したい」など、
優先順位ある場合並べ替えに「Key2:=」追加する。
LibreOffice-VBA セルの並び替え-ソート 昇順-降順-範囲指定

今回使用した配列について補足。
ZZ(配列名)[〇行、〇列]とする。

配列ZZには最初、仮の空白セルを
ZZ[1,1]~ZZ[MR,1]まで格納。
⇒forループでZZ[2,1]=1、ZZ[3,1]=2、…1つずつ格納。
⇒ZZ[1,1]~ZZ[MR,1]の値をシート最終列の各セルに格納した。

配列AAは
AA[1,1]~AA[MR+1,1]に重複セルの値を格納。
⇒Ifで値を比較した。
MRが+1なのは最後のIf比較で次セル値が必要なため。

今回配列は1列目のみ使用したが、
セルを範囲指定して2列目以降にも格納可能。

配列を使うとシートに1回のアクセスで
まとめて値を入力できる。
セル1つ1つに値を入力して
その回数分シートにアクセスするより
処理速度がはやい。
以上。

ブログ アーカイブ

ラベル

このブログを検索

スポンサーリンク

自己紹介

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

QooQ