【问题标题】:Using Wildcards in Index(Match) function在索引(匹配)函数中使用通配符
【发布时间】:2015-03-18 21:03:50
【问题描述】:

我在我的 vba 代码中使用了一个 Index(Match()) 函数,该函数似乎遇到了一些问题。因为某些搜索条件并不完全相同,所以我尝试在单元格C2 周围使用"*" 通配符运算符来搜索类似项目。此外,我不想简单地将我正在使用的公式放入带有Range("D2").Formula 代码的单元格中,这将导致自动更新,因此,我也遇到了这方面的问题。

这是我的代码。

Range("D2") = Index('Future_220_140_MON'!$B$20:$AK$24, Match(" * "&C2&" * "&T2, 'Future_220_140_MON'!$B$1:$AK$1&'Future_220_140_MON'!$A$20:$A$24, 0))

我只是错误地格式化了代码,还是在匹配多个条件时有一种特殊的方式来调用通配符。

【问题讨论】:

  • 您遇到什么错误?调试错误?结果无效?
  • 你有什么理由用空格来抵消你的通配符?如果你这样做应该可以Match("*"&C2&"*"&T2, ...
  • 您还将 VBA 函数与工作表函数混合在一起,这可能会解释您可能遇到的任何错误。
  • 我怀疑你需要使用 两个 MATCH 函数,如下所示: = =Index('Future_220_140_MON'!$B$20:$AK$24, Match("*"&C2&"*",'Future_220_140_MON'!$A$20:$A$24, 0),MATCH("*"&T2&"*",'Future_220_140_MON'!$B$1:$AK$1,0)) - 一个 MATCH 给出行,下一个 MATCH 给出列,然后 INDEX 返回路口的价值
  • 是的,在某些情况下您可能会使用串联(例如,两个不同列中的 2 个条件)但是当您必须匹配一行和一列时,您需要两个 MATCH 函数,按照显示的顺序

标签: vba excel excel-formula wildcard


【解决方案1】:

首先,您应该始终定义希望存储结果的内容。默认情况下,只写Range("D2")会使用单元格的.Value属性,但最好写Range("D2").Value。你的两个函数实际上都是Application.WorksheetFunctions。试试这个代码:

Dim MatchResult As Double
MatchResult = Application.WorksheetFunction.Match(Conditions)
Range("D2").Value = Application.WorksheetFunction.Index(Conditions, MatchResult)

WorksheetFunction.Index Method MSDN

WorksheetFunction.Match Method MSDN

【讨论】:

  • 我不完全确定为什么代码会输出语法错误,但我的工作表中的两行代码都有问题。 MatchResult = Application.WorksheetFunction.Match("*"&C2&"*"&T2, 'Future_220_140_MON'!$B$1:$AK$1&'Future_220_140_MON'!$A$20:$A$24, 0)Range("D2").Value = Application.WorksheetFunction.Index('Future_220_140_MON'!$B$20:$AK$24, MatchResult) 会导致错误。
  • 错误来自"*"&C2&"*"。它突出显示该部分并声明Expected: List separator or )
  • 对于AWF.IndexAWF.Match,您不能使用字符串代替范围,也不能像这样连接范围。您需要带有公式字符串的Evaluate。但是,无论如何,那个原始公式对我来说似乎是错误的。
  • @Rory 所以在使用通配符时连接搜索条件是可以理解的错误,但有没有办法以另一种方式搜索多个条件?
  • @ksmit144 您的数据是什么样的?乍一看,您似乎确实需要 INDEX(...,match(), match()) 语法 - 即在第一列中查找一个值并在顶行中查找一个值以从表中返回一个单元格。
【解决方案2】:

试试这个:

    Range("D2").Value = Application.Index(Sheets("Future_220_140_MON").Range("B20:AK24"), _
Application.Match(Range("T2").Value, Sheets("Future_220_140_MON").Range("A20:A24"),0), _
Application.Match("*" & Range("C2").Value & "*", Sheets("Future_220_140_MON").Range("B1:AK1"),0))

根据澄清,代码应该是这样的:

    Range("D2").Value = Application.Index(Sheets("Future_220_140_MON").Range("B20:AK24"), _
Application.Match(Range("T2").Value, Sheets("Future_220_140_MON").Range("A20:A24"),0), _
Application.Match(Mid$(Range("C2").Value, Instr(Range("C2").Value, "_") + 1), Sheets("Future_220_140_MON").Range("B1:AK1"),0))

进一步编辑:如果您想实际放置一个公式:

Range("D2").Formula = "=Index('Future_220_140_MON'!$B$20:$AK$24,Match(T2,'Future_220_140_MON'!$A$20:$A$24,0),Match(MID(C2,FIND(""_"",C2)+1,LEN(C2)),'Future_220_140_MON'!$B$1:$AK$1,0))

【讨论】:

  • 我试图与B1:AK1 匹配的C2 中的值不想承认相似之处。 C2 的值前面有一个数字,例如1_Unpack,我试图将其与B1:AK1 中的值匹配,即Unpack。因为它没有看到匹配,D1 中的单元格读取为#N/A
  • 您不能为此向 C2 添加通配符。它总是一个数字后跟下划线吗?
  • 是的,它始终是一个 1-35 的数字,后跟一个下划线。
  • 这个方程很好用,谢谢!但是,我尝试使用从D2D3150autofill 来实现它,它似乎不想将C2 移动到C3T2T3 等。
猜你喜欢
  • 2019-11-01
  • 2018-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-10
  • 2020-07-05
相关资源
最近更新 更多