【问题标题】:Save CSV with same name as current open CSV以与当前打开的 CSV 相同的名称保存 CSV
【发布时间】:2021-06-15 00:33:04
【问题描述】:

我有一个宏,它在 CSV 上运行与个人工作簿不同的循环宏(无需打开它),并且应该使用相同的名称重新保存文档。

我在尝试保存时收到此错误。

运行时错误“1004”:
您不能使用与另一个打开的工作簿或加载项相同的名称保存此工作簿。在保存之前选择其他名称或关闭其他工作簿或加载项。

我需要这个,因为有一个工具可以查找此文档名称。

这是打开 csv 并运行循环宏(不打开 Excel)的宏。

Sub ExcelMacroExample() 
    Dim xlApp 
    Dim xlBook 

    Set xlApp = CreateObject("Excel.Application") 
    Set xlBook = xlApp.Workbooks.Open("F:\Folder\specific name.csv", 0, True) 
    xlapp.workbooks.open("C:\Users\name\AppData\Roaming\Microsoft\Excel\XLSTART \Personal.xlsb")
    xlApp.Run "Personal.xlsb!LoopColumnC "
    xlApp.Quit 

    Set xlBook = Nothing 
    Set xlApp = Nothing 
End Sub

LoopColumnC 的宏是它尝试保存的位置。

Sub LoopColumnC()
    '
    ' LoopColumnC Macro
    '

    '
    'This is to disregard any popups.
    Application.DisplayAlerts = False
    'This is the actual loop. Works just fine. 
    Dim lastRow As Long
    lastRow = Cells(Rows.Count, 3).End(xlUp).Row
    For i = 2 To lastRow
        If Cells(i, 3).Value = 1 Then Cells(i, 3).Value = Cells(i - 1, 3).Value
      Next i

    'Here is where it errors out because the file it is trying to save as is already opened in the background. 
    ThisWorkbook.SaveAs "F:\Folder\specific name.csv",

    Application.DisplayAlerts = True
    
End Sub

【问题讨论】:

  • 您正在尝试将您的个人工作簿另存为 csv 文件,该文件已在 Excel 的另一个实例中打开。当您使用个人工作簿中的代码时,您很少使用ThisWorkbook
  • 那么,让它保存它更新的 csv 的函数是什么?哪里是放置该代码的最佳位置?在 ExcelMacroExample 宏中还是在 LoopColumnC 中?
  • "没有实际打开它" ...但是你正在Workbooks.Open("F:\Folder\specific name.csv", 0, True)打开它。那么,为什么不直接使用ActiveWorkbook.Save 而不是ThisWorkbook.SaveAs ...

标签: excel vba csv save


【解决方案1】:

您应该修改代码以将工作表对象直接传递给被调用的宏 - 不要依赖 Activesheet 等。

Sub ExcelMacroExample() 
    Dim xlApp 
    Dim xlBook

    Set xlApp = CreateObject("Excel.Application") 
    'if you want to save with the same name then you can't open as read-only...
    Set xlBook = xlApp.Workbooks.Open("F:\Folder\specific name.csv", 0, True) 
    xlapp.workbooks.open("C:\Users\name\AppData\Roaming\Microsoft\Excel\XLSTART \Personal.xlsb")
    xlApp.Run "Personal.xlsb!LoopColumnC", xlBook.Worksheets(1) '<< passes the sheet

    xlBook.Close '<<
    xlApp.Quit 

    Set xlBook = Nothing 
    Set xlApp = Nothing 
End Sub

您的处理宏接收工作表对象:

'gets a worksheet object from the caller
Sub LoopColumnC(ws As Worksheet)
  
    
    Dim lastRow As Long
    'operate on the provided worksheet
    lastRow = ws.Cells(ws.Rows.Count, 3).End(xlUp).Row
    For i = 2 To lastRow
        If ws.Cells(i, 3).Value = 1 Then 
            ws.Cells(i, 3).Value = ws.Cells(i - 1, 3).Value
        End If
    Next i

    Application.DisplayAlerts = False
    ws.Parent.SaveAs "F:\Folder\specific name.csv" 'ws.Parent = workbook
    Application.DisplayAlerts = True
    
End Sub

【讨论】:

  • 我同意传递工作表对象,但由于"F:\Folder\specific name.csv" 实际上是正在打开的工作簿,所以一个简单的Save 不应该就足够了吗?
  • 我是这么想的,但后来想知道这些是否是占位符,尤其是当 OP 以只读方式打开原始文件时...
  • 是的,那句话“......(没有实际打开它)并且应该用相同的名称重新保存文档”然后令人困惑,因为实际上正在打开工作簿,并且它是相同的姓名(?)。
  • 是的。它实际上确实打开了 excel,但就像一个“占位符”。我尝试使用简单的保存,它会提示另存为文件名框。我尝试选择它来覆盖原始 csv,它告诉我我不能。我在上面进行了编码更改,并且正如预期的那样,由于文件以只读方式打开,因此出现无法保存的错误。要保留您的更改,您需要将工作簿以新名称保存在其他位置。
  • 我确实进一步挖掘并让它工作,使用 'IgnoreReadOnlyRecommended' Set xlApp = CreateObject("Excel.Application") Set xlBook = xlApp.Workbooks.Open("F:\Folder \specific name.csv", IgnoreReadOnlyRecommended:=True) ...我还在循环结束时删除了额外的保存功能,因为 Excel 会询问它何时关闭。感谢所有的帮助!它现在工作正常。
猜你喜欢
  • 1970-01-01
  • 2018-06-27
  • 1970-01-01
  • 1970-01-01
  • 2018-07-04
  • 2018-07-29
  • 2021-07-21
  • 1970-01-01
  • 2015-07-04
相关资源
最近更新 更多