使用vba添加单元格范围的名称时,防止包含工作表名称

时间:2016-02-14 19:40:58

标签: excel vba excel-vba excel-vba-mac excel-2011

我正在使用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
  3. 我遇到的问题是,当手动输入名称时,它会将公式=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!出现在开头?
    谢谢

1 个答案:

答案 0 :(得分:0)

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

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

  1. Excel for Mac 14.3.9
  2. Excel for Windows 16.0.6001.1054
  3. 现在这些版本的两者的问题如下:
    我有一个包含以下单元格的列:

    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_,但它给了我一个错误。)
    4. 最后,有效的代码:

      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
      

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