Я пытаюсь написать функцию, которая преобразует файл 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
Я ценю любую помощь. Заранее спасибо.
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
Извините, должно быть xlApp.ActiveWorkbook
- тестировал прямо в Excel, там объект Application указывать не нужно. К сожалению, OpenText
не является функцией, поэтому вам необходимо использовать активную книгу после открытия файла CSV (он становится активным автоматически). Исправил код. И нет, как я уже писал, не создавайте Add
новую книгу — просто откройте файл CSV.
ах, ок... моя "xlOpenXMLWorkbook" пуста... могу ли я использовать там константу?
Только что увидел, что вы используете позднее связывание. В этом случае константы не определены. Да, либо переключитесь на раннее связывание (я бы порекомендовал это), либо вместо этого используйте цифры. xlOpenXMLWorkbook
= 51, xlDelimited
= 1 и xlGeneral
= 1
Пожалуйста, попробуйте этот способ:
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... какое это постоянное значение?
о, я вижу.. это 1
@Kingsley Obeng адаптировал приведенный выше код. Я проверил это в Excel и забыл использовать постоянное значение... А пока я вижу, что вы это обнаружили... :)
последнее замечание, так как это всего лишь мелочь, но она стоит мне времени... На самом деле у меня есть разделитель точка с запятой, поэтому я использую точку с запятой:=True и пытаюсь пропустить первые 12 строк, но обе проблемы не являются работает хорошо... Когда я выполняю CSV для Excel вручную, он делает это без каких-либо ошибок...
@Kingsley Ты тоже должен сохранить DataType:=
. И, конечно же, только один разделитель True
. Точка с запятой в таком случае. Это должно работать.... Если он не сохраняет желаемый формат (по столбцам), как я уже сказал, необходимо использовать другой аргумент (InfoField
). Для определенных символов (кроме ANSI) также необходимо использовать Origin
.
Почему бы не открыть CSV напрямую, например.
Set wb = xlApp.Workbooks.Open(strCSVPath)
?