Подавить приглашение "Сохранить как"
Я просмотрел эту тему и нашел некоторую помощь, но предложения, похоже, не работают.
- Я открываю 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
Ответы
Ответ 1
Проблемы в вашем коде связаны с следующим.
Когда вы вызываете 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
.
Ответ 2
Основываясь на комментариях в ответах, причина открытия файла и немедленное сохранение его без каких-либо изменений...
Итак, нам нужно было сделать то, что мы делали, чтобы получить дату редактирования файла но не фактический файл.
... это полная проблема 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
Это будет безумно быстрее, чем ваш текущий процесс, установит только дату и время изменения файла до момента запуска Sub
и не будет подвержен никаким другим проблемам, которые могут возникнуть при циклировании CSV файл через Excel (форматы дат и языковые проблемы, усечение десятичных знаков, преобразование в экспоненциальную нотацию и т.д. и т.д.).
Ответ 3
так как вы намеренно переписываете существующий файл, вы можете просто:
измените этот раздел кода:
'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
Кроме того, ваш код может быть реорганизован путем правильной обработки объектов 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
Ответ 4
Кажется, вы вносите изменения в два файла. В дополнение к CSV файлу, который вы открываете, вы добавляете лист в файл excel, который запускает код VBA с этими строками:
Dim wshT As Worksheet
Set wshT = Worksheets.Add(After:=Worksheets(Worksheets.Count))
Итак, я предполагаю, что вы действительно подавляете запрос сохранения для файла csv, но вы также получаете приглашение сохранить изменения, внесенные в книгу Excel, когда вы пытаетесь закрыть ее. Поэтому я думаю, что вам нужно также подавить эту подсказку, отключив DisplayAlerts в SubAndSave или где бы вы не закрыли книгу Excel.
Ответ 5
-
Я не понимаю, почему вы копируете лист CSV в новый лист в книге с поддержкой макросов. Здесь начинается ваша проблема!
- Вы должны просто иметь дело с данными в
wshS
и вместо этого сохранять wbkS
.
Выполнено, больше проблем.
-
Когда вы вызываете
ActiveWorkbook.SaveAs Filename:= _
"W:\Webshare\Documents Acquired in 2017\Jim Excel\snr-room-schedule.csv",
FileFormat:=xlCSVMSDOS, CreateBackup:=False`
вы переименовываете текущий файл с поддержкой макроса в excel в файл CSV , если Excel видит его.
-
Когда вызывается 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