在Excel中创build自定义查找函数时遇到问题。 发布匹配和级联范围

我在使用我的大型电子表格时遇到了一些麻烦。 我将大量原始数据引入数据表中,然后在数据中进行一些查找。 使用内置的函数,我想出了

=IF(ISNA(INDEX(Data!$L$7:$L$1100,MATCH(Data!$I$2&$B$199&$B29&Data!$J$5,Data!$K$7:$K$1100&Data!$J$7:$J$1100&Data!$I$7:$I$1100&Data!$N$7:$N$1100,0))),"0",INDEX(Data!$L$7:$L$1100,MATCH(Data!$I$2&$B$199&$B29&Data!$J$5,Data!$K$7:$K$1100&Data!$J$7:$J$1100&Data!$I$7:$I$1100&Data!$N$7:$N$1100,0))) 

不漂亮! 基本上,它执行相同的查找两次取4个variables,并将它们与4个连接的数组进行匹配,然后将该点用作我想要的值的索引。

我有8个这种(略有不同),每行4张,每张96行。 编辑它们是一个痛苦!

由于本月数据量增长巨大,外频(x1100)已经超过(吸取的教训,大的是永远不够的)。 不幸的是,函数的局限性不会让我使用L:L或者其他任何有用的东西。

我已经尝试将代码重写为用户定义的函数,在那里我可以提供4个variables,并得到答案,但是在组合数组时却不幸失败。

我已经给出了原来的函数名称上面列出的范围,使事情变得更容易(并扩大了他们使用更广泛的范围值),所以我可以重写所有的函数只使用命名的范围,但这仍然留下我的卡住如果我需要更改代码。

以下是我到目前为止:

  Function Windows_Util(itma As String, env As String) v = "Windows Server" & env & itma & "" r = Concat(Range("Utilchassis")) r = r & Concat(Range("Utilenv")) r = r & Concat(Range("UtilITMA")) r = r & Concat(Range("UtilOS")) m = WorksheetFunction.Match(v, r, 0) i = WorksheetFunction.Index(Range("Utilavg"), m) If WorksheetFunction.IsNA(i) Then Windows_Util = 0 Else Windows_Util = i End If End Function Function Concat(myRange As Range, Optional myDelimiter As String) Dim r As Range Application.Volatile For Each r In myRange If Len(r.Text) Then Concat = Concat & IIf(Concat <> "", myDelimiter, "") & r.Text End If Next End Function 

这不行! 它不仅错误地连接(每个范围单独连接,而不是逐行连接),它不喜欢其中一个查询中的某种types。 (debugging这些东西并不容易,因为函数实际上完成了(它没有任何语法错误),所以没有内build的步骤可以使用。

任何帮助不胜感激。

希望我已经提供了足够的细节来理解我想要做的事情。

干杯,

史蒂夫

怎么样:

 r = Range("Utilchassis,Utilenv,UtilITMA,UtilOS") 

这看起来和你的Concatfunction一样

我不确定你想如何将Ranges合并,但我想你应该看看Application.Union(Range,Range,…)方法 。

在文章的例子中:

 Set bigRange = Application.Union(Range("Range1"), Range("Range2")) 

另请参阅Tushar Mehta的“Excel每日剂量”中的文章 ,他描述了可以更好地处理“Nothing”(空)input的以下自定义联合(范围,范围)方法:

 Function Union(Rng1 As Range, Rng2 As Range) As Range If Rng1 Is Nothing Then Set Union = Rng2 ElseIf Rng2 Is Nothing Then Set Union = Rng1 Else Set Union = Application.Union(Rng1, Rng2) End If End Function 

如果您要使用范围地址的string连接,那么您必须添加逗号,就像Barrowc在其post中显示的那样。 例如, Range("MyRange1, MyRange2")会将名为“MyRange1”和“MyRange2”的两个范围结合起来,而不带逗号的空格分隔符Range("MyRange1 MyRange2")例如Range("MyRange1 MyRange2")会返回这些INTERSECTION(重叠)两个范围。

但是,我build议避免string地址串联,并使用Application.Union(Range, Range)方法。

希望这可以帮助…

当有多个条件匹配时,MATCH函数在VBA中使用会非常棘手。 在工作表中完成了什么 – 在不同的单元格中,使用&运算符匹配相同数量的连接范围的条件,在VBA中是无法实现的,因为VBA“&”运算符只将string作为参数,因为在VBA中连接范围的其他方式,Union函数和通过多个地址参数分配给Range的分配,似乎不会产生可与VBA Match函数配合使用的数组。

但是,可以通过构造MATCH和数组比较的工作表公式来实现相同的效果,然后使用VBA评估函数执行公式。 查看我对这个问题的答案,了解这个方法的工作细节。

下面的代码实质上重新实现了由Steve提供的原始工作表公式,而不依赖于工作表中以前命名的范围或代码中指定的条件值(而不是工作表中的特定单元格)。 它被写为子,但可以很容易地转换为用户定义的函数。

  Sub x4match() Dim adr1 As String, adr2 As String, adr3 As String, adr4 As String Dim Rng1 As Range, Rng2 As Range, Rng3 As Range, Rng4 As Range Dim name1 As String, name2 As String, name3 As String, name4 As String Dim idx As Variant Dim resultRng As Range Dim result As Variant With ThisWorkbook.Worksheets("Data") adr1 = "I2" adr2 = "B199" adr3 = "B29" adr4 = "J5" Set Rng1 = .Range("K7:K1100") Set Rng2 = .Range("J7:J1100") Set Rng3 = .Range("I7:I1100") Set Rng4 = .Range("N7:N1100") Set resultRng = .Range("L7:L1100") .Names.Add Name:="name1", RefersTo:=Rng1 .Names.Add Name:="name2", RefersTo:=Rng2 .Names.Add Name:="name3", RefersTo:=Rng3 .Names.Add Name:="name4", RefersTo:=Rng4 idx = Evaluate("IFERROR( MATCH(1, --(" & adr1 & "=name1) * --(" & _ adr2 & "=name2) * --(" & adr3 & "=name3) * --(" & _ adr4 & "=name4), 0), 0)") If idx <> 0 Then result = .Cells(resultRng.Row + idx - 1, resultRng.Column).Value End If .Names("name1").Delete .Names("name2").Delete .Names("name3").Delete .Names("name4").Delete End With End Sub