Excel VBA - 在匹配查找数组中引用ActiveCell.Formula中的命名范围

时间:2014-09-15 01:48:54

标签: arrays excel vba excel-vba

我正在尝试在活动单元格公式中引用匹配函数的查找数组部分中的命名范围。它需要是一个命名范围(据我所知),因为我稍后将在多个选项卡上运行代码,并且在每个选项卡上包含数据以在AJ2列中形成查找数组的单元格数量将有所不同如果在包含空单元格的列上运行它,则大小和匹配函数不起作用。这是我目前的代码,我得到了“对象范围的方法公式失败”错误。它肯定是导致它的匹配位,因为当我进入单元格并手动更改以直接引用数组中的单元格时,它工作正常,但我不能这样做,因为它需要在将来保护以运行多个选项卡并且每个查找数组的长度都会发生变化:

Sheets("1").Select
Dim rangeh As Range
Set rangeh = Range("AJ2")
Set rangeh = Range(rangeh, rangeh.End(xlDown))

Sheets("1").Select
Range("R2").Select
ActiveCell.Formula = "=VLOOKUP(INDIRECT(""AJ""&(MATCH(Q2, & rangeh & ,-1)+1)),AI:AK,3,FALSE)"

它也必须是一个ActiveCell.Formula,因为根据相邻列Q中的数据长度,R2本身将被拖放到每个选项卡上的不同位置。

任何帮助表示赞赏。谢谢!

1 个答案:

答案 0 :(得分:0)

在MATCH()中用作[match_type]参数的-1关系到我,因为它不应该用于非排序数据,但是你已经提到过可能有空白单元格。具体来说,使用-1作为[match_type]假设数据按降序排序。需要对AJ列中数据的确切性质做一点澄清。

我还认为你在构造VLOOKUP()时使用INDIRECT()可以更好地在VBA中使用字符串连接。我猜到了一些观点,但这就是我想出来的。

Dim rangeh As Range, rngQ As Range, w As Long, vWSs As Variant
vWSs = Array("1","2")
For w = LBound(vWSs) To UBound(vWSs)
    With Sheets(vWSs(w))
        Set rngQ = .Cells(2, 17).Resize(.Cells(Rows.Count, 17).End(xlUp).Row - 1, 1)
        Set rangeh = .Range(.Range("AJ2"), .Range("AJ2").End(xlDown))
        .Cells(2, 18).Formula = _
          "=VLOOKUP(INDIRECT(""AJ""&(MATCH(Q2," & rangeh.Address & ",-1)+1)),AI:AK,3,FALSE)"
        .Cells(2, 18).Resize(rngQ.Rows.Count, 1).FillDown
    End With
Next w
Set rangeh = Nothing
Set rngQ = Nothing
实际上,实际上应该有一个名为1的工作表。如果1是工作表索引编号,则不应该在引号中。

我已经更正了一些代码,在MATCH()中添加了。range到rangeh,以及一个通过名为1和2的工作表的循环。您应该能够将工作表名称添加到数组(...)中增加循环。