如何转换自定义函数来处理溢出数组(excel)

如何转换自定义函数来处理溢出数组(excel)

我需要一个生成工作表名称列表的函数,我已经有一个可以将工作表编号转换为工作表名称的函数,但它不能处理数组

我想要转换的函数是

Function SHEETNAME(number As Variant) As String
    SHEETNAME = Sheets(number).Name
End Function

我希望它接受以下输入

=SHEETNAME(SEQUENCE(SHEET()-1))

这将输出当前工作表之前的所有工作表的列表

例如(假设默认名称)如果我们在 Sheet4 上,则输出将是 {Sheet1; Sheet2; Sheet3}

答案1

如果您需要从第一个到指定表的名称,那么使用 SEQUENCE() 是不合理的,宏可以轻松地在指定的边界内循环:

Function getListNames(endSheet As Long) As Variant
Dim aResult As Variant
Dim i As Long
    ReDim aResult(1 To ThisWorkbook.Sheets.Count, 1 To 1)
    For i = 1 To ThisWorkbook.Sheets.Count
        aResult(i, 1) = ThisWorkbook.Sheets(i).Name
        If i >= endSheet Then Exit For
    Next i
    getListNames = aResult
End Function

使用{=GETLISTNAMES(SHEET()-1)}

答案2

不确定你的问题是什么。

  • SEQUENCEwill => 数字数组
  • 循环将SEQUENCE每个数字转换为工作表名称
  • 存储工作表名称在一些方便的对象中(array,,,)arraylistcollectiondictionary
  • 将函数名称等同于数组(如果想要垂直输出则转置)

不清楚您所说的“当前工作表之前”是什么意思。您应该知道,工作表编号代表工作表的顺序,如在 Excel 窗口底部所见,如果您重新排序这些工作表,工作表编号将会改变。

例如:

Option Explicit
Function SheetNames(SN) As Variant
    Dim AL As Object
    Dim V

Set AL = CreateObject("System.Collections.ArrayList")
For Each V In SN
    AL.Add ThisWorkbook.Worksheets(V).Name
Next V

'Transpose => vertical array
SheetNames = WorksheetFunction.Transpose(AL.toarray)
    
End Function

相关内容