在为具有 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
其中:
Cells(2, i).Address
是第二行的单元格 ID(例如:$A$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!:
- Excel 对于 Mac 14.3.9
- 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)"
因此,问题所在:
- Mac 的 Excel 2011(版本 14.3.1)似乎有一个错误。
- 使用 RefersToR1C1 而不是 RefersTo 可以更轻松地使用 vba 公式,也许它有所帮助。
- 尽管在我所有的 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
我希望它能帮助那里的人:)
我正在为 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
其中:
Cells(2, i).Address
是第二行的单元格 ID(例如:$A$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!:
- Excel 对于 Mac 14.3.9
- 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)"
因此,问题所在:
- Mac 的 Excel 2011(版本 14.3.1)似乎有一个错误。
- 使用 RefersToR1C1 而不是 RefersTo 可以更轻松地使用 vba 公式,也许它有所帮助。
- 尽管在我所有的 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
我希望它能帮助那里的人:)