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

时间:2018-07-01 11:44:03

标签: excel user-defined-functions excel-vba-mac custom-functions-excel

我刚开始编写excel自定义函数,并且遇到了一种奇怪的行为,在搜索网络时似乎无法找到解释(尽管信息量当然很大)。请忍受我。

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

#Export details to CSV
Get-ChildItem -Filter '*.jpg' -Recurse | Select FullName,CreationTime,LastWriteTime | Export-Csv -Path "~\Desktop\Images.csv" -NoTypeInformation

此函数查找具有非空白单元格的范围内的第一列(该范围内没有非空白单元格的结果为-1),并且只要范围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 与该表在同一张纸上,就可以进行良好的显示包含rng函数的公式。这是第1页,其中包含公式和范围:

Sheet 1 with formula

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

Sheet 2 (range still in Sheet 1)

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

Sheet 2 referencing formula cell in Sheet 1

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

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

1 个答案:

答案 0 :(得分: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,以捕获With ... End With块中的父工作表引用。

仅使用一个可能很容易rng.parent.Cells(currow, curcol).Value的引用,但是With ... End With块对于将调用扩展到rng工作表上的其他单元格更为彻底。