【问题标题】:Macro added PrevSheet function returns #NAME error宏添加 PrevSheet 函数返回 #NAME 错误
【发布时间】:2019-05-22 22:22:51
【问题描述】:

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

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

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

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

为了全面披露,我还有另一个宏子例程,它使用对上一张和下一张表的引用,但由于它无法识别函数本身(这应该是一个早期标志),它利用了相对引用(即 @987654334 @,activesheet(index + 1))。当时我并不认为它会破坏功能,但随着我越来越绝望和困惑,也许这是一种可能性。

我使用的PrevSheet() 代码:

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 所建议的那样

Function PrevSheet(RCell As Range) As Variant

Application.Volatile

PrevSheet = RCell.Worksheet.Previous.Range(RCell.Address).Value

结束函数

根据 Chris Neilsen 的建议,我已将命名范围编辑为如下所示:

!(nothing)$column$row,其范围设置为Workbook

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

只有单元格 B1 被命名。它被称为“名字”

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

宏已启用

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

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

【问题讨论】:

  • 不清楚你希望函数返回什么............上一个工作表的名称的值上一个工作表中的单元格什么 ??
  • #NAME 表示未从当前工作簿或任何插件中找到 UDF PrevSheet。您的 UDF 应该返回 Range。如果启用了宏,那么这个 UDF 函数应该显示并且不会给你 #NAME 错误。
  • 您的问题可能与您定义命名范围的方式有关。请用您的姓名的完整详细信息更新您的 Q

标签: excel vba


【解决方案1】:

您的代码如果放在标准模块中似乎可以工作:

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

例如,在工作表中:

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

【讨论】:

  • 你能帮我解决这个问题吗?我尝试了所有我知道但无法解决的问题。 stackoverflow.com/q/56207459/8631622 @Gary 的学生
【解决方案2】:

如果您正确定义命名范围,这将起作用。有几种方法可以做到这一点,但这是 IMO 最简单的一种。

既然您说...将其与工作簿中一致的命名单个单元格范围一起使用。您可以创建一个命名范围、工作簿范围,它将引用一个单元格(或多个单元格) ) 在引用该名称的工作表上。

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

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

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

您的 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

还有一个名为PreviousWorksheetProperty 做同样的事情,所以你可以重构为

Function PrevSheet(RCell As Range) As Variant
    Application.Volatile
    PrevSheet = RCell.Worksheet.Previous.Range(RCell.Address).Value
End Function

【讨论】:

  • 我已经按照您的建议修改了代码并重新指定了范围,但它仍然不起作用?让我告诉你
    the name manager
    它没有显示下拉列表中的名字
    it doesnt show me the names on the dropdown bar
    工作表1.选择范围栏时不显示命名范围
    !sheet1
    !sheet 2. prevsheet 函数不起作用sheet2.
  • @Flamingo 出于某种原因,名称的样式未显示在下拉列表中。要解决 #Name? 问题,请将您的模块名称更改为 PrevSheet 以外的名称(使其与 UDF 产生冲突的名称相同)
猜你喜欢
  • 1970-01-01
  • 2014-12-10
  • 1970-01-01
  • 1970-01-01
  • 2014-07-24
  • 2021-12-13
  • 2021-05-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多