Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 压制;另存为;促使_Vba_Excel_Csv_Prompt - Fatal编程技术网

Vba 压制;另存为;促使

Vba 压制;另存为;促使,vba,excel,csv,prompt,Vba,Excel,Csv,Prompt,我查找了这个主题,并找到了一些帮助,但这些建议似乎不起作用 我正在将CSV文件打开到EXCEL中进行一些更改,然后希望将结果保存回相同的文件名和CSV格式 我想这样做,而不需要得到确保保存文件的提示 我们正在使用启用宏的excel文件导入数据,进行更改,然后保存 整个过程由一个批处理文件启动,该批处理文件将定期打开Excel应用程序和指定文件,因此我们不希望提示停止该过程 下面是我在VBA中用来做这项工作的代码,以及我发现的其他子代码,它们被认为可以帮助我抑制提示 此代码位于文件的工作簿中,

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

  • 我正在将CSV文件打开到EXCEL中进行一些更改,然后希望将结果保存回相同的文件名和CSV格式
  • 我想这样做,而不需要得到确保保存文件的提示
  • 我们正在使用启用宏的excel文件导入数据,进行更改,然后保存
  • 整个过程由一个批处理文件启动,该批处理文件将定期打开Excel应用程序和指定文件,因此我们不希望提示停止该过程
下面是我在VBA中用来做这项工作的代码,以及我发现的其他子代码,它们被认为可以帮助我抑制提示

此代码位于文件的工作簿中,而不是模块中

我错过什么了吗

代码


看起来您正在对两个文件进行更改。除了要打开的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