Excel 自定义功能不适用于工作表

Posted

技术标签:

【中文标题】Excel 自定义功能不适用于工作表【英文标题】:Excel custom function does not work across sheets 【发布时间】:2018-07-01 11:44:02 【问题描述】:

我对编写 excel 自定义函数还是很陌生,我遇到了一个奇怪的行为,我在网上搜索时似乎找不到解释(尽管信息量当然很大)。请多多包涵。

这是一个演示,它至少显示了一些问题:

Function mycustomfn_demo(rng As Range)

 Dim rngrows, rngcols, curcol, currow, i, j,firstcol As Integer
 Dim exitflag As Boolean

 firstcol = -1

 rngrows = rng.Rows.Count
 rngcols = rng.Columns.Count
 exitflag = False

 For i = 1 To rngcols

 For j = 1 To rngrows

   curcol = rng.Column + i - 1
   currow = rng.Row + j - 1

   If Cells(currow, curcol).Value <> "" Then
    firstcol = i
    exitflag = True
    Exit For
   End If

 Next j

 If exitflag = True Then
  Exit For
 End If

 Next i

 mycustomfn_demo = firstcol


End Function

此函数查找具有非空白单元格的范围中的第一列(范围中没有非空白单元格的结果为 -1)并且只要范围 rng 与包含mycustomfn_demo 函数。这是包含公式和范围的工作表 1:

但是,如果它们在不同的工作表上,就会发生奇怪的事情这显示工作表 2(范围仍在工作表 1 中):

在这种情况下(但不是在其他情况下)引用工作表 1 中的公式单元格会给出正确的结果(同样,工作表 2):

这是预期的行为,还是错误的结果?我在 OSX High Sierra 10.13.5 下使用 Office 2016 for Mac,Excel 版本为 15.23。

我应该补充一点,在更复杂的情况下,引用另一个工作表中的自定义公式结果会删除公式单元格本身的结果。然后可以通过删除该单元格然后选择撤消来恢复它。

【问题讨论】:

【参考方案1】:

问题出在下面,

If Cells(currow, curcol).Value <> "" Then

单元格没有父工作表引用,因此尽管您从 Sheet1 上的单元格引用传递行号和列号,但它只是使用这些数字在活动工作表上查找单元格。

添加对 rng 父工作表的引用。

with rng.parent

 For i = 1 To rngcols

 For j = 1 To rngrows

   curcol = rng.Column + i - 1
   currow = rng.Row + j - 1

   If .Cells(currow, curcol).Value <> "" Then
    firstcol = i
    exitflag = True
    Exit For
   End If

 Next j

 If exitflag = True Then
  Exit For
 End If

 Next i

end with

请注意,Cells 变为 .Cells 以在 With ... End With 块中捕获父工作表引用。

只需一个引用即可轻松成为 rng.parent.Cells(currow, curcol).Value,但 With ... End With 块更彻底地扩展了对 rng 工作表上其他单元格的调用。

【讨论】:

非常感谢您的及时回复。我认为这与 Cells() 语句有关,但我找不到补救措施。我想我得上一门课了:)

以上是关于Excel 自定义功能不适用于工作表的主要内容,如果未能解决你的问题,请参考以下文章

powershell Show-Command用于自定义功能

在 Robo3T 中,如何添加自定义功能

在 Robo3T 中,如何添加自定义功能

扩展XAF模型信息实现自定义功能

脚本编辑器中的功能可以正常工作,但不能来自工作表自定义功能

每个系列的 Pandas groupby 自定义功能