动态表索引号

时间:2015-12-31 04:52:31

标签: excel excel-vba vba

我正在尝试编写一个函数,该函数返回函数所在的工作表的索引号。

我有这个:

Function Sheet()    
Sheet = ThisWorkbook.ActiveSheet.Index    
End Function

我在工作簿中有多个工作表,它们都使用该功能,但都需要参考他们自己的特定工作表。使用"活动表"只要我更新一张工作表,所有其他工作表就会将结果更改为新工作表,而不是保留在自己的工作表中。

有没有办法将函数限制为唯一的工作表?

3 个答案:

答案 0 :(得分:2)

在Excel 2016,Excel 2013,Excel Online,Excel 2016 for Mac中,您可以使用内置Excel功能:

=SHEET()

否则,请使用chris neilsen方法或类似方式:Get sheet index number from cell reference (Function)

Function SheetNum(Optional celRef As Range) As Long 

    With Application.Caller.Parent 
        If celRef Is Nothing Then 
            SheetNum = .Index 
        Else 
            SheetNum = celRef.Parent.Index 
        End If 
    End With 

End Function

建议:将您的UDF名称从Sheet更改为MySheet之类的内容。

如果您希望公式获取工作表的名称(而不是索引),则可以使用此公式:

=REPLACE(CELL("filename"),1,FIND("]",CELL("filename")),"")

答案 1 :(得分:1)

您可以使用Application.Caller来获取UDF所在单元格的引用。从那里可以轻松获取索引

Function Sheet()
    Dim rng as Range
    Set rng = Application.Caller
    Sheet = rng.Worksheet.Index
End Function

请参阅帮助以获取调用者的完整详细信息并添加适当的错误处理

答案 2 :(得分:1)

您还可以使用利用Excel的XLM语言

的范围名称(范围公式)
  1. 将范围名称​​ ShtNames 定义为=GET.WORKBOOK(1+0*RAND())
  2. 将第二个范围名称​​ ShtName 定义为=GET.CELL(32+0*NOW(),INDIRECT(SUBSTITUTE(REFTEXT(!$A$1),1,""),FALSE))
  3. 然后在您想要索引的工作表中,
    =MATCH(ShtName,ShtNAmes,0)

    Fadi问题的更新

    您可以使用下面的公式(从任何工作表)返回工作表名称以查找 AllSheets ,而不是添加第二个名称。 所以在第1页的A1

    中说

    =MATCH(RIGHT(CELL("filename",Sheet2!A1),LEN(CELL("filename",Sheet2!A1))-FIND("[",CELL("filename",Sheet2!A1))+1),AllSheets,0)

    会返回Sheet2

    的工作表位置