【发布时间】:2023-03-09 04:00:01
【问题描述】:
我创建了我的第一个 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 中使用它。
标签: excel user-defined-functions autofill vba