在Excel的公式引用动态命名范围(Referencing Dynamic Named Range

2019-07-19 19:44发布

我有一个表在Excel与其他地方的对应动态命名范围的一部分,我的工作簿中的列标题。 例如,我有这些列标题:“10”,“20”等,并且这些动态命名区域:“ExampleRange10”,“ExampleRange2”等。我想输入一个VLOOKUP公式通过串联引用ExampleRange10字符串“ExampleRange”和列标题“10”。 这将允许我简单地在所有列手动扩展公式中的表,而不是每列的公式中键入“ExampleRange10”,“ExampleRange20”等。

我知道间接的功能,并已在命名区域过去成功地使用它,但它似乎并没有在这种情况下, 动态命名的区域合作。 我猜这是有事情做用Excel定义如何动态的命名范围(他们没有在指定的范围下拉式栏左侧显示了一个细微之处,他们在VBA一些有趣的特性, 例如)。 有没有一种方法,我可以结合使用间接公式与动态命名区域,或者是有另一种方式,我可以去解决这个问题呢?

编辑 :这是所使用的精确公式。
这是主要的公式: =VLOOKUP(B2,INDIRECT("ExampleRange"&C1),2,FALSE)其中C1包含“10”,我称之为“ExampleRange10”动态命名范围的公式为: =OFFSET(Sheet1!$F$2,0,0,COUNTA(Sheet1!$F$2:$F$25),2) 主要的公式返回“#REF!”,但它工作正常,当我删除了动态范围命名的配方和简单地定义“ExampleRange10”作为一个静态的范围。

Answer 1:

作为最好做进一步的研究后,我看得出来,Excel的INDIRECT作用根本不具有动态范围工作。 有可能是一个聪明的办法来解决使用INDIRECT ,坚持非VBA Excel中的世界,但我不知道这样的方式。 相反,我结束了创建非常相似,所描述的一个用户定义的函数在这里 。 我改变我的主要公式读取=VLOOKUP(B2,DINDIRECT("ExampleRange"&C1),2,FALSE)其中DINDIRECT是我所创建的VBA函数的名称。

唯一的缺点(这可能是也可能不是取决于你如何看待它缺点),以这种替代是该工作簿必须保存为一个启用宏的工作簿和使用一个自定义的功能还不是很自我记录和需要一点解释给其他用户。 所有的事情考虑,不过,这对我来说是可以接受的解决方案。

对于链接厌恶,下面的代码:

Public Function DINDIRECT(sName As String) As Range
     Dim nName As Name

     On Error Resume Next
          Set nName = ActiveWorkbook.Names(sName)
          Set nName = ActiveSheet.Names(sName)
     On Error GoTo 0

     If Not nName Is Nothing Then
          Set DINDIRECT = nName.RefersToRange
     Else
          DINDIRECT = CVErr(xlErrName)
End Function

注:虽然这种解决方案的工作,我不会接受我的答案,因为我不想从发布更好的解决方案劝阻他人。 另外,我是新来的网站,很抱歉,如果我的回答我的问题违反任何礼仪规范......我只是想我会分享我的情况下使用其他人发现它有用的精确解。



Answer 2:

我最近打这个确切的砖墙,当你已经猜到了答案很简单,你不能引用动态指定范围与间接的。

但是,您可以使用动态范围公式本身间接的说法,但是这是你想要做什么都没用。 有点皮塔饼,因为它是将是非常有用的一种功能。



Answer 3:

如果您的数据有一个像10,20等标题,那么你就需要使用间接。 为什么不使用索引/匹配来选择你需要的数据?

写出你整个表ExampleRanges例如,用这个公式:

Index(ExampleRanges, match(B2, index(ExampleRanges, , 1), 0), match(C1, index(ExampleRanges, 1,), 0))


Answer 4:

未经检验的,但我认为这会工作:

用户定义的函数返回的动态命名范围的地址:

Function Named_Range_Address(Range_Name As Range, _ 
    Optional SheetName As Boolean) As String 

    Dim strName As String 
    Application.Volatile 

    If SheetName = True Then 
        strName = "'" & Range_Name.Parent.Name & "'!" & Range_Name.Address 
    Else 
        strName = Range_Name.Address 
    End If 

    Named_Range_Address = strName 
End Function 

那么你应该能够使用您的VLOOKUP公式:

=VLOOKUP(B2,INDIRECT(named_range_address("ExampleRange"&C1,TRUE)),2,FALSE)


Answer 5:

我知道这是很老,但我只是刚刚碰到这个,以为我想补充的是避免了在任何情况下,VBA代码的解决方案可以帮助别人谁碰到这个绊倒:

=VLOOKUP(B2,CHOOSE(C1/10,example10,example20,example30,example40),2,0)

这是假设的命名约定为10,20,30等,并为数百范围不会很理想。



Answer 6:

今天我用Excel摆弄命名范围,并且我发现,虽然这是事实,你不能计算在该范围内的名称INDIRECT()调用自身,你仍然可以得到它在一个纯粹的“Excel的方式”通过增加一个中间步骤:只要创建在用户使用电脑时的命名范围内的一些隐藏的单元格。

例如,假设A1包含范围名称的“动态部分”,接着在A2使用公式= "ExampleRange" & A1 ,现在你有充分的范围名称,它可以直接使用= INDIRECT(A2)



Answer 7:

添加一个新的转折,也可以使用一个命名的范围与地址和间接的功能。 我有我在哪里设置一个名为范围的一系列表并使用以下我的情况:

Named Range: WWDH-FF-PI which points to Linear!$A$19 (first cell in table)

拿到地址:$ T $ 56:= ADDRESS(!MATCH(S56,线性答:A,0),1,1,1, “线性”)

然后使用偏移函数多次复制到创建数据透视表:

=OFFSET(INDIRECT($T$56),C5,$T$57-1)

所以,地址函数可以被嵌入(或缠绕)到间接函数创建一个动态单元地址。



Answer 8:

我知道这是一个非常古老的线程,但我有同样的问题,所以也许我的解决方案可以帮助人们在未来。

基本上,我创建了一个宏,将删除并重新定义后保存范围,并给它一个名字。 因此,作为范围是不是动态的间接功能会工作。 所有你需要做的是保存工作簿添加任何值,命名区域后

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)

