【发布时间】:2024-01-12 13:26:01
【问题描述】:
编辑:新行为 - 将主 XLSM 重新定位到新的起始目录会导致所有问题都消失。将 XLSM 放入新创建的(但名称相同)目录中的原始位置也没有问题。
我正在使用 Excel/VBA 2010。我的项目要求我从一个主 XLSM 工作簿中复制一个工作表,该工作簿为每个用户提供一个工作表。我的方法是遍历主文档的每个工作表,创建一个特定于用户的目录和工作簿,复制该用户的工作表,然后保存他们的文件。我已经成功地多次执行此代码并取得了一些成功,但在少数情况下会出现问题。下面的示例代码
Sub createDirectories()
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
Dim oFile As Object
Dim ws As Worksheet
Dim NewBook As Workbook
For Each ws In ThisWorkbook.Worksheets
If StrComp(ws.Name, "only_nonUser_sheet", vbTextCompare) <> 0 Then
If Not fso.FolderExists(ThisWorkbook.Path & "\" & ws.Name) Then
Set oFile = fso.CreateFolder(ThisWorkbook.Path & "\" & ws.Name)
End If
If fso.FolderExists(ThisWorkbook.Path & "\" & ws.Name) Then
If Not fso.FileExists(ThisWorkbook.Path & "\" & ws.Name & "\" & ws.Name & ".xlsm") Then
Set NewBook = Workbooks.Add
ws.Copy Before:=NewBook.Sheets(1)
'Prevents sheet name from exceeding a 31 character limit
NewBook.Sheets(Sheets(ws.Name).Index).Name = Left(ws.Name, 20) & " " & Format(Now(), "mm-dd-yyyy")
'Source of failure
NewBook.SaveAs Filename:=ThisWorkbook.Path & "\" & ws.Name & "\" & ws.Name, FileFormat:=52
NewBook.Close SaveChanges:=False
End If
End If
End If
Next ws
'Clean up file management objects
Set fso = Nothing
Set oFile = Nothing
End Sub
文件夹的创建没有任何明显的问题(尽管我在下面担心)。 NewBook.SaveAs 产生运行时错误“1004”,无法 SaveAs 对象“_workbook”。改变参数会产生有趣的结果:
NewBook.SaveAs Filename:=ThisWorkbook.Path & "\" & ws.Name, FileFormat:=52
将文件正确保存在与主 XLSM 相同的目录中,但不在所需的用户特定文件夹中。这是意料之中的。
NewBook.SaveAs Filename:=ThisWorkbook.Path & "\" & "testFolder01" & "\" & "testFile02", FileFormat:=52
在 testFolder01 中正确保存 testFile02(前提是我先创建目录)。
NewBook.SaveAs Filename:=ThisWorkbook.Path & "\" & "testFolder01" & "\" & ws.Name, FileFormat:=52
将 ws.Name.xlsm 正确保存在预先创建的文件夹中。
NewBook.SaveAs Filename:=ThisWorkbook.Path & "\" & ws.Name & "\" & "testFile02", FileFormat:=52
为 SaveAs 失败生成运行时错误“1004”。
我的两个预感是: 1. 虽然文件资源管理器中出现了用户特定的目录,但它们并没有正确完成。我尝试在我的 fso.CreateFolder() 行中添加 oFile.Close 会导致运行时错误“483”,我不知道如何解决这个问题。我检查了 Microsoft Scripting Run-Time 作为参考。 2. SaveAs 方法不允许可变路径,但允许可变文件名,这将是非常不幸和不直观的。
我的总路径名总共不超过 150 个字符。我的路径/文件名不包含任何非法字符。我的工作簿路径位于映射驱动器上,但这对我的 SaveAs 行的变体没有任何问题。我的代码对于我要保存的工作簿很冗长。可以修改我的代码以完成我的任务吗?如果没有,是否有另一种创建和保存允许可变路径/文件名的 XLSM 文件的方法?
【问题讨论】:
标签: excel vba runtime-error save-as xlsm