我正在使用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
其中:
Cells(2, i).Address
是第二行的单元格ID(例如: $ A $ 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!出现在开头?
谢谢
答案 0 :(得分:0)
我尝试使用不同版本的Excel,它似乎是 Excel 2011 for Mac(版本14.3.1)中的错误。
我在以下版本中尝试过它并且它没有在开头添加 Sheet1!:
现在这些版本的两者的问题如下:
我有一个包含以下单元格的列:
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)"
所以,问题在哪里:
最后,有效的代码:
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
我希望它可以帮助那些人:)