Dim a, b, c, d, e, f As Integer
Dim data As Worksheet

Set data = ThisWorkbook.Worksheets("Data")

a = data.Range("A" & Rows.count).End(xlUp).row
b = data.Range("B" & Rows.count).End(xlUp).row
c = data.Range("C" & Rows.count).End(xlUp).row
d = data.Range("D" & Rows.count).End(xlUp).row
e = data.Range("E" & Rows.count).End(xlUp).row
f = data.Range("F" & Rows.count).End(xlUp).row



ActiveWorkbook.Names("KP").Delete
ActiveWorkbook.Names("KPT").Delete
ActiveWorkbook.Names("AP").Delete
ActiveWorkbook.Names("APT").Delete
ActiveWorkbook.Names("DISC").Delete
ActiveWorkbook.Names("SEATS").Delete

ActiveWorkbook.Names.Add Name:="KP", RefersTo:="=Data!$A$2:$A$" & a
ActiveWorkbook.Names.Add Name:="KPT", RefersTo:="=Data!$B$2:$B$" & b
ActiveWorkbook.Names.Add Name:="AP", RefersTo:="=Data!$C$2:$C$" & c
ActiveWorkbook.Names.Add Name:="APT", RefersTo:="=Data!$D$2:$D$" & d
ActiveWorkbook.Names.Add Name:="DISC", RefersTo:="=Data!$E$2:$E$" & e
ActiveWorkbook.Names.Add Name:="SEATS", RefersTo:="=Data!$F$2:$F$" & f

End Sub


文章来源: Referencing Dynamic Named Range in Excel Formula