添加宏的PrevSheet函数返回#NAME错误

时间:2019-05-21 23:29:48

标签: excel vba

我向文件中添加了一个简单的Previous Sheet宏,它可以正常工作,直到它开始返回#NAME错误,而我不知道为什么。

我打算将其与在工作簿中保持一致的命名单个单元格范围一起使用,在命名范围之前我已经成功使用了它,并且认为它不会对功能产生任何影响。命名范围后,尽管它不再起作用,即使对于常规的非命名范围也是如此。

我已经通过创建一个新工作簿,填写一些工作表并对其进行测试来进行测试,但仍然返回#NAME错误。当我评估功能时,错误会在第一步出现:识别功能。但是,当我在公式栏中键入内容时,程序会正常为我提供公式。

我还尝试通过其单元格引用命名的单元格,甚至在该单元格之前添加工作表名称(例如“ prevsheet(previoussheetname!a1)prevsheet(thissheetname!a1))。我什至在最后一个沟中努力,尝试在单元格名称之前添加双引号。

为了全面公开,我还有另一个宏子例程,该例程使用对上一页和下一页的引用,但是由于它无法识别函数本身(应该是一个早期的信号),因此它使用了相对引用(即{{ 1}},activesheet(index - 1)。当时我并不认为它会弄乱功能,但是随着我变得越来越绝望和困惑,这也许是可能的。

我使用的activesheet(index + 1)代码:

PrevSheet()

现在,正如克里斯·尼尔森(Chris Neilsen)所建议的那样

函数PrevSheet(RCell作为范围)为变体

Function PrevSheet(RCell As Range)

    Dim xIndex As Long

    Application.Volatile

    xIndex = RCell.Worksheet.Index

    If xIndex > 1 Then _
        PrevSheet = Worksheets(xIndex - 1).Range(RCell.Address)

End Function

结束功能

如克里斯·尼尔森(Chris Neilsen)所建议,我已将命名范围编辑为如下所示:

Application.Volatile PrevSheet = RCell.Worksheet.Previous.Range(RCell.Address).Value ,其范围设置为!(nothing)$column$row

name manager

命名范围在范围浏览器中不可用。 range browser

仅命名单元格B1。它被称为“名称” sheet1

PrevSheet()不适用于任何一个范围。 sheet2

启用了宏

macros are enabled

任何对vba,宏和excel有更好理解的人都可以告诉我为什么会发生这种情况,以及如何解决它,以便它在键入该函数的工作表的左侧返回第一张工作表中指定单元格的值。 ? (即在sheet4中,Workbook将返回sheet3中单元格A1的值)

我希望我的问题现在更清楚!

2 个答案:

答案 0 :(得分:0)

如果您的代码位于标准模块中,则它可以正常工作:

Public Function PrevSheet(RCell As Range) As Variant
    Dim xIndex As Long
    Application.Volatile

    xIndex = RCell.Worksheet.Index
    MsgBox xIndex
    If xIndex > 1 Then
        PrevSheet = Worksheets(xIndex - 1).Range(RCell.Address)
    End If
End Function

enter image description here

例如,在工作表中:

enter image description here

我为单元格 A7 分配了名称​​ junk ,而666是前一张工作表单元格 A7 中的值。

答案 1 :(得分:0)

如果正确定义了命名范围,这将起作用。可以通过多种方法来完成此操作,但这是IMO最简单的方法。

由于您说过 ...将其与在工作簿中一致的命名单个单元格范围一起使用。您可以创建单个命名范围,即Workbook范围,它将引用一个或多个单元格)上的引用名称。

假设您要引用单元格A1。在名称管理器中,创建一个名称,例如说YourNamedRange工作簿范围,参考=!$A$1(请注意!没有工作表参考)。

将公式添加到工作表(例如=YourNamedRange)时,它将引用包含该公式的工作表上的单元格A1

将其应用于UDF,只需使用=PrevSheet(YourNamedRange)

enter image description here

您的UDF(通常)按原样工作,但是如果其他工作簿处于活动状态,则它将失败。要解决此问题,请使用

Function PrevSheet(RCell As Range)
    Dim xIndex As Long
    Application.Volatile
    xIndex = RCell.Worksheet.Index
    If xIndex > 1 Then
        With RCell.Worksheet.Parent 'The workbook containing RCell
            PrevSheet = .Worksheets(xIndex - 1).Range(RCell.Address)
        End With
    End If
End Function

还有一个名为Worksheet的{​​{1}}属性,其功能大致相同,因此您可以将其重构为

Previous