Excel 拖动自动填充控制柄时,UDF无法按预期工作

Excel 拖动自动填充控制柄时,UDF无法按预期工作,excel,user-defined-functions,autofill,vba,Excel,User Defined Functions,Autofill,Vba,我已经创建了我的第一个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

我已经创建了我的第一个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
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
…同一工作表的单元格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.healthe.com”

所以,它起作用了。太棒了

但是,奇怪的是

如果我不在每个B单元格中单独输入“=MapIPtoHost()”,而是将其仅放在B1中,然后将填充句柄向下拖动到B6,则它的行为与上述不同。现在每个B单元都有相同的主机名,如下所示

1.2.3.4    1234.somewhere.com
5.6.7.8    5678.elsewhere.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
1.2.3.4    1234.somewhere.com
5.6.7.8    1234.somewhere.com

我猜这是UDF的一个怪癖(特征?)??有人能帮助这个新手理解为什么UDF和AutoFill看起来不合拍吗?

根据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列中的每个单元格都被正确填充

再次使用Thanx,以获得快速、准确的回答


feenyman99

您需要重写您的自定义项。传递一个要处理的范围参数,不要使用ActiveCell或其他方法来检测要处理的单元格。UDF是否正确地重新计算?您可能需要确保以
Application.Volatile
启动它。另外,如果它只是一个
VLOOKUP
,那么为什么不使用
VLOOKUP
?(必要时在指定范围内)哇-快速响应。谢谢@克里斯,我猜,当我向下拖动列时,我的活动单元格没有改变,所以我总是引用完全相同的单元格?@freenyman99
ActiveCell
指的是活动工作表上选中的任何单元格。您不应该在UDF中使用它。您还应该为查找表传入一个范围。否则,编辑查找表中的值不会导致公式更新。并将输入输入输入为
范围
。类似于函数MapIPtoHost(IPAddr作为范围,表作为范围)的变量