(D) 列中有重复的值。
如何使用 vba 从 D 列中提取唯一值并合并到单个单元格 (H1) 中而不丢失数据
例如:“J10P,G345,R1,J10G”
我尝试使用此代码来提取唯一值,但它并不准确:
ActiveSheet.Columns(4).AdvancedFilter Action:=xlFilterCopy, CopyToRange:=ActiveSheet.Range("H1"), Unique:=True
编辑:我发现此代码仅提取唯一值并放入列(H),我测试过并且可以工作。现在我只需要代码来合并 H 列中的单元格
' Extract unique values from Column D
Dim D As Object, C As Variant, i As Long, lr As Long
Set D = CreateObject("Scripting.Dictionary")
lr = Cells(Rows.Count, 1).End(xlUp).Row
C = Range("D1:D" & lr)
For i = 1 To UBound(C, 1)
D(C(i, 1)) = 1
Next i
Range("H1").Resize(D.Count) = Application.Transpose(D.keys)
答案1
如果您有 Microsoft 365 (Office 365),则可以使用以下公式来获得所需结果。我假设您希望在逗号两侧留有空格。
编辑——感谢 Máté Juhász 的建议。
=TEXTJOIN(" , ",TRUE,UNIQUE(D1:D7))
根据 OP 选择的代码的基于 VBA 的解决方案。
在 Excel 中按ATL+F11打开 VBA 编辑器。插入一个模块并添加以下两个用户定义函数 (UDF)。
Function UNIQUE1()
Application.Volatile
Dim D As Object, C As Variant, i As Long, lr As Long
Set D = CreateObject("Scripting.Dictionary")
lr = Cells(Rows.Count, 4).End(xlUp).Row
C = Range("D1:D" & lr)
For i = 1 To UBound(C, 1)
D(C(i, 1)) = 1
Next i
UNIQUE1 = Application.Transpose(D.keys)
End Function
Function TEXTJOIN1(delimiter As String, ignore_empty As Boolean, ParamArray cell_ar() As Variant)
Application.Volatile
For Each cellrng In cell_ar
For Each cell In cellrng
If ignore_empty = False Then
result = result & cell & delimiter
Else
If cell <> "" Then
result = result & cell & delimiter
End If
End If
Next cell
Next cellrng
TEXTJOIN1 = Left(result, Len(result) - Len(delimiter))
End Function
这将创建两个名为 UNIQUE1 和 TEXTJOIN1 的用户定义函数。保存并退出 VBA 编辑器。
现在在 H1 中输入以下公式。
=TEXTJOIN1(" , ", TRUE, unique1())
请注意以下事项
- 您的代码经过了轻微修改,并由此创建了一个 UDF。此外,它使用第 4 列作为 D 列,
lr = Cells(Rows.Count, 4).End(xlUp).Row
因为在我的示例中没有完整的表格。我只填充了 D 列 Application.Volatile
添加以使其在适用时自动计算- 需要 TEXTJOIN1 UDF,因为您的 Excel 版本没有内置此功能。
- 将工作簿另存为 .xlsm 宏已启用