列出没有宏或Excel 4函数的工作表名称

问题描述 投票:0回答:3

我正在尝试使用适用于无宏工作簿(例如 .xlsx 文件)的方法列出 Excel 工作簿中的所有工作表。

我知道以下选项,尽管这两个选项都要求将工作簿保存为允许宏的文件格式:

方法一:Excel 4函数

请参阅这个答案我发布了。

方法2:VBA

请参阅其他用户发布的此答案

有没有列出所有工作表的选项? 如果没有,是否有任何公式可以命名包含该公式的工作表之外的任何工作表?

excel excel-formula excel-4.0
3个回答
2
投票

如果您有灵活性,您可以使用@urdearboy 中的公式,例如:每张纸上都有 A1,然后使用 3D 参考将它们收集在一起,例如

=TEXTJOIN(CHAR(10), FALSE,'FirstSheet:LastSheet'!A1)
,然后从字符串中提取。

这是一个大杂烩,但确实有效。 (但目前我对 1 个单元格中列出的所有工作表感到满意;A1 包含工作表名称 + 描述)

警告 - FirstSheet 和 LastSheet 必须明显跨越要列出的工作表范围,如果它们移动,3D 参考可能不合适或中断


0
投票

在构建无宏工作簿的背景下,这是一个很好的问题。

要制作工作表名称的内容列表,可以将 @urdearboy 的公式粘贴到正在索引的每个工作表的单元格 A1 中:

=MID(CELL("文件名",A1),FIND("]",CELL("文件名",A1))+1,255)

如果每个工作表的单元格 A1 都是命名范围,使用 foo_1、foo_2、foo_3 等作为名称,则索引只是内容范围的第一个单元格中的 =foo_1,或者更好 =indirect("foo_", 1),其中 1 替换为对数字序列的单元格引用。

即使工作表名称发生更改,内容列表也会保持最新。


0
投票

我参加聚会有点晚了,但这是免费的 vb(每当您打开工作簿时它都不会自动运行,除非您将 .bat 执行程序放入 Excel START 文件夹(不建议)或修补任务计划程序每当记录适当的事件时触发)。

PowerShell 脚本(根据要求输入工作簿的路径名称。):

function GetPath($p) {
    $split = $p -split '\\'
    return $split[-2..-1] -join '\'
}

function GetWB($app, $path) {
    $target = GetPath $path
    foreach ($wb in $app.Workbooks) {
        if ((GetPath $wb.FullName) -eq $target) {
            return $wb
        }
    }
    # exit (in case you want to use this with task scheduler, to prevent script running every time you open excel exit here)
}

function GetOrAddSh($wb, $shName) {
    foreach ($sh in $wb.Sheets) {
        if ($sh.Name -eq $shName) {
            $sh.Cells.Clear()
            return $sh
        }
    }
    $sh = $wb.Sheets.Add()
    $sh.Name = $shName
    return $sh
}

function WriteShNames {
    param([object]$wb, [string]$shName)
    $sh = GetOrAddSh $wb $shName
    $row = 1
    foreach ($ws in $wb.Sheets) {
        if ($ws.Name -ne $shName) {
            $sh.Cells.Item($row, 1).Value2 = $ws.Name
            $sh.Cells.Item($row, 2).Formula = "='" + $ws.Name + "'!A1"
            $row++
        }
    }
    $wb.Save()
}

$path = "put path name of excel file"
try {
    $excelApp = [Runtime.InteropServices.Marshal]::GetActiveObject("Excel.Application")
} catch {
    $excelApp = New-Object -ComObject Excel.Application
    $excelApp.Visible = $false
}

$wb = GetWB $excelApp $path
if ($wb -eq $null) {
    $wb = $excelApp.Workbooks.Open($path)
}

WriteShNames -wb $wb -shName 'all_sheets'
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($wb) | Out-Null
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($excelApp) | Out-Null
  • 这将检查工作簿是否打开(如果没有打开,则可选“退出”)
  • 它将创建一个名为“all_sheets”的工作表,并列出工作簿中的所有工作表以及每个工作表的单元格链接
  • 如果 all_sheets 已经存在,它只会在列出上面的工作表名称之前清除其内容
  • 保存和关闭工作簿是可选的

要运行,您可以在 PowerShell 中执行以下命令:

powershell.exe -ExecutionPolicy Bypass -File "path for above .ps1 script"

注意事项:

  • 使用 gpt-o1 协助 .ps1 脚本中的语法(有很多测试/提示/挑战)
  • 每个段落都是作为定制/原创提示的一部分而设计的,以实现预期的结果;并进行了彻底的测试。然后在需要帮助的相关部分使用正确的语法重新编写脚本。 使用的参数/变量和参数都是输入。 函数的存在/什么时候调用,什么时候退出(条件)等一样
© www.soinside.com 2019 - 2024. All rights reserved.