重複セルに連番をふって1以外削除するマクロ
を示す。
■LibreOffice-VBA 重複セルに連番をふって1以外削除するマクロ
Option VBASupport 1
Sub sample16()
Dim MR As Long
Dim MC As Long
Dim DP As Long
Dim i As Long
Dim j As Long
MR = Cells(Rows.Count, 2).End(xlUp).Row 'ω'最終行,B:B
MC = Cells(1, Columns.Count).End(xlToLeft).Column 'ω'1:1,最終列
DP = 15 'ω'重複セル削除列指定
j = 1
Range(Cells(1, 1), Cells(MR, MC)).Sort _
Key1:=Cells(1, DP), Order1:=xlAscending, _
Header:=xlYes
ZZ = Range(Cells(1, MC + 1), Cells(MR, MC + 1))
AA = Range(Cells(1, DP), Cells(MR + 1, DP))
For i =2 To MR
ZZ(i, 1) = j
j = j + 1
If AA(i, 1) <> AA(i + 1, 1) Then
j = 1
End If
Next i
Range(Cells(1, MC + 1), Cells(MR, MC + 1)) = ZZ
Cells(1, MC + 1) = "削除"
Cells(1, 1).AutoFilter Field:=MC + 1, Criteria1:=1
フィルタ削除01
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」部分
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
※ペーストはLibreOffice流のコード使用。■マクロ実行対象
「部品データ_191108.ods」の「部品表」シート。15列目(O列)。■マクロ実行結果
実行すると、「AA」、「旧方式」、「新方式」、「」(ブランク)の連番「1」以外の重複セルはすべて削除される。
■補足-エクセルVBA-重複セルに連番をふって1以外削除するマクロ
Sub sample16e()
Dim MR As Long
Dim MC As Long
Dim DP As Long
Dim i As Long
Dim j As Long
MR = Cells(Rows.Count, 2).End(xlUp).Row 'ω'最終行,B:B
MC = Cells(1, Columns.Count).End(xlToLeft).Column 'ω'1:1,最終列
DP = 15 'ω'重複セル削除列指定
j = 1
Range(Cells(1, 1), Cells(MR, MC)).Sort _
Key1:=Cells(1, DP), Order1:=xlAscending, _
Header:=xlYes
ZZ = Range(Cells(1, MC + 1), Cells(MR, MC + 1))
AA = Range(Cells(1, DP), Cells(MR + 1, DP))
For i =2 To MR
ZZ(i, 1) = j
j = j + 1
If AA(i, 1) <> AA(i + 1, 1) Then
j = 1
End If
Next i
Range(Cells(1, MC + 1), Cells(MR, MC + 1)) = ZZ
Cells(1, MC + 1) = "削除"
Cells(1, 1).AutoFilter Field:=MC + 1, Criteria1:=1
フィルタ削除01
End Sub
※「Option VBASupport 1」なし。Sub フィルタ削除01()
Dim SN1 As String 'ω'以下フィルタ非該当行削除
SN1 = ActiveSheet.Name
Worksheets(SN1).Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible).Copy
Worksheets.Add(After:=Worksheets(Worksheets.Count)).Name = "削除01"
Worksheets("削除01").Range("A1").PasteSpecial Paste:=xlPasteAll
Worksheets(SN1).AutoFilterMode = 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
※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つに値を入力して
その回数分シートにアクセスするより
処理速度がはやい。
以上。


