【问题标题】:Prevent inclusion of sheet names when adding a name for range of cells with vba使用 vba 为单元格范围添加名称时防止包含工作表名称
【发布时间】:2023-03-18 10:02:01
【问题描述】:

我正在处理 Excel 2011 for Mac(版本 14.3.1)上的一些数据,稍后我需要绘制这些数据并添加更多数据。为此,我使用了范围名称,正如here 所解释的那样。基本上,使用公式 =OFFSET($A$2,0,0,COUNTA($A:$A)-1)(西班牙语:=DESREF($A$2,0,0,CONTARA($A:$A)-1))创建名称范围。

我有很多专栏,所以我写了这个 vba 来帮我做:

Sub Botón6_AlHacerClic()
 For i = 1 To Columns.Count
  Names.Add Name:=ActiveSheet.Name & Range(Cells(1, i).Address).Value, RefersTo:="=DESREF(" & Cells(2, i).Address & ",0,0,CONTARA(" & Replace(Cells(1, i).Address, "$1", "") & ":" & Replace(Cells(1, i).Address, "$1", "") & ")-1)"
 Next i
End Sub

地点:

  1. Cells(2, i).Address 是第二行的单元格 ID(例如:$A$2
  2. Replace(Cells(1, i).Address, "$1", "") 是行字母(例如:$A

我遇到的问题是,当手动输入名称时,它会将公式 =DESREF($A$2,0,0,CONTARA($A:$A)-1) 替换为 =DESREF(Sheet1!$A$2,0,0,CONTARA(Sheet1!$A:$A)-1),这很好并且效果很好。但是当我通过 vba 执行此操作时,它会将其替换为不起作用的 =Sheet1!DESREF(Sheet1!$A$2,0,0,CONTARA(Sheet1!$A:$A)-1)

我尝试使用 Add manual 的不同选项,甚至尝试在创建名称后运行此代码以消除开头的 Sheet1! 但最后他们保留 Sheet1!

Sub Botón7_AlHacerClic()
 Set nms = ActiveWorkbook.Names
 For i = 1 To nms.Count
  nms(i).RefersTo = Replace(nms(i).RefersTo, ActiveSheet.Name & "!DESREF", "DESREF")
 Next i
End Sub

我尝试的另一件事是将 Sheet1!DESREF 替换为不是函数的东西:

Sub Botón7_AlHacerClic()
 Set nms = ActiveWorkbook.Names
 For i = 1 To nms.Count
  nms(i).RefersTo = Replace(nms(i).RefersTo, ActiveSheet.Name & "!DESREF", "DESREFF")
 Next i
End Sub

在这种情况下,它给了我:=DESREFF($A$2,0,0,CONTARA($A:$A)-1) 但我还没有找到一种方法来使用 DESREF 而不添加 Sheet1!

如何防止 Sheet1! 出现在开头?
谢谢

【问题讨论】:

  • 当您说 VBA 将其更改为 =Sheet1!DESREF(Sheet1!$A$2,0,0,CONTARA(Sheet1!$A:$A)-1) 时,具体的 VBA 是在做什么?看起来您最初的 sn-p 会覆盖那里的任何内容。你能指出导致这种变化的特定 VBA 行吗?
  • 它在行中:Names.Add Name:=ActiveSheet.Name & Range(Cells(1, i).Address).Value, RefersTo:="=DESREF(" & Cells(2, i).Address & ",0,0,CONTARA(" & Replace(Cells(1, i).Address, "$1", "") & ":" & Replace(Cells(1, i).Address, "$1", "") & ")-1)" 此外,即使我尝试用nms(i).RefersTo = Replace(nms(i).RefersTo, ActiveSheet.Name & "!DESREF", "DESREF")替换它,它仍然会写入 Sheet1!DESREF。另一方面,如果我这样做nms(i).RefersTo = Replace(nms(i).RefersTo, ActiveSheet.Name & "!DESREF", "DESREFF"),它会写=DESREFF(Sheet1!$A$2,0,0,CONTARA(Sheet1!$A:$A)-1)
  • 哇,这太疯狂了。我觉得我可以让这个工作,只要我能重复这个问题。每次,Excel/VBA 都会做我认为应该做的事——我无法让它重新创建你的错误。如果这仍然是一个问题,并且您可以重复导致错误的步骤(在您的 OP 中),我很乐意查看它。您可能需要具体说明——“突出显示 C 列,将其命名为“blah”,运行 VBA Sub 'XYZ'。”我知道这对你来说可能并不那么重要,所以我会让你决定。
  • 我将在另一个 Excel 版本上尝试这个,以防它是 Mac 版本 14.3.1 上的特定错误。我会让你知道结果。
  • 有点古怪...我刚试过,我可以使用名称,既可以使用 F5 也可以使用左上角的框,但它们没有t 在下拉菜单中显示为选项,或者在我选择它们时显示为...换句话说,它有点有效。也许存在某种类型的“注册”事件,使 Excel 的其他部分能够以与 UI 相同的方式工作?

标签: excel vba macos excel-2011


【解决方案1】:

我尝试过使用不同版本的 Excel,这似乎是 Excel 2011 for Mac(版本 14.3.1)中的一个错误

我在以下版本中尝试过,并没有在开头添加Sheet1!

  1. Excel for Mac 14.3.9
  2. Excel for Windows 16.0.6001.1054

现在两个这两个版本的问题如下:
我有一列包含以下单元格:

C1-> data
C2-> 400
C3-> 100
C4-> 100

C5 之后为空。我运行脚本来创建名称:

Sub Botón6_AlHacerClic()
 For i = 1 To Columns.Count
  Names.Add Name:=ActiveSheet.Name & Range(Cells(1, i).Address).Value, RefersTo:="=DESREF(" & Cells(2, i).Address & ",0,0,CONTARA(" & Replace(Cells(1, i).Address, "$1", "") & ":" & Replace(Cells(1, i).Address, "$1", "") & ")-1)"
 Next i
End Sub

它为我创建了 Sheet1data 的名称,其引用为:=DESREF(Sheet1!$C$2;0;0;CONTARA(Sheet1!$C:$C)-1),这是正确的。但是,如果我转到任何单元格并插入公式 =SUM(Sheet1data),它会以公式错误 #Name? 解决,即使解释公式似乎指向正确的单元格。

更奇怪的是,如果创建后我去编辑名称并按Enter,公式会自动运行并显示600。如果我再次进入名称编辑器,它会显示=DESREF(Sheet1!$C$2;0;0;CONTARA(Sheet1!$C:$C)-1),与之前相同。

最后I found this web with examples 有一个解释类似于我想做的事情:

Sub DynamicNames()
  Dim LastCol As Long, _
      LabelRow As Long, _
      Col As Long
  Dim sName As String
  Dim c As Range
  Dim Sht As String

  'assign row and column parameters
  '**adjust for the row containing your headings
  LabelRow = 1
  LastCol = Range("IV1").End(xlToLeft).Column

  'grab sheet name
  Sht = "'" & ActiveSheet.Name & "'"

  For Each c In Range(Cells(LabelRow, 1), Cells(LabelRow, LastCol))
    Col = c.Column
    sName = c.Value
    If Len(sName) > 1 Then
      'replace spaces with underscores
      sName = Replace(sName, " ", "_", 1) 
      'create the name
      ActiveWorkbook.Names.Add Name:=sName, RefersToR1C1:= _
        "=OFFSET(" & Sht & "!R2C" & Col & ",0,0,COUNTA(" & Sht & "!C" & Col & ")-1,1)"
    End If
  Next c
End Sub

主要区别在于他们使用 RefersToR1C1 而不是 RefersTo,所以我更改了它,但它仍然无法正常工作。最后我把公式改成了英文,尽管我不得不用手用西班牙语写出来,最后一招:Names.Add Name:=ActiveSheet.Name & Range(Cells(1, i).Address).Value, RefersToR1C1:="=OFFSET(" & ActiveSheet.Name & "!R2C" & Cells(2, i).Column & ",0,0,COUNTA(" & ActiveSheet.Name & "!C" & Cells(2, i).Column & ")-1)"

那么,问题出在哪里:

  1. Excel 2011 for Mac(版本 14.3.1)似乎存在错误。
  2. 使用 RefersToR1C1 而不是 RefersTo 可以更轻松地使用 vba 公式,并且可能会有所帮助。
  3. 尽管在我的所有 Excel 中我都使用西班牙公式,但 vba 中的公式必须是英文的。 (我试过参数_RefersToR1C1Local_但它给了我一个错误)。

最后,有效的代码:

Sub Botón6_AlHacerClic()
    For i = 1 To Columns.Count
        Names.Add Name:=ActiveSheet.Name & Range(Cells(1, i).Address).Value, RefersToR1C1:="=OFFSET(" & ActiveSheet.Name & "!R2C" & Cells(2, i).Column & ",0,0,COUNTA(" & ActiveSheet.Name & "!C" & Cells(2, i).Column & ")-1)"
    Next i
End Sub

我希望它可以帮助那里的人:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-12
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 2022-07-20
    相关资源
    最近更新 更多