Как сохранить CSV файл, разделенный точкой с запятой, используя VBA?

Я копирую данные в электронную таблицу, использую VBA для ее форматирования, затем сохраняю этот лист в файл CSV.

Я использую следующий код:

ws.SaveAs Filename:=filestr, Fileformat:=xlCSV

ws - это лист, который я сохранил.

Это дает мне CSV файл с разделителями-запятыми.

Я хотел бы сохранить этот лист в файл, разделенный точкой с запятой.

Я нашел следующее:

  1. Выберите "Пуск"> "Настройки"> "Язык и региональные стандарты".
  2. Нажмите на кнопку Настроить
  3. Рядом с разделителем списка введите точку с запятой (;)

Я следовал вышеописанной процедуре и изменил свой код на:

ws.SaveAs Filename:=filestr, Fileformat:=xlCSV, Local:=True

Я все еще получаю CSV файл с разделителями-запятыми в качестве вывода.

Я использую Excel 2003, и моя ОС - Windows XP.

Ответ 1

Я только что проверил это, потому что имел ту же проблему. В этом случае имя файла не имеет функциональности.

Это то, что сработало для меня:

With ActiveWorkbook
    .SaveAs Filename:="My File.csv", FileFormat:=xlCSV, Local:=True
    .Close False
End With

В региональных настройках → ; < - как разделитель списка. Также важно не сохранять изменения при закрытии → с помощью Close, вы должны использовать False.

Ответ 2

Не нужно объявлять все эти переменные, просто добавьте local: = true в конце вашего метода SaveAs, например:

ActiveWorkbook.SaveAs Filename:="C:/Path/TryMe.csv", FileFormat:=xlCSV, Local:=True

Ответ 3

Просто используйте этот код: ActiveWorkbook.SaveAs "My File.csv", xlCSV, Local: = True

(не использовать: Filename: =)

Ответ 4

Чтобы использовать vbs script следующую конструкцию succeded:

.SaveAs Filename, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1

где аргументы:

Object Filename,
Object FileFormat,
Object Password,
Object WriteResPassword,
Object ReadOnlyRecommended,
Object CreateBackup,
XlSaveAsAccessMode AccessMode,
Object ConflictResolution,
Object AddToMru,
Object TextCodepage,
Object TextVisualLayout,
Object Local

SourceLink: https://msdn.microsoft.com/ru-ru/library/microsoft.office.tools.excel.workbook.saveas.aspx

Последний "1" в "SaveAs" равен Local = True

Кроме того, точка с запятой должна быть определена как разделитель списка в региональных настройках ОС (см. ответы выше)

Ответ 5

Использовать xlSCVMSDOS instread xlCSV

ActiveWorkbook.SaveAs Filename:="my File.csv", FileFormat:= xlCSVMSDOS, Local:=True

У меня сработало

Ответ 6

Я столкнулся с той же проблемой и, подумав о попытке изменить "разделитель строк" в региональных настройках с использованием кода VBA и вызовов ядра, решил, что это будет намного сложнее, поэтому вместо этого я нашел несколько примеров использования Scripting.FileSystemObject. вместо этого, чтобы удовлетворить мои потребности.

Следующий код возьмет существующий CSV файл и заменит все запятые символом тильды "~".

Private Sub commaReplace()

    Dim objFSO
    Dim filePath
    Dim migratorFileName
    Dim strFullPath1
    Dim strFullPath2
    Const ForReading = 1
    'define a TextStream object
    Dim objTS
    Dim strContents As String

    'note, my code actually uses the below commented out filepath
    'as the location of the workbook can be arbitrary, e.g.
    'Worksheets("FilePath").[A2:A2].Value is determined when workbook
    'is opened
    'filePath = Worksheets("FilePath").[A2:A2].Value
    filePath = "C:\Temp\"

    'our original file that we've exported as csv file in another section of code
    migratorFileName = "MigratorInput.csv"
    strFullPath1 = filePath + migratorFileName

    'the path and file name we want to save to, tilde separated vs. comma
    migratorFileName = "MigratorInput.tilde.csv"
    strFullPath2 = filePath + migratorFileName

    'read everything from the csv file, replacing comma with tilde
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objTS = objFSO.OpenTextFile(strFullPath1, ForReading)
    strContents = objTS.ReadAll
    strContents = Replace(strContents, ",", "~")
    objTS.Close

    'write everything out to another file, note, this could just overwrite
    'the original file if you pass the optional overwrite flag
    Set objTS = objFSO.CreateTextFile(strFullPath2)
    objTS.Write strContents
    objTS.Close

End Sub

Затем вы можете просто вызвать подпрограмму commaReplace из подпрограммы, которая создает файл csv.

Надеюсь, это поможет кому-то!