use*_*084 15 csv excel vba prompt excel-vba
我查看了这个主题并找到了一些帮助,但这些建议似乎没有起作用.
这是我在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语句.
根据答案中的评论,打开文件的原因并立即保存,没有其他更改...
所以我们需要做我们正在做的事情来改变文件编辑日期而不是实际文件.
......这是一个完整的 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文件的任何其他问题(日期格式)和区域设置问题,截断小数,转换为指数表示法等,等等.
因为你要有意识地覆盖现有文件,你可以:
首先用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)
此外,您的代码可以通过正确处理ActiveWorkbook和ActiveSheet对象来重构,并减少变量和代码量,如下所示:
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)
您似乎正在更改两个文件。除了您正在打开的 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 工作簿的任何位置来抑制该提示。
| 归档时间: |
|
| 查看次数: |
3283 次 |
| 最近记录: |