Excel: макрос для экспорта рабочей таблицы в виде файла CSV без оставления моего текущего листа Excel

Здесь много вопросов, чтобы создать макрос, чтобы сохранить рабочий лист в виде файла CSV. Все ответы используют SaveAs, например этот от SuperUser. Они в основном говорят, чтобы создать функцию VBA следующим образом:

Sub SaveAsCSV()
    ActiveWorkbook.SaveAs FileFormat:=clCSV, CreateBackup:=False
End Sub

Это отличный ответ, но я хочу сделать экспорт вместо Save As. Когда SaveAs выполняется, это вызывает у меня две неприятности:

  • Мой текущий рабочий файл становится CSV файлом. Я хотел бы продолжить работу в моем исходном файле .xlsm, но экспортировать содержимое текущего листа в файл CSV с тем же именем.
  • Появится диалоговое окно с просьбой подтвердить, что я хотел бы переписать CSV файл.

Можно ли просто экспортировать текущий рабочий лист в виде файла, но продолжить работу в моем исходном файле?

Ответ 1

Почти то, что я хотел @Ralph. У вашего кода есть некоторые проблемы:

  1. он экспортирует только жесткий код с именем "Sheet1";
  2. он всегда экспортируется в тот же файл temp, перезаписывая его;
  3. он игнорирует символ разделения локали.

Чтобы решить эти проблемы и выполнить все мои требования, я адаптировал код здесь. Я немного почистил его, чтобы сделать его более читаемым.

Option Explicit
Sub ExportAsCSV()

    Dim MyFileName As String
    Dim CurrentWB As Workbook, TempWB As Workbook

    Set CurrentWB = ActiveWorkbook
    ActiveWorkbook.ActiveSheet.UsedRange.Copy

    Set TempWB = Application.Workbooks.Add(1)
    With TempWB.Sheets(1).Range("A1")
      .PasteSpecial xlPasteValues
      .PasteSpecial xlPasteFormats
    End With        

    Dim Change below to "- 4"  to become compatible with .xls files
    MyFileName = CurrentWB.Path & "\" & Left(CurrentWB.Name, Len(CurrentWB.Name) - 5) & ".csv"

    Application.DisplayAlerts = False
    TempWB.SaveAs Filename:=MyFileName, FileFormat:=xlCSV, CreateBackup:=False, Local:=True
    TempWB.Close SaveChanges:=False
    Application.DisplayAlerts = True
End Sub

Есть еще кое-что с кодом выше, который вы должны заметить:

  1. .Close и DisplayAlerts=True должна быть в объявлении finally, но я не знаю, как это сделать в VBA
  2. Он работает, только если текущее имя файла имеет 4 буквы, например.xlsm. Не работал бы в файлах excel.xls. Для расширений файлов из 3 символов вы должны изменить значение - 5 на - 4 при установке MyFileName.
  3. В качестве побочного эффекта ваш буфер обмена будет заменен текущим содержимым листа.

Edit: put Local:=True для сохранения с моим разделителем CSV в локали.

Ответ 2

@NathanClement был немного быстрее. Тем не менее, вот полный код (немного более сложный):

Option Explicit

Public Sub ExportWorksheetAndSaveAsCSV()

Dim wbkExport As Workbook
Dim shtToExport As Worksheet

Set shtToExport = ThisWorkbook.Worksheets("Sheet1")     'Sheet to export as CSV
Set wbkExport = Application.Workbooks.Add
shtToExport.Copy Before:=wbkExport.Worksheets(wbkExport.Worksheets.Count)
Application.DisplayAlerts = False                       'Possibly overwrite without asking
wbkExport.SaveAs Filename:="C:\tmp\test.csv", FileFormat:=xlCSV
Application.DisplayAlerts = True
wbkExport.Close SaveChanges:=False

End Sub

Ответ 3

В соответствии с моим комментарием в сообщении @neves я немного улучшил это, добавив xlPasteFormats, а также часть значений, поэтому даты проходят как даты - я в основном сохраняю CSV для банковских выписок, поэтому нужны даты.

Sub ExportAsCSV()

    Dim MyFileName As String
    Dim CurrentWB As Workbook, TempWB As Workbook

    Set CurrentWB = ActiveWorkbook
    ActiveWorkbook.ActiveSheet.UsedRange.Copy

    Set TempWB = Application.Workbooks.Add(1)
    With TempWB.Sheets(1).Range("A1")
        .PasteSpecial xlPasteValues
        .PasteSpecial xlPasteFormats
    End With

    'Dim Change below to "- 4"  to become compatible with .xls files
    MyFileName = CurrentWB.Path & "\" & Left(CurrentWB.Name, Len(CurrentWB.Name) - 5) & ".csv"

    Application.DisplayAlerts = False
    TempWB.SaveAs Filename:=MyFileName, FileFormat:=xlCSV, CreateBackup:=False, Local:=True
    TempWB.Close SaveChanges:=False
    Application.DisplayAlerts = True
End Sub

Ответ 4

Как я уже отмечал, на этом сайте есть несколько мест, которые записывают содержимое листа в CSV. Этот и этот, чтобы указать только два.

Ниже моя версия

  • он явно ищет "," внутри ячейки
  • Он также использует UsedRange - потому что вы хотите получить все содержимое на листе
  • Использует массив для циклизации, поскольку это быстрее, чем цикл через ячейки листа
  • Я не использовал FSO-процедуры, но это вариант

Код...

Sub makeCSV(theSheet As Worksheet)
Dim iFile As Long, myPath As String
Dim myArr() As Variant, outStr As String
Dim iLoop As Long, jLoop As Long

myPath = Application.ActiveWorkbook.Path
iFile = FreeFile
Open myPath & "\myCSV.csv" For Output Lock Write As #iFile

myArr = theSheet.UsedRange
For iLoop = LBound(myArr, 1) To UBound(myArr, 1)
    outStr = ""
    For jLoop = LBound(myArr, 2) To UBound(myArr, 2) - 1
        If InStr(1, myArr(iLoop, jLoop), ",") Then
            outStr = outStr & """" & myArr(iLoop, jLoop) & """" & ","
        Else
            outStr = outStr & myArr(iLoop, jLoop) & ","
        End If
    Next jLoop
    If InStr(1, myArr(iLoop, jLoop), ",") Then
        outStr = outStr & """" & myArr(iLoop, UBound(myArr, 2)) & """"
    Else
        outStr = outStr & myArr(iLoop, UBound(myArr, 2))
    End If
    Print #iFile, outStr
Next iLoop

Close iFile
Erase myArr

End Sub