在使用vba为单元格范围添加名称时,请避免包含图纸名称
我正在使用Excel 2011 for Mac(版本14.3.1)中的一些数据,我需要绘制图表并稍后添加更多数据。 要做到这一点,我使用范围名称,因为它在这里解释。 基本上,使用公式=OFFSET($A$2,0,0,COUNTA($A:$A)-1)
(用西class牙语: =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
哪里:
-
Cells(2, i).Address
是第二行的单元格ID(例如: $ A $ 2 ) -
Replace(Cells(1, i).Address, "$1", "")
是行字母(例如: $ A )
我遇到的问题是,当手动input名称时,它用=DESREF(Sheet1!$A$2,0,0,CONTARA(Sheet1!$A:$A)-1)
=DESREF($A$2,0,0,CONTARA($A:$A)-1)
replace公式=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)
不起作用。
我尝试使用“ 添加”手册的不同选项,甚至在创build名称后尝试运行此代码以消除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)
但是我还没有find一种方法来使用DESREF
而不添加Sheet1!
我怎样才能防止Sheet1! 从出现在开始?
谢谢
我已经尝试过不同版本的Excel,它似乎是Excel 2011 for Mac(版本14.3.1)中的一个错误。
我在以下版本中试过,并没有添加Sheet1! 在开始时:
- Excel for Mac 14.3.9
- Excel for Windows 16.0.6001.1054
现在这两个版本的问题如下:
我有一个列以下单元格:
C1-> data C2-> 400 C3-> 100 C4-> 100
C5空了之后。 我运行脚本来创build名称:
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
它创build了名为Sheet1data的引用: =DESREF(Sheet1!$C$2;0;0;CONTARA(Sheet1!$C:$C)-1)
这是正确的。 但是,如果我去任何单元格并插入公式=SUM(Sheet1data)
它解决公式错误#Name? ,即使解释公式似乎指向正确的单元格。
更奇怪的是,如果创build后我去编辑名称,只需按下回车 ,公式自动工作,并呈现600 。 如果再次进入名称编辑器,则显示=DESREF(Sheet1!$C$2;0;0;CONTARA(Sheet1!$C:$C)-1)
,与以前相同。
最后, 我发现这个网站的例子有一个解释类似于我想要做的事情:
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 ,所以我改变了它,但仍然没有工作。 最后,我将公式更改为英文,即使我必须用西class牙语手写它们,并做了最后的把戏: 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)"
所以,问题出在哪里:
- Excel 2011 for Mac(版本14.3.1)似乎有一个错误。
- 使用RefersToR1C1而不是RefersTo可以更容易地使用vba公式,也许它有帮助。
- 即使在我所有的Excel中,我都使用西class牙语公式,但是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
我希望它能帮助别人:)