在 VBA 中创建引用 ListObjects table 的动态命名范围
Create dynamic named range in VBA that references ListObjects table
我需要创建一个命名范围来引用 ListObject table 中最后几行数据。虽然我可以从功能区(公式 > 定义名称)手动执行此操作,但我必须在 20 张纸上执行此操作,每张纸有 3 个范围。
当我使用 VBA 尝试此操作时,我收到错误 1004 和一条警告,指出公式有问题,如果我不想输入公式,请删除“=”。有什么解决办法吗?
打开一个新的 Sheet1 来尝试我的代码。它将创建一个 ListObjects table 并将尝试创建命名范围。
Sub test2()
Dim wks As Worksheet, tbl As ListObject
Dim arr()
arr = [{"Date","1/1/2016","2/1/2016","3/1/2016","4/1/2016";"Green",100,200,300,400;"Yellow",350,250,150,50;"Red",10,7,5,3}]
Set wks = ActiveSheet
wks.Range("a1:d5") = WorksheetFunction.Transpose(arr)
Set tbl = wks.ListObjects.Add(xlSrcRange, wks.Range("a1").CurrentRegion, , xlYes)
tbl.Name = "tblTix"
ActiveWorkbook.Names.Add "rngRedLast3Mos", "=OFFSET(tblTix,MATCH(MAX(tblTix[Date]),tblTix[Date],1)-3,MATCH(""Red"",tblTix[#Headers],0)-1,3,1)" 'THIS FAILS
ActiveWorkbook.Names.Add "rngRedLast3Mos", "=OFFSET(Sheet1!$A,2,3,3,1)" 'THIS WORKS
ActiveWorkbook.Names.Add "rngRedLast3Mos", "=Sheet1!$D:$D" 'THIS ALSO WORKS
Debug.Print ActiveWorkbook.Names("rngRedLast3Mos").RefersTo
Debug.Print ActiveSheet.Range("rngRedLast3Mos").Address
End Sub
如果我在名称管理器中手动定义范围,我可以分配这个引用,并且有效:
=OFFSET(tblTix,MATCH(MAX(tblTix[Date]),tblTix[Date],1)-3,MATCH("Red",tblTix[#Headers],0)-1,1,1)
我不明白这是怎么回事。
改变
ActiveWorkbook.Names.Add "rngRedLast3Mos", _
"=OFFSET(tblTix,MATCH(MAX(tblTix[Date]),tblTix[Date],1)-3,MATCH(""Red"",tblTix[#Headers],0)-1,3,1)"
至
ActiveWorkbook.Names.Add Name:="rngRedLast3Mos", RefersToR1C1:= _
"=OFFSET(tblTix,MATCH(MAX(tblTix[Date]),tblTix[Date],1)-3,MATCH(""Red"",tblTix[#Headers],0)-1,3,1)"
其余的也这样做
我需要创建一个命名范围来引用 ListObject table 中最后几行数据。虽然我可以从功能区(公式 > 定义名称)手动执行此操作,但我必须在 20 张纸上执行此操作,每张纸有 3 个范围。
当我使用 VBA 尝试此操作时,我收到错误 1004 和一条警告,指出公式有问题,如果我不想输入公式,请删除“=”。有什么解决办法吗?
打开一个新的 Sheet1 来尝试我的代码。它将创建一个 ListObjects table 并将尝试创建命名范围。
Sub test2()
Dim wks As Worksheet, tbl As ListObject
Dim arr()
arr = [{"Date","1/1/2016","2/1/2016","3/1/2016","4/1/2016";"Green",100,200,300,400;"Yellow",350,250,150,50;"Red",10,7,5,3}]
Set wks = ActiveSheet
wks.Range("a1:d5") = WorksheetFunction.Transpose(arr)
Set tbl = wks.ListObjects.Add(xlSrcRange, wks.Range("a1").CurrentRegion, , xlYes)
tbl.Name = "tblTix"
ActiveWorkbook.Names.Add "rngRedLast3Mos", "=OFFSET(tblTix,MATCH(MAX(tblTix[Date]),tblTix[Date],1)-3,MATCH(""Red"",tblTix[#Headers],0)-1,3,1)" 'THIS FAILS
ActiveWorkbook.Names.Add "rngRedLast3Mos", "=OFFSET(Sheet1!$A,2,3,3,1)" 'THIS WORKS
ActiveWorkbook.Names.Add "rngRedLast3Mos", "=Sheet1!$D:$D" 'THIS ALSO WORKS
Debug.Print ActiveWorkbook.Names("rngRedLast3Mos").RefersTo
Debug.Print ActiveSheet.Range("rngRedLast3Mos").Address
End Sub
如果我在名称管理器中手动定义范围,我可以分配这个引用,并且有效:
=OFFSET(tblTix,MATCH(MAX(tblTix[Date]),tblTix[Date],1)-3,MATCH("Red",tblTix[#Headers],0)-1,1,1)
我不明白这是怎么回事。
改变
ActiveWorkbook.Names.Add "rngRedLast3Mos", _
"=OFFSET(tblTix,MATCH(MAX(tblTix[Date]),tblTix[Date],1)-3,MATCH(""Red"",tblTix[#Headers],0)-1,3,1)"
至
ActiveWorkbook.Names.Add Name:="rngRedLast3Mos", RefersToR1C1:= _
"=OFFSET(tblTix,MATCH(MAX(tblTix[Date]),tblTix[Date],1)-3,MATCH(""Red"",tblTix[#Headers],0)-1,3,1)"
其余的也这样做