Excel 从跨越多列的名称范围编译不同值的列表

Excel 从跨越多列的名称范围编译不同值的列表,excel,vba,formula,Excel,Vba,Formula,我正在尝试将命名范围“WESupplierALL”中的不同值列表编译成一列。 我尝试过独特的高级过滤功能,但我似乎可以破解它。 有什么想法吗?我对所有选项都持开放态度,包括VBA、公式等。如评论(链接)中建议的,您可以使用TEXTJOIN和FILTERXML的组合,但公式很长,会影响可读性。电源查询是另一种选择 多年来,我使用自己的VBA函数来统一价值观。您可以使用my repository:中的DM_ARRAY函数。有一个演示工作簿可用,您可以找到每个用户定义函数(UDF)的专用工作表。对于D

我正在尝试将命名范围“WESupplierALL”中的不同值列表编译成一列。 我尝试过独特的高级过滤功能,但我似乎可以破解它。
有什么想法吗?我对所有选项都持开放态度,包括VBA、公式等。

如评论(链接)中建议的,您可以使用
TEXTJOIN
FILTERXML
的组合,但公式很长,会影响可读性。电源查询是另一种选择

多年来,我使用自己的VBA函数来统一价值观。您可以使用my repository:中的
DM_ARRAY
函数。有一个演示工作簿可用,您可以找到每个用户定义函数(UDF)的专用工作表。对于
DM_ARRAY
,第一个参数是要作为输出的列数,然后可以根据需要传递任意多个范围。在您的情况下,您可以使用
=UNIQUE(DM_数组(1,E2:E23,I2:I23,M2:M23))
实现所需的结果。当然,您可以传递一个命名范围,例如
=UNIQUE(DM_数组(1,WESupplierALL))

此外,如果您希望在没有高级数组公式的其他计算机上获得相同的结果,那么同一个库具有一个
DM_UNIQUE
函数,您可以使用该函数。

将唯一值从多列写入一列
  • 调整(使用)常量部分和工作簿中的值
选项显式
副编剧()
Const wsName As String=“Sheet1”
Const ColsList As String=“E,I,M”
长度=2时的常数
长度=23时的常数lRow
Const dFirst As String=“A2”
将wb设置为工作簿:设置wb=ThisWorkbook包含此代码的工作簿
Dim Cols()作为字符串:Cols=Split(ColsList,,“”)
尺寸rCount等于长度:rCount=lRow-fRow+1
将ws设置为工作表:设置ws=wb.Worksheets(wsName)
Dim dict As Object:Set dict=CreateObject(“Scripting.Dictionary”)
dict.CompareMode=vbTextCompare'忽略大小写
调暗crg As范围
作为变量的Dim数据
变暗键作为变量
变暗r等于长,n等于长
对于n=0至UBound(Cols)
设置crg=ws.Columns(Cols(n)).Resize(rCount).Offset(fRow-1)
数据=crg.值
对于r=1,则为rCount
键=数据(r,1)
如果不是IsError(键),则“忽略错误值”
如果Len(Key)>0,则“忽略空白”
dict(Key)=空
如果结束
如果结束
下一个r
下一个
如果dict.Count=0,则退出Sub
重拨数据(1对指令计数,1对1)
r=0
对于dict.Keys中的每个键
r=r+1
数据(r,1)=键
下一键
带ws.Range(dFirst)
.调整大小(r).值=数据
.Resize(.Worksheet.Rows.Count-.Row-r+1).Offset(r).ClearContents
以
端接头

在stackoverflow中查看这篇文章。这回答了你的问题吗VBA中的可用于存储唯一键(值),这对于在数据集中查找重复数据的1个实例非常有用。您是否只想从上面的图片中列出唯一值,
A2:M10