【问题标题】:Reverse Lookup 2D array in VBA to get Column name from list of data [closed]VBA中的反向查找二维数组以从数据列表中获取列名[关闭]
【发布时间】:2022-01-03 01:09:50
【问题描述】:

我是 VBA 编程的新手,正在努力解决我遇到的这个问题。

我在使用 Excel VBA 处理大量 2D 矩阵数据时需要帮助,如何根据另一张工作表中的一组特定查找值从数据表中获取列名称,使用 VBA 代码进行反向查找?

查找值可以重复,但我们希望在列中第一个出现的位置捕获其列名,请参见下面的示例。

之所以使用VBA,是因为数据量大,excel是唯一合适的工具。

有什么想法吗?

Lookup Value Col Name
A101 L2
A102 L3
A201 L2
A304 L5

二维表

ref L1 L2 L3 L4 L5
Cx1 A100 A101 A102 A102 A102
Cx2 A100 A101 A102 A103 A104
Cx3 A111 A111 A113 A114 A114
Cx4 A200 A201 A201 A201 A201
Cx5 A300 A301 A302 A303 A304

【问题讨论】:

  • 编辑您的问题以显示您尝试过的代码?还要澄清它首先出现的位置是什么意思。第一排?第一栏?为什么选择 VBA?为什么不是工作表函数?

标签: excel vba loops multidimensional-array reverse-lookup


【解决方案1】:

不需要 VBA。如果您要查找出现 Lookup Value 的第一列,您可以使用:

=INDEX(Table1[#Headers],AGGREGATE(15,6,1/(J2=Table1)*COLUMN(Table1)-INDEX(COLUMN(Table1)-1,1),1))

请注意,我使用了表格,但如果您愿意,也可以使用常规寻址。

算法

  • 根据等式创建{TRUE,FALSE} 的二维数组
  • 1/theArray => {1,#DIV/0!} 的数组
  • 乘以列号;然后减去表的第一列(减 1)以创建一个适合索引到表中的数字
  • 使用带有 SMALL 参数的 AGGREGATE 函数和忽略错误的选项,以返回查找值的最小索引列参数
  • 使用INDEX#Headers 数组中返回适当的值

如果你必须使用VBA,你可以创建一个用户定义函数:

Option Explicit
Function Header(lookup_value, table As Range) As String
    Dim c As Range
    Set c = table.Find(what:=lookup_value, LookIn:=xlFormulas, lookat:=xlWhole, searchorder:=xlByColumns, searchdirection:=xlNext)
    If Not c Is Nothing Then Header = table(1, c.Column - table.Column + 1)
End Function

【讨论】:

  • 道歉罗恩,我是 VBA 编程的新手,发现这个问题我真的很难,我在尝试使用大量数据进行循环等时经常出错。我最终放弃了。我遇到的公式问题是它不断使文件崩溃,该文件有多达 100 万行和 50 列。我可以把上面的建议变成一个子程序吗?所以这一切都在一个单独的工作表中更新?
  • @Rio05UK 是的,你可以把它变成一个子程序。由于该问题已关闭,因此您需要将您的努力作为一个新问题发布。或者,有了这么多数据,您应该检查 Power Query 是否更有效。
猜你喜欢
  • 2022-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多