当我拖动自动填充手柄时,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 无法按预期工作的主要内容,如果未能解决你的问题,请参考以下文章

自动布局无法按预期工作

EditText 填充在 Android 中无法按预期工作

excel - 自动填充递增多个数字

空 UIView 上的自动布局约束无法按预期工作

UDF 中的 COLLATE 无法按预期工作

jQuery UI 的贪婪 droppable 无法按预期工作