Почему VBA ActiveWorkbook.SaveAs меняет открытую электронную таблицу? - PullRequest
6 голосов
/ 30 марта 2011

Моя функция выглядит следующим образом:

Sub saveCSV()
    Application.DisplayAlerts = False
    ActiveWorkbook.SaveAs Filename:= _
    "c:\temp\file.csv", FileFormat:=xlCSV _
    , CreateBackup:=False
End Sub

Я пытаюсь экспортировать активный лист в CSV. Когда я запускаю код в заголовке, Book1.xlsm изменяется на file.csv, а Sheet1 изменяется на файл. Экспорт работает нормально. Как я могу сделать экспорт без этих нежелательных побочных эффектов?

Ответы [ 2 ]

6 голосов
/ 30 марта 2011

Так всегда работал SaveAs.Единственный способ обойти это - скопировать лист и сделать SaveAs на копии, а затем закрыть ее.

РЕДАКТИРОВАТЬ: Я должен добавить пример, поскольку это не так сложно сделать,Вот быстрый пример, который копирует ActiveSheet в новую рабочую книгу.

Dim wbk As Workbook
Set wbk = Workbooks.Add
ActiveSheet.Copy wbk.Sheets(1) ' Copy activesheet before the first sheet of wbk
wbk.SaveAs ....
wbk.Close

Сложная рабочая книга может вызвать проблемы со ссылками и макросами, но в обычных сценариях это безопасно.

РЕДАКТИРОВАТЬ 2: Я знаю, что вы пытаетесь сделать, так как ваш другой вопрос был о попытке запуска экспорта при каждом изменении листа.Этот подход к копированию, представленный здесь, вероятно, будет очень разрушительным.

Я предлагаю написать CSV-файл вручную, чтобы минимизировать прерывания графического интерфейса.Лист может стать непригодным для использования, если сохранение происходит с высокой частотой.Я бы не стал винить в этом дверь Excel, просто она не была создана для быстрого сохранения за кулисами.

0 голосов
/ 30 марта 2011

Вот небольшая процедура, которая делает то, что вы хотите, работая с копией оригинальной ... копии, сделанной с помощью объекта сценариев файла.Жестко запрограммированный для работы с «ThisWorkbook», в отличие от активной рабочей книги и предполагает суффикс «.xlsm» - можно настроить это, чтобы выполнить работу, я думаю:

Public Sub SaveCopyAsCsv()

Dim sThisFile As String: sThisFile = ThisWorkbook.FullName
Dim sCsvFile As String:  sTempFile = Replace(sThisFile, ".xlsm", "_TEMP.xlsm")

ThisWorkbook.Save ' save the current workbook

' copy the saved workbook ABC.xlsm to TEMP_ABC.xlsm
Dim fso As Object: Set fso = CreateObject("Scripting.FileSystemObject")
On Error Resume Next
Call fso.deletefile(sTempFile, True)  ' deletes prev temp file if it exists
On Error GoTo 0
Call fso.CopyFile(sThisFile, sTempFile, True)

' open the temp file & save as CSV
Dim wbTemp As Workbook
Set wbTemp = Workbooks.Open(sTempFile) ' open the temp file in excel
' your prev code to save as CSV
Application.DisplayAlerts = False
ActiveWorkbook.SaveAs FileName:="c:\temp\file.csv", FileFormat:=xlCSV,     CreateBackup:=False
wbTemp.Close ' close the temp file now that the copy has been made
Application.DisplayAlerts = True

' delete the temp file (if you want)
On Error Resume Next
Call fso.deletefile(sTempFile, True)  ' deletes the temp file
On Error GoTo 0

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...