【问题标题】:Excel VBA: Runtime Error 1004 When Deleting Sheet1Excel VBA:删除 Sheet1 时出现运行时错误 1004
【发布时间】:2018-08-23 22:51:13
【问题描述】:

我仍在努力学习 VBA,所以这可能是一个愚蠢的问题,但我希望循环浏览大约 90-95 张的工作簿,将每个工作簿分成自己的工作簿,并将其保存为原始文件中工作表的名称。

脚本有效,但前提是我注释掉 .Worksheets(1).Delete,我想知道为什么...它在我运行它的两个工作表上都抛出 1004 错误,但不是同一个地方。第一张在标签 4 上出错,第二张在标签 40 左右。

现在我已将 FileNamePrefix 变量设置为切换,因为我在“ThisWorkbook”下的 VBA 窗口中运行它,因为我还没有弄清楚如何从它自己的工作表中运行这个宏,并且根据映射到的文件的名称/扩展名选择前缀。 (AC 以 .xlsm 形式出现,CC 以 .xlsx 形式出现)这仍在我的待办事项中,所以请不要剧透! :)

宏:

Sub Sheet_SaveAs()
    Dim wb As Workbook
    Dim WS_Count As Integer
    Dim ActiveSheetName As String
    Dim ws As Worksheet
    Dim FileNamePrefix As String
    Dim FileName As String
    Dim FilePath As String
    'FileNamePrefix = "CC Dashboard "
    FileNamePrefix = "AC Dashboard "
    WS_Count = ActiveWorkbook.Worksheets.Count
    MsgBox (" This will create: " & WS_Count & " Files")
    For Each ws In ThisWorkbook.Worksheets
        Set wb = Workbooks.Add(xlWBATWorksheet)
        With wb
            ThisWorkbook.Worksheets(ws.Name).Copy After:=.Worksheets(.Worksheets.Count)
            Application.DisplayAlerts = False
            .Worksheets(1).Delete
            Application.DisplayAlerts = True
            .SaveAs ThisWorkbook.Path & "\" & FileNamePrefix & ws.Name
            .Close False
        End With
        ws.Name = FileNamePrefix & ws.Name
    Next
    MsgBox (" Done! ")
End Sub

【问题讨论】:

  • 并将其保存为原始文件中的工作表名称 问题是工作表名称可能包含对文件系统文件名无效的字符。
  • .Worksheets(1).Delete 在您的循环中,您最终会删除最后一张纸。工作簿中必须至少有一张工作表 - 这就是您收到错误的原因。
  • 我认为这是问题所在,我正在移动隐藏的工作表,然后删除导致问题的默认“sheet1”。我偶然发现有隐藏的床单,这让很多事情都曝光了。感谢您的意见!

标签: vba excel


【解决方案1】:

因此,让我们摆脱删除,只使用您想要的工作表创建新文件。我还对您的代码做了一些清理工作。

Sub Sheet_SaveAs()
    Dim wb As Workbook
    Dim WS_Count As Integer
    Dim ActiveSheetName, FileNamePrefix, FileName, FilePath As String
    Dim ws As Worksheet

    'FileNamePrefix = "CC Dashboard "
    FileNamePrefix = "AC Dashboard "
    WS_Count = ActiveWorkbook.Worksheets.Count
    MsgBox (" This will create: " & WS_Count & " Files")
    For Each ws In ThisWorkbook.Worksheets
        ws.Copy 'this creates a new file with only the one sheet, so no Delete needed
        ActiveWorkbook.SaveAs ThisWorkbook.Path & "\" & FileNamePrefix & ws.Name
        ActiveWorkbook.Close False
    Next
    MsgBox (" Done! ")
End Sub

【讨论】:

  • 谢谢!效果很好! (我按输入太快了......)我实际上接受了这个并且正在修改它以使其也适用于导出,有人向我提出了一些新要求,他们希望它们作为 PDF 文件,我遇到了同样的问题,但是,事实证明这是因为一些隐藏的工作表......为什么会导致这样的循环出现问题?
  • 因为 Excel 要求工作簿至少有 1 个可见工作表,并且此代码试图创建一个只有一个隐藏工作表的新工作簿。在循环开始时添加对“If ws.Visible then”的检查(不要忘记“End If”),它应该处理隐藏的工作表。
  • 非常有意义!再次感谢你。我真的很感激这些信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多