范围ID因单元格选择而发生变化

时间:2015-11-17 12:36:17

标签: excel vba excel-vba range user-defined-functions

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){行}

enter image description here

我无法在我使用虚假数据创建的工作簿中重现错误 - 在我的公司(私人)工作簿中,该功能基本上以相同的方式运行,但捕获了两个' B'值给出两个ID并将它们传递给另一个函数。

1 个答案:

答案 0 :(得分:0)

如果没有看到范围选择,很难确定,但代码中不可靠的元素是单元格引用。通过使用单个整数索引,您基本上选择范围中的 nth 单元格而不是行 n 上的单元格。我怀疑范围B是从范围A偏移了多少行。让我们说你的两个选择是A =" A1:A10"和B =" B2:B11"然后A(3),例如,第3行,但B(3)将在第4行。如果范围A有多个列,则同样适用。

要消除该风险,请按行索引和列索引引用范围,如下面的代码所示。您还要注意我还将IDValue的数据类型更改为变体,因为这可以防止IDValue中出现错误,例如StringLong。我还在每个单元格中使用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