Преобразование файлов csv в Excel через VBA

Я пытаюсь написать функцию, которая преобразует файл CSV в файл Excel. Я использую Access 2021, и моя проблема связана со строкой с Opentextfile, как показано здесь:

Private Sub CreateExcel(strCSVPath As String, strXLSXSpath As String)
    Dim xlApp As Object
    Dim wb As Object

    Set xlApp = CreateObject("Excel.Application")
    xlApp.Visible = False

    Set wb = xlApp.Workbooks.Add

    With wb.Worksheets(1)
        .Opentext strCSVPath, xlTextimportdelimited, Comma:=True
        .Range("A1").CurrentRegion.TexttoColumns  Destination:=.Range("A1"), dataType:=xlGeneral
    End With

    wb.SaveAs strXLSXSpath, FileFormat:=xlopenXMLWorkbook
    wb.Close Savechanges:=False
    xlApp.Quit Savechanges:=False

    Set wb = Nothing
    Set xlApp = Nothing
End Sub

Я ценю любую помощь. Заранее спасибо.

Почему бы не открыть CSV напрямую, например. Set wb = xlApp.Workbooks.Open(strCSVPath)?

Kostas K. 24.06.2024 12:50
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
0
1
65
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

OpenText — это метод Workbooks-Коллекции объекта Excel.Application. Другими словами: вы открываете файл CSV в новой книге.

Ваш код создает пустую книгу, а затем пытается вызвать метод OpenText первого листа этой вновь созданной книги. Однако на листе такого метода нет, поэтому возникает ошибка («Объект не поддерживает...»).

Не создавайте новую книгу. Вместо этого используйте

xlApp.Workbooks.OpenText strCSVPath, xlDelimited, Comma:=True, DataType:=xlGeneral
Set wb = xlApp.ActiveWorkbook
wb.SaveAs strXLSXSpath, FileFormat:=xlOpenXMLWorkbook

Обратите внимание, что xlTextimportdelimited не существует, он должен быть xlDelimited. Чтобы избежать таких ошибок, всегда используйте Option Explicit.

«Set wb = Ativeworkbook» не сработало, поэтому я предположил, что вы имеете в виду «Set wb = xlApp.Workbooks.Add», но затем я получаю ошибку 1005 в вашей строке: wb.SaveAs strXLSXSpath, FileFormat:=xlOpenXMLWorkbook

Kingsley Obeng 24.06.2024 13:34

Извините, должно быть xlApp.ActiveWorkbook - тестировал прямо в Excel, там объект Application указывать не нужно. К сожалению, OpenText не является функцией, поэтому вам необходимо использовать активную книгу после открытия файла CSV (он становится активным автоматически). Исправил код. И нет, как я уже писал, не создавайте Add новую книгу — просто откройте файл CSV.

FunThomas 24.06.2024 13:38

ах, ок... моя "xlOpenXMLWorkbook" пуста... могу ли я использовать там константу?

Kingsley Obeng 24.06.2024 13:41

Только что увидел, что вы используете позднее связывание. В этом случае константы не определены. Да, либо переключитесь на раннее связывание (я бы порекомендовал это), либо вместо этого используйте цифры. xlOpenXMLWorkbook = 51, xlDelimited = 1 и xlGeneral = 1

FunThomas 24.06.2024 13:45
Ответ принят как подходящий

Пожалуйста, попробуйте этот способ:

Private Sub CreateExcelSess(strCSVPath As String, strXLSXSpath As String)
 Dim wb As Object

 With CreateObject("Excel.Application") 'False visibility is default
    .Workbooks.OpenText fileName:=strCSVPath, startRow:=1, DataType:=1, Comma:=True
    Set wb = .ActiveWorkbook
    wb.saveas fileName:=strXLSXSpath, FileFormat:=51 '(xlWorkbookDefault, xlOpenXMLWorkbook)
    wb.Close False
    .Quit
 End With
End Sub

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

Я тоже попробовал ваш, но мой VBA не распознает xldelimited... какое это постоянное значение?

Kingsley Obeng 24.06.2024 13:50

о, я вижу.. это 1

Kingsley Obeng 24.06.2024 13:52

@Kingsley Obeng адаптировал приведенный выше код. Я проверил это в Excel и забыл использовать постоянное значение... А пока я вижу, что вы это обнаружили... :)

FaneDuru 24.06.2024 14:00

последнее замечание, так как это всего лишь мелочь, но она стоит мне времени... На самом деле у меня есть разделитель точка с запятой, поэтому я использую точку с запятой:=True и пытаюсь пропустить первые 12 строк, но обе проблемы не являются работает хорошо... Когда я выполняю CSV для Excel вручную, он делает это без каких-либо ошибок...

Kingsley Obeng 24.06.2024 14:32

@Kingsley Ты тоже должен сохранить DataType:=. И, конечно же, только один разделитель True. Точка с запятой в таком случае. Это должно работать.... Если он не сохраняет желаемый формат (по столбцам), как я уже сказал, необходимо использовать другой аргумент (InfoField). Для определенных символов (кроме ANSI) также необходимо использовать Origin.

FaneDuru 24.06.2024 15:23

Другие вопросы по теме