2017-02-11 41 views
14

我看了這個話題,發現一些幫助,但建議似乎沒有工作。抑制「另存爲」提示

  • 我打開一個CSV文件到EXCEL中進行一些更改,然後想要將結果保存回相同的文件名和CSV格式。
  • 我想在沒有提示的情況下執行此操作,以確保我要保存該文件。
  • 我們正在使用啓用宏的excel文件導入數據進行更改並保存。
  • 整個過程由一個批處理文件啓動,該文件將在常規時間段打開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 
+0

使用'Application.DisplayAlerts = FALSE'前後.Save和'Application.DisplayAlerts = TRUE'。 –

+0

VBA皮特 - >我其實在代碼中有這兩個語句。 False語句是第10行代碼,True語句是第12行代碼。圍繞SaveAs語句。 我試着圍繞Subroutines的CloseandSave和BeforeClose這兩個(一次一個)保存,但是這添加了關於該文件已存在的提示。我真的不希望任何提示發生在所有。我知道我正在寫現有的文件,所以沒關係。這是一個問題,因爲我試圖保存爲CSV格式。它需要是那種格式。感謝您的幫助。 – user1968084

+0

您的結束小組缺少promt(不確定是否使用它)。另外,將'FileFormat:= xlCSVMSDOS'更改爲'FileFormat:= xlCSV'。 –

回答

3

好像你正在改變兩個文件。此外,您打開CSV文件,你似乎是增加紙張到與這些線路上運行VBA代碼的Excel文件:

Dim wshT As Worksheet 
Set wshT = Worksheets.Add(After:=Worksheets(Worksheets.Count)) 

所以我的猜測是,你確實抑制保存提示輸入csv文件,但是當您試圖關閉它時,您也會收到對Excel工作簿所做更改的保存提示。所以我認爲你還需要關閉該提示,同時關閉CloseAndSave子項中的DisplayAlerts,或者在Excel工作簿實際關閉的地方。

+2

不錯的猜測,我也想指出,從ActiveWorkbook引用某個文件指向可能會導致問題,如果你不徹底處理激活。如果你想額外確定你正在指向正確的工作簿,我建議你也考慮將Workbooks對象綁定到變​​量,並將它們用作指針來避免任何額外的問題。 –

11

代碼中的問題歸結於以下原因。

當你調用上啓用宏的工作簿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 

還有一件事,在啓用宏-WB現在是這樣,它一旦關閉,因爲它打開,因此將很難編輯或修改(雖然也有變通辦法)。因此,您應該保存其備份副本,作爲測試/維護副本而不包含Application.Quit。只有您爲批處理作業而投入生產的副本應具有Application.Quit聲明。

+0

現在看來您只想將CSV文件的日期更改爲當前日期/時間,因此不需要或VBA來執行此操作。您可以在您的腳本中簡單地[touch](http://superuser.com/a/764721)CSV文件... –

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 

這樣:

'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 

而且你的代碼可以通過適當處理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 
+1

OP沒有詢問如何編寫僅佔用3行的混淆代碼。他和大多數其他人正在試圖理解這個問題。我沒有看到重構,結合多個步驟和擺脫所有變量的幫助。我不會信任ActiveSheet/ActiveworkBook與10英尺的杆。 – Profex

+0

@Profex,你似乎錯過了我的答案的第一部分,它解決了OP的問題,解釋了必要的細節。那些願意理解問題的人應該閱讀並發表評論,以便爲此問題增加有用的知識。儘管「重構」部分被保留在最後,所以它可能被認爲是有用的或者可能不是有用的,但我認爲沒什麼值得指責的。這種「結合多個步驟」和「擺脫所有可變幫助」的問題可以被認爲對讀者的VBA知識的實際水平有害或有用。 – user3598756

6

根據答案中的評論,打開文件的原因並立即保存,沒有其他更改。 。

因此,我們需要做的我們在做什麼,以獲取該文件的編輯日期 變化,但不是實際的文件。

...這是一個完整X-Y problem。如果您需要更改文件的修改時間,只是改變的,而不是通過所有的打開和重新保存箍跳躍文件的修改時間:

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 

這將是瘋狂的速度比你目前的過程中,將只設置該文件修改日期和時間到您運行Sub的時間,並且不會冒任何其他可通過Excel循環掃描CSV文件的問題(日期格式和區域設置問題,小數點截斷,轉換爲指數表示法,等等)。

+0

這是XY,但我們都認爲該工作表中有計算的東西。我甚至想知道爲什麼要使用VBA,批處理作業可以簡單地[touch](http://superuser.com/a/764721)CSV文件... –

2
  1. 我不明白你爲什麼要複製到啓用宏的工作簿中的新工作表的CSV表單。 這是你的問題開始的地方!

    • 你應該只被用在數據處理wshS和保存wbkS代替。
      完成,沒有更多的問題。
  2. 當你調用

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

    重命名啓用了文件在Excel的CSV當前宏文件儘可能Excel可以看到它

  3. Application.Quit被調用時,它會調用

    Private Sub Workbook_BeforeClose(Cancel As Boolean) 
        ThisWorkbook.Save 
    End Sub 
    

    這是哪裏,你都在抱怨提示正在發生的事情。

    • 即使你刪除它,Workbook_BeforeClose被調用後,Excel中仍然要檢查所有打開的文件.Saved標誌。
    • Excel中將提示您保存任何文件,其中.Saved = False

但是,如果你設置ThisWorkbook.Saved = True然後Excel中將關閉文件,而不要求進行保存。

解決方案:

Private Sub Workbook_BeforeClose(Cancel As Boolean) 
    ThisWorkbook.Saved = True 
End Sub