Vba 压制;另存为;促使
我查找了这个主题,并找到了一些帮助,但这些建议似乎不起作用Vba 压制;另存为;促使,vba,excel,csv,prompt,Vba,Excel,Csv,Prompt,我查找了这个主题,并找到了一些帮助,但这些建议似乎不起作用 我正在将CSV文件打开到EXCEL中进行一些更改,然后希望将结果保存回相同的文件名和CSV格式 我想这样做,而不需要得到确保保存文件的提示 我们正在使用启用宏的excel文件导入数据,进行更改,然后保存 整个过程由一个批处理文件启动,该批处理文件将定期打开Excel应用程序和指定文件,因此我们不希望提示停止该过程 下面是我在VBA中用来做这项工作的代码,以及我发现的其他子代码,它们被认为可以帮助我抑制提示 此代码位于文件的工作簿中,
- 我正在将CSV文件打开到EXCEL中进行一些更改,然后希望将结果保存回相同的文件名和CSV格式李>
- 我想这样做,而不需要得到确保保存文件的提示李>
- 我们正在使用启用宏的excel文件导入数据,进行更改,然后保存李>
- 整个过程由一个批处理文件启动,该批处理文件将定期打开Excel应用程序和指定文件,因此我们不希望提示停止该过程
看起来您正在对两个文件进行更改。除了要打开的csv文件外,您似乎正在向excel文件中添加一张工作表,该文件正在运行VBA代码,其中包含以下行:
Dim wshT As Worksheet
Set wshT = Worksheets.Add(After:=Worksheets(Worksheets.Count))
因此,我的猜测是,您确实在抑制csv文件的保存提示,但在尝试关闭excel工作簿时,您也会收到对其所做更改的保存提示。因此,我认为您还需要关闭CloseAndSave子菜单中的DisplayAlerts(显示警报)或excel工作簿实际关闭的位置来抑制该提示。代码中的问题是由于以下原因造成的 在启用宏的工作簿上调用
SaveAs
时,您已经向其追加了一个工作表:
Set wshT=Worksheets.Add(之后:=Worksheets(Worksheets.Count))
然后您试图将其保存为csv,这是一个只有一个工作表的文本文件,因此Excel抱怨您会丢失信息
此外,您要对csv进行两次更新:在
ActiveWorkbook.SaveAs文件名:=…
其中,当前工作簿将成为保存的工作簿,然后在关闭之前再次在工作簿中。在后者中,您不会禁用警报,但无论如何,无需再次保存
我得出的结论是,您想要的是将启用宏的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
”此工作簿的代码模块
选项显式
私有子工作簿_Open()
Application.DisplayAlerts=False
Application.ScreenUpdating=False
固定文件
'仅当希望启用宏的WB保持
'CSV工作表的副本。但我的感觉是你不想
'此工作簿。是否保存
'''''''''''''''''''''
申请,退出
端接头
子fixCSVFile()
Const strFileName=“W:\Webshare\2017年获得的文档\Jim Excel\snr room schedule.csv”
将WBK作为工作簿、wshS作为工作表、wshT作为工作表
设置wshT=Worksheets.Add(之后:=Worksheets(Worksheets.Count))
设置wbkS=Workbooks.Open(文件名:=strFileName)
设置wshS=wbkS.工作表(1)
wshS.UsedRange.Copy目标:=wshT.Range(“A1”)
wbkS.Close SaveChanges:=False
“这是我们对数据所做的工作领域
“为了测试的目的:
wshT.Range(“A1”).Value=wshT.Range(“A1”).Value+1
'现在我们将导出修改后的csv
wshT.Move'由于要有意识地覆盖现有文件,您可以:
- 首先用
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
为此:
'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
根据答案中的评论,打开文件并立即保存而不做其他更改的原因
因此,我们需要做我们正在做的事情,以使文件编辑日期
更改但不更改实际文件
…这是一个完整的。如果需要更改文件的修改时间,只需更改文件的修改时间,而不是跳过所有打开和重新保存的步骤:
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
这将比您当前的进程快得多,只会将文件修改日期和时间设置为您运行子
的时间,并且不会出现您在Excel中循环使用CSV文件时可能遇到的任何其他问题(日期格式和区域设置问题、截断小数、转换为指数表示法等)
我不明白为什么要将CSV工作表复制到启用宏的工作簿中的新工作表中这就是问题的起点强>
- 您应该只处理
wshS
中的数据,然后保存wbkS
。
完成了,没有问题了
当你打电话的时候
您正在将excel中当前启用宏的文件重命名为excel所看到的CSV文件
调用Application.Quit
时,它将调用
这就是您正在抱怨的提示发生的地方。
- 即使将其删除,在调用
工作簿\u BeforeClose
后,Excel仍将检查所有打开的文件的.Saved
标志李>
- Excel将提示您保存
.Saved=False
但是,如果您将ThisWorkbook.Saved设置为True,则Excel将关闭该文件而不要求保存
解决方案:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
ThisWorkbook.Saved = True
End Sub
在之前使用Application.DisplayAlerts=False
。保存并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
ActiveWorkbook.SaveAs Filename:= _
"W:\Webshare\Documents Acquired in 2017\Jim Excel\snr-room-schedule.csv",
FileFormat:=xlCSVMSDOS, CreateBackup:=False`
Private Sub Workbook_BeforeClose(Cancel As Boolean)
ThisWorkbook.Save
End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
ThisWorkbook.Saved = True
End Sub