在为具有 vba 的单元格区域添加名称时防止包含 sheet 名称

Prevent inclusion of sheet names when adding a name for range of cells with vba

我正在为 Mac(版本 14.3.1)处理 Excel 2011 的一些数据,稍后我需要绘制这些数据并添加更多数据。为此,我使用了范围的名称,正如 here 所解释的那样。基本上,使用公式 =OFFSET($A,0,0,COUNTA($A:$A)-1)(西班牙语:=DESREF($A,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, "", "") & ":" & Replace(Cells(1, i).Address, "", "") & ")-1)"
 Next i
End Sub

其中:

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

我遇到的问题是,当手动输入名称时,它将公式 =DESREF($A,0,0,CONTARA($A:$A)-1) 替换为 =DESREF(Sheet1!$A,0,0,CONTARA(Sheet1!$A:$A)-1),这很好,而且效果很好。但是,当我用 vba 执行此操作时,它会用 =Sheet1!DESREF(Sheet1!$A,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,0,0,CONTARA($A:$A)-1) 但是我还没有找到一种方法来使用 DESREF 而不添加 Sheet1!

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

我尝试过不同版本的 Excel,这似乎是 Excel 2011 中 Mac(版本 14.3.1)的错误.

我在下面的版本中试过了,都没有在开头添加Sheet1!:

  1. Excel 对于 Mac 14.3.9
  2. Excel 对于 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, "", "") & ":" & Replace(Cells(1, i).Address, "", "") & ")-1)"
 Next i
End Sub

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

更奇怪的是,如果在创建它之后我去编辑名称并点击 Enter,公式会自动运行并显示 600 .如果我再次转到名称编辑器,它会显示 =DESREF(Sheet1!$C;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. Mac 的 Excel 2011(版本 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

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