【问题标题】:How to set up an Array formula using Index/match in VBA to get first match cell如何在 VBA 中使用索引/匹配设置数组公式以获取第一个匹配单元格
【发布时间】:2019-03-20 12:58:38
【问题描述】:

我正在尝试在 for 循环中设置数组公式,以将字符串与另一个名为 Project Name 的工作表上的名称列表进行部分匹配。这应该是end product 我使用exceljet 中的方法在电子表格中得到了公式,但是当我尝试将其转换为VBA 时遇到了“需要对象”的错误。 cells(i,6) 是我试图与项目名称进行部分匹配的字符串的位置。该列不必是“6”,它是请帮助的地方。谢谢!

Sub Shortname()

Dim SRng As Variant
Dim SName As Integer
Dim SNrow As Integer
Dim PLcol As Integer
Dim PLrow As Integer

     Worksheets(3).Activate

     SNrow = Cells(Rows.Count, 1).End(xlUp).Row

     SRng = Range(Cells(2, 1), Cells(SNrow, 1)).Value

     Worksheets(2).Activate

     PLcol = Cells(1, Columns.Count).End(xlToLeft).Column + 1
     PLrow = Cells(Rows.Count, 1).End(xlUp).Row

     For i = 2 To PLrow

         Cells(i, PLcol).Value = Application.WorksheetFunction.Index(SRng, Application.WorksheetFunction.Match("TRUE", Application.WorksheetFunction.IsNumber(Application.WorksheetFunction.Search(SRng.Value, Cells(i, 6))), 0), 1)

     Next i

End Sub

【问题讨论】:

标签: vba indexing match array-formulas


【解决方案1】:

神秘变量(SRng)

我会写这样的代码(不是解决方案只是一个更易读的版本):

Sub Shortname()
    Dim SRng As Variant
    Dim SName As Integer
    Dim SNrow As Integer
    Dim PLcol As Integer
    Dim PLrow As Integer
    'Missing Declaration
    Dim i As Long
    'To avoid jumping around worksheets do NOT use Activate or Select
    With Worksheets(3)
        SNrow = .Cells(Rows.Count, 1).End(xlUp).Row
        SRng = .Range(Cells(2, 1), Cells(SNrow, 1)).Value
    End With
    With Worksheets(2)
        PLcol = .Cells(1, Columns.Count).End(xlToLeft).Column + 1
        PLrow = .Cells(Rows.Count, 1).End(xlUp).Row
    End With
    With Application.WorksheetFunction
        For i = 2 To PLrow
            'Run-time error 424: Object required
            Worksheets(2).Cells(i, PLcol).Value = .Index(SRng, .Match("TRUE", _
                .IsNumber(.Search(SRng.Value, Cells(i, 6))), 0), 1)
        Next i
    End With
End Sub

错误(神秘)在于 SRng 变量。为什么它被声明为变体? 如果是字符串,则将其声明为字符串并将SRng = .Range(Cells(2, 1), Cells(SNrow, 1)).Value 行更改为

SRng = .Range(Cells(2, 1), Cells(SNrow, 1)).Address

如果是 Range 对象,则将其声明为 Range 并删除 .Value, 但是您仍然会在 For Next 循环中收到错误,因为您在语句的 Search 部分中使用了SRng.Value,但是范围没有价值(也许您想要使用类似SRng.Cells(i, 6).Value)。

如果这不能帮助您提供更多信息(例如工作表示例)以查看单元格、范围内的内容......并解释您在 For Next 循环中搜索的内容。

【讨论】:

  • 首先,感谢您的清理。我以前的方式确实很混乱。我想要的是这个,我有一个多个变体名称的列表,我需要通过进行部分匹配来按更通用的项目名称对它们进行分类。例如,如果我有名为“ash14”、“ash15”和“ash16”的变体,我希望能够将它们全部归类为项目“ash”。所以在工作表中,我使用了数组公式 {=INDEX('Project Name'!A2:A72,MATCH(TRUE,ISNUMBER(SEARCH('Project Name'!A2:A72,'Variant'!B2)),0) )} 但我希望它在 VBA 中执行,并使用循环对所有行执行此操作。
  • 我认为数组公式在 VBA 中不起作用,因此必须将其“翻译”为 VBA。我一直在研究解决方案,但得出的结论是它太复杂了,如果您不提供表格“项目名称”上的 A 列和表格“变体”上的 B 列中的数据样本,我就无法完成它Cells(i, 6) 的解释。您应该将其粘贴在初始问题的末尾。
  • 我更新了原来的问题。希望它能为您澄清我的问题。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-15
相关资源
最近更新 更多