我正在尝试使用适用于无宏工作簿(例如 .xlsx 文件)的方法列出 Excel 工作簿中的所有工作表。
我知道以下选项,尽管这两个选项都要求将工作簿保存为允许宏的文件格式:
请参阅这个答案我发布了。
请参阅其他用户发布的此答案。
有没有列出所有工作表的选项? 如果没有,是否有任何公式可以命名包含该公式的工作表之外的任何工作表?
如果您有灵活性,您可以使用@urdearboy 中的公式,例如:每张纸上都有 A1,然后使用 3D 参考将它们收集在一起,例如
=TEXTJOIN(CHAR(10), FALSE,'FirstSheet:LastSheet'!A1)
,然后从字符串中提取。
这是一个大杂烩,但确实有效。 (但目前我对 1 个单元格中列出的所有工作表感到满意;A1 包含工作表名称 + 描述)
警告 - FirstSheet 和 LastSheet 必须明显跨越要列出的工作表范围,如果它们移动,3D 参考可能不合适或中断
在构建无宏工作簿的背景下,这是一个很好的问题。
要制作工作表名称的内容列表,可以将 @urdearboy 的公式粘贴到正在索引的每个工作表的单元格 A1 中:
=MID(CELL("文件名",A1),FIND("]",CELL("文件名",A1))+1,255)
如果每个工作表的单元格 A1 都是命名范围,使用 foo_1、foo_2、foo_3 等作为名称,则索引只是内容范围的第一个单元格中的 =foo_1,或者更好 =indirect("foo_", 1),其中 1 替换为对数字序列的单元格引用。
即使工作表名称发生更改,内容列表也会保持最新。
我参加聚会有点晚了,但这是免费的 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
要运行,您可以在 PowerShell 中执行以下命令:
powershell.exe -ExecutionPolicy Bypass -File "path for above .ps1 script"
注意事项: