禁止"另存为"提示

use*_*084 15 csv excel vba prompt excel-vba

我查看了这个主题并找到了一些帮助,但这些建议似乎没有起作用.

  • 我打开一个CSV文件到EXCEL进行一些更改,然后想要将结果保存回相同的文件名和CSV格式.
  • 我想这样做没有提示我要确保我要保存文件.
  • 我们使用宏启用的excel文件导入数据make更改然后保存.
  • 整个过程由批处理文件启动,该文件将定期打开Excel应用程序和指定文件,这就是为什么我们不希望提示停止该过程.

这是我在VBA中用来完成工作的代码,以及我发现的其他可以帮助我抑制提示的子代码.

此代码位于TheWorkbook文件中,而不是模块.

我错过了什么吗?

Sub fixfile()
    Const strFileName = "W:\Webshare\Documents Acquired in 2017\Jim Excel\snr-room-schedule.csv"
    Dim wbkS As Workbook
    Dim wshS As Worksheet
    Dim wshT As Worksheet
    Set wshT = Worksheets.Add(After:=Worksheets(Worksheets.Count))
    Set wbkS = Workbooks.Open(Filename:=strFileName)
    Set wshS = wbkS.Worksheets(1)
    wshS.UsedRange.Copy Destination:=wshT.Range("A1")
    wbkS.Close SaveChanges:=False

    'This is the area of work that we doing to the data
    'Through here

    Application.DisplayAlerts = False 'IT WORKS TO DISABLE ALERT PROMPT

    ActiveWorkbook.SaveAs Filename:= _
        "W:\Webshare\Documents Acquired in 2017\Jim Excel\snr-room-schedule.csv", FileFormat _
        :=xlCSVMSDOS, CreateBackup:=False

    Application.DisplayAlerts = True 'RESETS DISPLAY ALERTS
    Application.Quit
End Sub

Private Sub Workbook_Open()
    fixfile
End Sub

Sub CloseandSave()
    ActiveWorkbook.Close SaveChanges:=True
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    ThisWorkbook.Save
End Sub
Run Code Online (Sandbox Code Playgroud)

A.S*_*S.H 12

代码中的问题归结于以下几点.

当您调用SaveAs启用宏的工作簿时,您已经附加了一个工作表:

Set wshT = Worksheets.Add(After:=Worksheets(Worksheets.Count))

然后你试图将它保存为csv,这是一个只有一个工作表的文本文件,所以Excel抱怨你会丢失信息.

此外,您正在对csv进行两次更新:一次在

ActiveWorkbook.SaveAs Filename:= ...

结果,当前工作簿变为已保存的工作簿,然后再次出现在工作簿Workbook_BeforeClose.在后者你没有禁用警报,但无论如何,没有必要再次保存.

我得出结论,你想要的是使用支持宏的wb作为计算工具,你只关心更新CSV工作簿.

为简单起见,我们将禁用整个会话的警报,因为启用宏的WB用作实用程序,我们不希望批处理作业因任何原因而停止.但是,如果您感觉更舒服,可以在保存之前和之后以传统方式进行.

' Code module ThisWorkbook
Option Explicit
Private Sub Workbook_Open()
    Application.DisplayAlerts = False
    Application.ScreenUpdating = False

    fixCSVFile

    ' Do the following only if you want the macro-enabled WB to keep
    ' a copy of the CSV worksheet. but my feeling is you dont want to
    ' ThisWorkbook.Save
    '''''''''''''''''''''

     Application.Quit
End Sub

Sub fixCSVFile()
    Const strFileName = "W:\Webshare\Documents Acquired in 2017\Jim Excel\snr-room-schedule.csv"
    Dim wbkS As Workbook, wshS As Worksheet, wshT As Worksheet

    Set wshT = Worksheets.Add(After:=Worksheets(Worksheets.Count))
    Set wbkS = Workbooks.Open(Filename:=strFileName)
    Set wshS = wbkS.Worksheets(1)

    wshS.UsedRange.Copy Destination:=wshT.Range("A1")
    wbkS.Close SaveChanges:=False

    'This is the area of work that we doing to the data
    ' For purpose of testing:
    wshT.Range("A1").Value = wshT.Range("A1").Value + 1

    ' Now we will export back the modified csv
    wshT.Move '<- Here we have a temporary workbook copy of the modified csv
    With ActiveWorkbook
        .SaveAs Filename:=strFileName, FileFormat:=xlCSVMSDOS, CreateBackup:=False
        .Close False
    End With
End Sub
Run Code Online (Sandbox Code Playgroud)

还有一件事,启用宏的WB现在可以在打开时立即关闭,因此很难编辑或修改(尽管有解决方法).因此,您应该保存它的备份副本,而不是Application.Quit作为测试/维护副本.只有为批处理作业而放入生产中的副本才应具有该Application.Quit语句.


Com*_*ern 7

根据答案中的评论,打开文件的原因并立即保存,没有其他更改...

所以我们需要做我们正在做的事情来改变文件编辑日期而不是实际文件.

......这是一个完整的 X-Y问题.如果您需要更改文件的修改时间,只需更改文件的修改时间,而不是跳过所有打开和重新保存的箍:

Sub UpdateFileModifiedDate()
    Const filePath = "W:\Webshare\Documents Acquired in 2017\Jim Excel\snr-room-schedule.csv"

    Dim handle As Integer
    handle = FreeFile
    Open filePath For Binary As #handle
    'Read the first byte.
    Dim first As Byte
    Get #handle, 1, first
    'Write it back
    Put #handle, 1, first
    Close #handle
End Sub
Run Code Online (Sandbox Code Playgroud)

这将比您当前的流程快得多,只会将文件修改日期和时间设置为您运行的时间Sub,并且不会冒任何可能遇到的通过Excel循环CSV文件的任何其他问题(日期格式)和区域设置问题,截断小数,转换为指数表示法等,等等.


use*_*756 5

因为你要有意识地覆盖现有文件,你可以:

  • 首先用Kill命令删除它

  • 然后去做 SaveAs

所以更改此代码部分:

'This is the area of work that we doing to the data
'Through here

Application.DisplayAlerts = False 'IT WORKS TO DISABLE ALERT PROMPT

ActiveWorkbook.SaveAs Filename:= _
    "W:\Webshare\Documents Acquired in 2017\Jim Excel\snr-room-schedule.csv", FileFormat _
    :=xlCSVMSDOS, CreateBackup:=False

Application.DisplayAlerts = True 'RESETS DISPLAY ALERTS
Application.Quit
Run Code Online (Sandbox Code Playgroud)

对此:

'This is the area of work that we doing to the data
'Through here

Kill strFileName '<-- delete the old file

ActiveWorkbook.SaveAs Filename:= _
    "W:\Webshare\Documents Acquired in 2017\Jim Excel\snr-room-schedule.csv", FileFormat _
    :=xlCSVMSDOS, CreateBackup:=False
Application.Quit
Run Code Online (Sandbox Code Playgroud)

此外,您的代码可以通过正确处理ActiveWorkbookActiveSheet对象来重构,并减少变量和代码量,如下所示:

Sub fixfile()
    Const strFileName = "W:\Webshare\Documents Acquired in 2017\Jim Excel\snr-room-schedule.csv"

    Workbooks.Open(Filename:=strFileName).Worksheets(1).UsedRange.Copy Destination:=Worksheets.Add(After:=Worksheets(Worksheets.Count)).Range("A1") '<--| open 'strFileName', reference and copy its 1st worksheet 'UsedRange' and paste it to a newly added worksheet in the macro workbook. After this statement we're left with the opened workbook as `ActiveWorkbook`
    ActiveWorkbook.Close SaveChanges:=False '<--| close `ActiveWorkbook`, i.e. the just opened one. We're left with macro workbook as `ActiveWorkbook` and its newly created worksheet as `ActiveSheet`

    'This is the area of work that we doing to the data
    'Through here

    ActiveSheet.Move '<--| move `ActiveSheet` (i.e. the newly created sheet in macro workbook) to a "new" workbook having that sheet as its only one. We're left with this "new" workbook as `ActiveWorkbook`
    Kill strFileName '<--| delete the "old" 'strFileName'
    ActiveWorkbook.SaveAs Filename:=strFileName, FileFormat:=xlCSVMSDOS, CreateBackup:=False '<--| save `ActiveWorkbook` (i.e the "new" one) as the new 'strFileName' file
    ActiveWorkbook.Close SaveChanges:=False '<--| close `ActiveWorkbook` (i.e the "new" one) without changes (we just "SavedA"s it)
    Application.Quit     
End Sub
Run Code Online (Sandbox Code Playgroud)


J. *_*rth 3

您似乎正在更改两个文件。除了您正在打开的 csv 文件之外,您似乎还向运行 VBA 代码的 excel 文件添加了一个工作表,其中包含以下几行:

Dim wshT As Worksheet
Set wshT = Worksheets.Add(After:=Worksheets(Worksheets.Count))
Run Code Online (Sandbox Code Playgroud)

所以我的猜测是,您确实抑制了 csv 文件的保存提示,但当您尝试关闭 Excel 工作簿时,您也会收到对 Excel 工作簿所做的更改的保存提示。因此,我认为您还需要通过关闭 CloseAndSave 子项中的 DisplayAlerts 或实际关闭 Excel 工作簿的任何位置来抑制该提示。

  • 猜测不错,我还想指出,如果您不彻底处理激活,则从具有 ActiveWorkbook 引用的某个文件指向可能会导致问题。如果您想更加确定指向正确的工作簿,我建议您还考虑将 Workbooks 对象绑定到变​​量并将它们用作指针以避免任何额外的问题。 (2认同)