32位Excel 2013 / Win 7 64位
UDF要求用户提供来自同一个表的两个范围输入和一个查找值,即:
Public Function FindBfromA(A as Range,B as Range, IDValue as Integer)
For IDCheck = 1 to A.Count
IF A(IDCheck) = IDValue then
IDNum = IDCheck
Exit For
End if
Next IDCheck
FindBfromA = B(IDNum)
End Function
将公式添加到表的另一列中,例如
=FindBfromA([A],[B],[@C])
'Where C is calculated via something
我的问题是Ranges A& B变得脱节。 A(IDCheck)
和B(IDCheck)
应属于同一表格行中相应列的位置,根据计算开始时光标所在的位置,范围[B]将重新键入
这会导致公式从FindBfromA=B(IDNum)
返回错误的值作为A(IDNum){Row}<> B(IDNUM){行}
我无法在我使用虚假数据创建的工作簿中重现错误 - 在我的公司(私人)工作簿中,该功能基本上以相同的方式运行,但捕获了两个' B'值给出两个ID并将它们传递给另一个函数。
答案 0 :(得分:0)
如果没有看到范围选择,很难确定,但代码中不可靠的元素是单元格引用。通过使用单个整数索引,您基本上选择范围中的 nth 单元格而不是行 n 上的单元格。我怀疑范围B是从范围A偏移了多少行。让我们说你的两个选择是A =" A1:A10"和B =" B2:B11"然后A(3),例如,第3行,但B(3)将在第4行。如果范围A有多个列,则同样适用。
要消除该风险,请按行索引和列索引引用范围,如下面的代码所示。您还要注意我还将IDValue的数据类型更改为变体,因为这可以防止IDValue中出现错误,例如String
或Long
。我还在每个单元格中使用For Each
循环遍历范围A,以满足范围A具有多个列的情况。
Public Function FindBfromA(A As Range, B As Range, IDValue As Variant) As Variant
Dim cell As Range
For Each cell In A.Cells
If cell.Value2 = IDValue Then
FindBfromA = B.Cells(cell.Row, 1).Value2
Exit Function
End If
Next
End Function