当我拖动自动填充手柄时,UDF 无法按预期工作
Posted
技术标签:
【中文标题】当我拖动自动填充手柄时,UDF 无法按预期工作【英文标题】:UDF does not work as expected when I drag the Autofill handle 【发布时间】:2018-02-26 23:52:32 【问题描述】:我创建了我的第一个 UDF。它将引用其左侧单元格中的 IP 地址,然后使用 Vlookup 查找该 IP 地址的主机名。它看起来像这样:
MapIPtoHost = Application.WorksheetFunction.VLookup(ActiveCell.Offset(0, -1).Value, Range("D2:E3"), 2, False)
为了测试这个UDF,D2:E3中的表数组只有2行,像这样...
1.2.3.4 1234.somewhere.com
5.6.7.8 5678.elsewhere.com
...同一个工作表的 A1 到 A6 单元格具有以下 IP 地址:
1.2.3.4
5.6.7.8
1.2.3.4
5.6.7.8
1.2.3.4
5.6.7.8
很简单,对吧?
如果我在单元格 B1 中输入公式“=MapIPtoHost()”,我会得到“1234.somewhere.com”,正如预期的那样。
1.2.3.4 1234.somewhere.com
同样,如果我在单元格 B2 中输入公式,我会得到“5678.elsewhere.com”。
5.6.7.8 5678.elsewhere.com
所以,它有效。耶,团队!
但是 - 奇怪的事情来了......
如果我没有在每个 B 单元格中单独输入“=MapIPtoHost()”,而是将其仅放在 B1 中,然后将填充手柄向下拖动到 B6,则它的行为与上述不同.现在每个 B 细胞都有相同的主机名,像这样......
1.2.3.4 1234.somewhere.com
5.6.7.8 1234.somewhere.com
1.2.3.4 1234.somewhere.com
5.6.7.8 1234.somewhere.com
1.2.3.4 1234.somewhere.com
5.6.7.8 1234.somewhere.com
我猜这是 UDF 的一个怪癖(功能?)?有人可以帮助这个新手了解为什么 UDF 和 AutoFill 似乎不能相处吗?
【问题讨论】:
你需要重写你的UDF。传递一个范围参数进行处理,不要使用 ActiveCell 或其他方式来检测要处理的单元格。 UDF 重新计算是否正确?您可能需要确保以Application.Volatile
开头。此外,如果它只是一个VLOOKUP
,那么为什么不使用VLOOKUP
? (如有必要,在命名范围内)
哇 - 快速响应。谢谢!
@Chris,我猜,当我向下拖动列时,我的活动单元格没有改变,所以我总是引用完全相同的单元格?
@freenyman99 ActiveCell
指的是活动工作表上选择的任何单元格。您应该永远在 UDF 中使用它。
【参考方案1】:
根据 Chris 的建议,我修改了我的 UDF,并解决了问题。正如 Chris 建议的那样,我的 UDF 应该传递一个范围参数,所以这就是它现在的样子......
Function MapIPtoHost(IPAddr) As String
MapIPtoHost = Application.WorksheetFunction.VLookup(IPAddr, Range("D2:E3"), 2, False)
End Function
然后,为了测试它,我在单元格 B1 中输入了以下内容:
= MapIPtoHost(A1)
这行得通。但是,更重要的是,现在当我向下拖动填充柄时,B 列中的每个单元格都已正确填充。
再次感谢快速准确的响应。
feenyman99
【讨论】:
您应该也为查找表传递一个范围。如果您不这样做,编辑查找表中的值将不会导致您的公式更新。并将输入键入为Range
。类似Function MapIPtoHost(IPAddr As Range, Table As Range) As Variant
以上是关于当我拖动自动填充手柄时,UDF 无法按预期工作的主要内容,如果未能解决你的问题,请参考以下文章