[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『複数列の値が重複したデータを、削除ではなく空白にしたい』(よっち)
いつもお世話になっております。
VBAを使用し業務の簡略化をはかっているのですが、
御指南お願いしたい部分が出てきたので投稿させていただきました。
タイトル通り、複数列の値が重複した場合、一行目だけ残して空白にするマクロを組みたいと思っています。
例えば
りんご みかん バナナ 梨
りんご みかん バナナ 桃
りんご レタス キウイ 苺
↓
りんご みかん バナナ 梨
桃
りんご レタス キウイ 苺
のように、上のりんご、みかん、バナナと複数列に渡って重複した部分だけ空白にしたのです。
検索したところ、自分のやりたいことに近いのはこの命令かなと思ったのですが、
'重複行を削除
Worksheets("Sheet1").Range("A:C").RemoveDuplicates Columns:=Array(1, 3), Header:=xlYes
行を削除ではなく空白にしたい場合、どのような命令があるでしょうか
勉強不足で申し訳ないのですが、御指南いただければ幸いです。
< 使用 Excel:Microsoft365、使用 OS:Windows10 >
数式案です。 見出し行があったり、2行目からはじまっていることが前提ですが、
F2 =IF(SUM(N(A1:D1=A2:D2))>1,IF(A1:D1=A2:D2,"",A2:D2),A2:D2) 下コピー
|[A] |[B] |[C] |[D]|[E]|[F] |[G] |[H] |[I] [1]| | | | | | | | | [2]|りんご|みかん|バナナ|梨 | |りんご|みかん|バナナ|梨 [3]|りんご|みかん|バナナ|桃 | | | | |桃 [4]|りんご|レタス|キウイ|苺 | |りんご|レタス|キウイ|苺 (フォーキー) 2023/12/04(月) 20:27:38
VBA案です。
Sub test() Dim v, key$, tmp$, r&, c& With Sheets.Add Call SetData v = .Range("A1").CurrentRegion key = GetKey(v, 1) For r = 2 To UBound(v) tmp = GetKey(v, r) If tmp = key Then For c = 1 To UBound(v, 2) - 1 v(r, c) = Empty Next Else key = tmp End If Next .Range("F1").Resize(UBound(v), UBound(v, 2)) = v End With End Sub Sub SetData() [A1:A3].Formula2 = "=SEQUENCE(1,3)" [A4:A6].Formula2 = "=SEQUENCE(1,3,4)" [A7].Formula2 = "=SEQUENCE(1,3,7)" [A8:A10].Formula2 = "=SEQUENCE(1,3,10)" [D1].Formula2 = "=CHAR(SEQUENCE(10)+64)" [A1:D10].Value = [A1:D10].Value End Sub Function GetKey$(v, rowNo&) If Not IsArray(v) Then Exit Function Dim c&, key ReDim key(1 To UBound(v, 2) - 1) For c = 1 To UBound(v, 2) - 1 key(c) = v(rowNo, c) Next GetKey = VBA.Join(key, "♪") End Function (まる2021) 2023/12/04(月) 20:47:36
Sub test() Dim dic As Object Dim r As Range, s As String
Set dic = CreateObject("scripting.dictionary")
For Each r In Cells(1).CurrentRegion.Rows s = WorksheetFunction.TextJoin(vbTab, False, WorksheetFunction.Sort(r, 1, 1, True)) If dic.exists(s) Then r.ClearContents dic(s) = True Next
End Sub (マナ) 2023/12/04(月) 21:21:37
早とちりでした
Sub test2() Dim dic As Object Dim r As Range, c As Range, s As String
Set dic = CreateObject("scripting.dictionary")
For Each r In Cells(1).CurrentRegion.Rows Set c = Union(r.Cells(1), r.Cells(3)) s = Evaluate("TextJoin(char(9), False," & c.Address & ")") If dic.exists(s) Then c.ClearContents dic(s) = True Next
End Sub (マナ) 2023/12/04(月) 23:57:55
フォーキー様、まる2021様もありがとうございます!
今後コードを組むときに参考にさせていただきます!
(よっち) 2023/12/05(火) 14:47:46
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.