Vba открыть файл csv в excel по столбцам

 

LightZ

Пользователь

Сообщений: 1748
Регистрация: 22.12.2012

Всем привет.  
Подскажите, пожалуйста, как корректно с разделителями открыть с помощью VBA текстовый файл формата .csv?  
Если открывать (двойным щелчком по файлу) Экселем — открывается нормально, с нужными разделителями, а если открывать нижеуказанным макросом — открывается криво, всё «на кучу».  
Архив прилагаю. Заранее спасибо.  

  Макрос для открытия:  

  Sub test()  
   Sheets(1).Cells.ClearContents  

         Application.ScreenUpdating = False  
   Dim wbCsv As String: wbCsv = ThisWorkbook.Path & «original bd.csv»  
   Workbooks.OpenText Filename:=wbCsv, otherchar:=»;»  
   With ActiveWorkbook  
       .ActiveSheet.UsedRange.Copy ThisWorkbook.Sheets(1).[a1].Cells
       .Close (True)  
   End With  
   Application.ScreenUpdating = True  
End Sub

Киса, я хочу Вас спросить, как художник — художника: Вы рисовать умеете?

 

LightZ

Пользователь

Сообщений: 1748
Регистрация: 22.12.2012

Спасибо!

Киса, я хочу Вас спросить, как художник — художника: Вы рисовать умеете?

 

LightZ

Пользователь

Сообщений: 1748
Регистрация: 22.12.2012

К сожалению, не совсем так работает как хотелось бы.  
1. Был файл csv с разделителем «;», а после выполнение макроса уменьшился размер (в два раза) и разделитель стал «,».  
2. Первые строки вставил на лист корректно, остальные скопировались с ненужными символами (<h2>,<p> и т.д.)  

  Можно как-то решить?

Киса, я хочу Вас спросить, как художник — художника: Вы рисовать умеете?

 

LightZ

Пользователь

Сообщений: 1748
Регистрация: 22.12.2012

По первому пункту разобрался: оставил только часть кода, т.е. к своему добавил True    
Workbooks.Open wbCsv, True  

  А вот с этими символами  (<h2>,<p> и т.д.) — проблема.

Киса, я хочу Вас спросить, как художник — художника: Вы рисовать умеете?

 

LightZ

Пользователь

Сообщений: 1748
Регистрация: 22.12.2012

Сорри, ошибся, по первому пункту проблема актуальна.  

  Ps. Ув. Модераторы, удалите, пожалуйста, мои лишние сообщения.  
Спасибо.

Киса, я хочу Вас спросить, как художник — художника: Вы рисовать умеете?

 

Юрий М

Модератор

Сообщений: 60575
Регистрация: 14.09.2012

Контакты см. в профиле

Я не знаю какие лишние. Время подскажите.

 

egonomist

Пользователь

Сообщений: 409
Регистрация: 21.12.2012

для csv надо сделать запись макроса, импортировать из текста.  
Для вашего файла  
Sub scv2()  
   Range(«A1»).Select  
   s = ThisWorkbook.Path & «original bd.csv»  
   With ActiveSheet.QueryTables.Add(Connection:= _  
       «TEXT;» + s + «», _  
       Destination:=Range(«$A$1»))  
       .Name = «original bd»  
       .FieldNames = True  
       .RowNumbers = False  
       .FillAdjacentFormulas = False  
       .PreserveFormatting = True  
       .RefreshOnFileOpen = False  
       .RefreshStyle = xlInsertDeleteCells  
       .SavePassword = False  
       .SaveData = True  
       .AdjustColumnWidth = True  
       .RefreshPeriod = 0  
       .TextFilePromptOnRefresh = False  
       .TextFilePlatform = 1251  
       .TextFileStartRow = 1  
       .TextFileParseType = xlDelimited  
       .TextFileTextQualifier = xlTextQualifierDoubleQuote  
       .TextFileConsecutiveDelimiter = False  
       .TextFileTabDelimiter = False  
       .TextFileSemicolonDelimiter = True  
       .TextFileCommaDelimiter = False  
       .TextFileSpaceDelimiter = False  
       .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)  
       .TextFileTrailingMinusNumbers = True  
       .Refresh BackgroundQuery:=False  
   End With  

  End Sub

 

LightZ

Пользователь

Сообщений: 1748
Регистрация: 22.12.2012

Спасибо, но импорт я уже пробовал, так же появляются ненужные знаки.  
Может кто-то подскажет как от них избавится?

Киса, я хочу Вас спросить, как художник — художника: Вы рисовать умеете?

 

Hugo

Пользователь

Сообщений: 23251
Регистрация: 22.12.2012

Что за знаки?  
Где появляются?

 

Юрий М

Модератор

Сообщений: 60575
Регистрация: 14.09.2012

Контакты см. в профиле

 

LightZ

Пользователь

Сообщений: 1748
Регистрация: 22.12.2012

Если открыть файл original bd.csv Экселем — данные выстраиваются по столбцам (к примеру столбец K «описание»), а если сделать текстовый импорт или скопировать — столбец K съезжает в столбец A.

Киса, я хочу Вас спросить, как художник — художника: Вы рисовать умеете?

 

LightZ

Пользователь

Сообщений: 1748
Регистрация: 22.12.2012

Это происходит из-за того, что в ячейках столбца K находится текст с символами альт+энтер  
Кто знает как обойти?

Киса, я хочу Вас спросить, как художник — художника: Вы рисовать умеете?

 

LightZ

Пользователь

Сообщений: 1748
Регистрация: 22.12.2012

VBA воспринимает альт+энтер как разделитель и перекидывает текст в столбец А.  
Можно это прописать в коде?

Киса, я хочу Вас спросить, как художник — художника: Вы рисовать умеете?

 

Hugo

Пользователь

Сообщений: 23251
Регистрация: 22.12.2012

Можно так пойти:  

    Sub tt()  
Set objFSO = CreateObject(«Scripting.FileSystemObject»)  
Set objFile = objFSO.OpenTextFile(«c:TempLightoriginal bd.csv», 1)  
strText = objFile.ReadAll  
a = Split(strText, vbCr)  
End Sub  

  Далее перебираем массив a и бьём по «;», раскладываем по ячейкам.

 

nerv

Пользователь

Сообщений: 3071
Регистрация: 22.12.2012

 

Hugo

Пользователь

Сообщений: 23251
Регистрация: 22.12.2012

Sub tt()  
   Dim objFSO As Object, objFile As Object, a, i&  
   Set objFSO = CreateObject(«Scripting.FileSystemObject»)  
   Set objFile = objFSO.OpenTextFile(ThisWorkbook.Path & «original bd.csv», 1)  
   strText = objFile.ReadAll  
   a = Split(strText, vbCr)  
   For i = 0 To UBound(a) — 1  
       Cells(i + 1, 1).Resize(1, 50) = Split(a(i), «;»)  
   Next  
End Sub  

  Там в    
»  
TOY9874″  
ещё есть перевод строки — может нужно ещё подшаманить…

 

Hugo

Пользователь

Сообщений: 23251
Регистрация: 22.12.2012

nerv, спасибо :)  

  a = Split(strText, vbCrLf)

 
 

LightZ

Пользователь

Сообщений: 1748
Регистрация: 22.12.2012

в 2010 не прокатило… сейчас попробую переделать  
хорошая конечно идея с помощью СендКейс, но как мне кажется — что через жо..

Киса, я хочу Вас спросить, как художник — художника: Вы рисовать умеете?

 

LightZ

Пользователь

Сообщений: 1748
Регистрация: 22.12.2012

в варианте Hugo съехал текст столбцов влево

Киса, я хочу Вас спросить, как художник — художника: Вы рисовать умеете?

 

ratboy

Пользователь

Сообщений: 138
Регистрация: 01.01.1970

То может я не так задачу понимаю, но у меня вот так получилось. Запускать load_d

 

LightZ

Пользователь

Сообщений: 1748
Регистрация: 22.12.2012

Спасибо, вроде бы всё супер.

Киса, я хочу Вас спросить, как художник — художника: Вы рисовать умеете?

 

LightZ

Пользователь

Сообщений: 1748
Регистрация: 22.12.2012

А нет… рано написал.  
Почему-то разделилось название столбца С и пошел сдвиг вправо

Киса, я хочу Вас спросить, как художник — художника: Вы рисовать умеете?

 

ratboy

Пользователь

Сообщений: 138
Регистрация: 01.01.1970

ну это, наверное от того, что точка с запятой разделитель…  
Артикул;Наименование;»ID страницы (часть URL; используется в ссылках на эту страницу)»;CommerceML-идентификатор;

 

nerv

Пользователь

Сообщений: 3071
Регистрация: 22.12.2012

Богдан, какой ты привередливый : )

 

На работе у меня XL2002  
Пришёл домой и загрустил: горячие клавиши, действительно, не срабатывают в XL2007 на открытие файла  
Жаль. Чёртик внутри, который подбрасывает чертовски простые решения — в этот раз твоя взяла

 

‘В проекте должна быть ссылка на библиотеку Microsoft Forms 2.0  
Sub ОткрытьCSV_()  
   Dim Dr As Integer, S As String, DO_ As DataObject  

         ‘Чтение файла в строку S  
   Dr = FreeFile ‘свободный дескриптор файла  
   Open ThisWorkbook.Path & «» & «original bd.csv» For Binary As Dr  
   S = VBA.Space(LOF(Dr))  
   Get Dr, , S  
   Close Dr  

         ‘Теперь возможны любые варианты переноса строки на лист _  
   Самый очевидный — через массив  

               ‘******* от Шапокляка  

         ‘Строка >> текстовый буфер  
   Set DO_ = New DataObject  
   DO_.Clear  
   DO_.SetText Replace(S, «;», vbTab) ‘возможность разнесения по столбцам  
   DO_.PutInClipboard  

     ‘Перенос на лист новой книги  
   Workbooks.Add  
   ActiveSheet.Paste  
   Cells(1).Select  

         ‘Очистка буфера  
   DO_.Clear  
End Sub

 

Юрий М

Модератор

Сообщений: 60575
Регистрация: 14.09.2012

Контакты см. в профиле

Вопросик:  
Set DO_ = New DataObject  
DO_.Clear  
Новый объект не пустой?

 

Точно!  
Cтроку «…Clear» удалить нельзя оставить

 

v__step

Гость

#30

29.04.2012 15:50:13

Тогда можно немножко упростить  

  ‘В проекте должна быть ссылка на библиотеку Microsoft Forms 2.0  
Sub ОткрытьCSV1()  
   Dim Dr As Integer, S As String  

     ‘Чтение файла в строку S  
   Dr = FreeFile    ‘свободный дескриптор файла  
   Open ThisWorkbook.Path & «» & «original bd.csv» For Binary As Dr  
   S = VBA.Space(LOF(Dr))  
   Get Dr, , S  
   Close Dr  

     ‘Теперь возможны любые варианты переноса строки на лист _  
    Самый очевидный — через массив (S >> Split >> v() >> Range())  

       ‘******* от Шапокляка  

     ‘Строка >> буфер  
   With New DataObject  
       .SetText Replace(S, «;», vbTab)    ‘возможность разнесения по столбцам  
       .PutInClipboard  
   End With  
   ‘Перенос на лист новой книги  
   Workbooks.Add  
   ActiveSheet.Paste  
   Cells(1).Select  
End Sub

Здравствуйте!
Полагаю мой вопрос больше подходит в эту тему по содержанию.

Кто-нибудь сталкивался с вопросом зяпатой в качестве разделителя на столбцы при сохранении .xls в .csv?
Поясню. У меня есть эксель файлы которые мы редактируюем и сохраняем в формате csv, который понятен для промышленного оборудования. Теперь я хочу делать редатирование и сохранение кодом. При сохраниении .xls в .csv кодом пояляется нежелательный разделитель столбцов — запятая. Промышленное оборудование не понимает такое разделение столбцов.
Вот так выглядит первая строка в CSV-файле, открытым в эксель, сохраненный вручную: ImportASCII
Вот так выглядит первая строка в CSV-файле, открытым в эксель, сохраненный кодом: Import,ASCII,,,,,,,,,,,,,,,

Можно ли добавить какой-то параметр в строчку сохранения, чтобы избежать появления запятых?
.SaveAs Filename:=MyFileName, FileFormat:=xlCSV, CreateBackup:=False

Любопытно, что если октрыть CSV файлы в OpenOffice, то оба (сохраненный вручную и кодом) читаются нормально и при сохранении и последующем открытии в Excel запятые исчезают.

Выложил на всякий случай файл с кодом. Кто-нибудь знает как обойти такую проблему.

wondering if you can help out with a VBA issue. I pieced together the following without really knowing what I was doing:

Sub Import_Raw_Stripe_data()

    Dim fileDialog As fileDialog
    Dim strPathFile As String
    Dim strFileName As String
    Dim strPath As String
    Dim dialogTitle As String
    Dim Tworkbook As Workbook
    Dim Sworkbook As Workbook


dialogueTitle = "Select File to Import"
Set fileDialogue = Application.fileDialog(msoFileDialogFilePicker)
With fileDialogue
    .InitialFileName = "L:Downloads"
    .AllowMultiSelect = False
    .Filters.Clear
    .Title = dialogueTitle

    If .Show = False Then
        MsgBox "No file selected."
        Exit Sub
    End If
    strPathFile = .SelectedItems(1)
End With

Set Sworkbook = Workbooks.Open(fileName:=strPathFile)
Set Tworkbook = ThisWorkbook



End Sub

Which, as far as I can tell opens a file dialog in excel, allows a user to choose a document and then opens it.

What I would like to do is the following:

1) Open a file dialogue and select a .csv file to import data from (complete?) into a .xlsm master file (with multiple sheets).

2) Select certain columns from the .csv (column A, Q, R and S in this case), copy them and import them into the second sheet of the master excel file entitled «Raw Stripe Data».

Any help in the matter would be greatly appreciated.

Update: I managed to find the following code:

Sub load_csv()
    Dim fStr As String

    With Application.fileDialog(msoFileDialogFilePicker)
        .Show
        If .SelectedItems.Count = 0 Then
            MsgBox "Cancel Selected"
            Exit Sub
        End If
        'fStr is the file path and name of the file you selected.
        fStr = .SelectedItems(1)
    End With

    With ThisWorkbook.Sheets("Stripe Raw Data").QueryTables.Add(Connection:= _
    "TEXT;" & fStr, Destination:=ThisWorkbook.Sheets("Stripe Raw Data").Range("$A$1"))
        .Name = "CAPTURE"
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .TextFilePromptOnRefresh = False
        .TextFilePlatform = 437
        .TextFileStartRow = 1
        .TextFileParseType = xlDelimited
        .TextFileTextQualifier = xlTextQualifierDoubleQuote
        .TextFileConsecutiveDelimiter = False
        .TextFileTabDelimiter = True
        .TextFileSemicolonDelimiter = False
        .TextFileCommaDelimiter = True
        .TextFileSpaceDelimiter = False
        .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
        .TextFileTrailingMinusNumbers = True
        .Refresh BackgroundQuery:=False
        ActiveWorkbook.Save



    End With

End Sub

This works great — but is there anyway to have it not override the data already imported? (for example, if i use it twice, the second import overrides the first).

Уважаемое сообщество, доброго времени суток.

Опять недостаток знаний вынудил меня обратиться к вам за советом. Итак, в чём суть проблемы:

Имеется файл формата csv, данные из которого подлежат дальнейшему анализу в Excel. Этот файл открывается автоматически, когда запускается соответствующий макрос и вроде бы всё работает дальше, но писал я код открытия и конвертации данного файла только с помощью уже имеющихся у меня знаний. И вот, ожидаемо, вчера обнаружил, что не все данные отображаются корректно. Во вложении 2 файла: *.xlsm (в котором и находится та часть кода, которую я «наваял») и файл *.сsv (для примера).
Заранее прошу не смеяться над моим «решением» данной задачи, и прошу подсказать, как это нужно делать корректно.

P.S. Я день потратил на чтение разнообразных ответов на данный вопрос на разных форумах и в интернете, но, к сожалению, так и не решил эту задачу.
Заранее спасибо.

Функция TextFile2Array предназначена для преобразования файла CSV в двумерный массив

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

Чтобы упростить весь процесс — от выбора файла CSV в диалоговом окне, до разбиения загруженного из файла текста в двумерный массив, и была написана эта функция.

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

Пример использования функции для загрузки данных из файла CSV:

Sub ЗагрузкаДанныхИзCSV()
    ' выбор файла по умолчанию предлагается в той же папке,
    ' где расположен текущий файл Excel
    CSVarr = TextFile2Array(, ThisWorkbook.Path, , "*.csv")
 
    ' проверка результата загрузки данных (выход из макроса, если данные не загружены)
    If Not IsArray(CSVarr) Then MsgBox "Файл CSV не обработан", vbCritical, "Ошибка": Exit Sub
 
    ' ваш код обработки двумерного массива
    Debug.Print "Загружен двумерный массив размерами " & _
                UBound(CSVarr, 1) & " строк на " & UBound(CSVarr, 2) & " столбцов"
End Sub

Результат в окне Immediate:

Загружен двумерный массив размерами 1244 строк на 9 столбцов

Код функции TextFile2Array:

Function TextFile2Array(Optional ByVal Title As String = "Выберите файл для обработки", _
                        Optional ByVal InitialPath As String = "c:", _
                        Optional ByVal FilterDescription As String = "Текстовые файлы", _
                        Optional ByVal FilterExtention As String = "*.*", _
                        Optional ByVal ColumnsSeparator$ = ";", _
                        Optional ByVal RowsSeparator$ = vbNewLine) As Variant
    ' Функция запрашивает имя файла (текстового, CSV, и т.п.), и обрабатывает его содержимое
    ' В качестве параметров можно задать  разделители строк и столбцов для разбиваемой строки
    ' Возвращает двумерный массив - результат преобразования текстового файла в двумерный массив

    On Error Resume Next
    With Application.FileDialog(msoFileDialogOpen)    ' диалоговое окно выбора файла CSV
        .ButtonName = "Выбрать": .Title = Title: .InitialFileName = InitialPath
        .Filters.Clear: .Filters.Add FilterDescription, FilterExtention
        If .Show <> -1 Then Exit Function
        Filename$ = .SelectedItems(1)
    End With
 
    Set fso = CreateObject("scripting.filesystemobject")    ' читаем текст из выбранного файла
    Set ts = fso.OpenTextFile(Filename$, 1, True): txt$ = ts.ReadAll: ts.Close
    Set ts = Nothing: Set fso = Nothing
 
    txt = Trim(txt): Err.Clear    ' разделяем текст на строки и столбцы
    If txt Like "*" & RowsSeparator$ Then txt = Left(txt, Len(txt) - Len(RowsSeparator$))
 
    tmpArr1 = Split(txt, RowsSeparator$): RowsCount = UBound(tmpArr1) + 1
    ColumnsCount = UBound(Split(tmpArr1(0), ColumnsSeparator$)) + 1
 
    If Err.Number > 0 Then MsgBox "Строка не может быть разбита на двумерный массив", vbCritical: End
    ReDim arr(1 To RowsCount, 1 To ColumnsCount)
 
    For i = LBound(tmpArr1) To UBound(tmpArr1)
        tmpArr2 = Split(Trim(tmpArr1(i)), ColumnsSeparator$)
        For j = 1 To UBound(tmpArr2)+1
            arr(i + 1, j) = tmpArr2(j - 1)
        Next j
    Next i
    TextFile2Array = arr    ' возвращаем результат в виде двумерного массива
End Function

Ещё одна функция, — без вывода диалогового окна выбора файла

Function LoadArrayFromTextFile(ByVal filename$, Optional ByVal FirstRow& = 1, _
                               Optional ByVal ColumnsSeparator$ = ";", Optional ByVal RowsSeparator$ = vbNewLine) As Variant
    ' Функция открывает текстовый (CSV) файл filename$,
    ' и загружает макссив данных, начиная со строки FirstRow&
    ' В качестве параметров можно задать  разделители строк и столбцов для разбиваемой строки
    ' Возвращает двумерный массив - результат преобразования текстового файла в двумерный массив

    On Error Resume Next
    Set FSO = CreateObject("scripting.filesystemobject")        ' читаем текст из выбранного файла
    Set ts = FSO.OpenTextFile(filename$, 1, True): txt$ = ts.ReadAll: ts.Close
    Set ts = Nothing: Set FSO = Nothing
 
    txt = Trim(txt): Err.Clear        ' разделяем текст на строки и столбцы
    If txt Like "*" & RowsSeparator$ Then txt = Left(txt, Len(txt) - Len(RowsSeparator$))
 
    If FirstRow& > 1 Then        ' обрезаем ненужные строки
        txt = Split(txt, RowsSeparator$, FirstRow&)(FirstRow& - 1)
    End If
 
    Err.Clear: tmpArr1 = Split(txt, RowsSeparator$): RowsCount = UBound(tmpArr1) + 1
    ColumnsCount = UBound(Split(tmpArr1(0), ColumnsSeparator$)) + 1
 
    If Err.Number > 0 Then MsgBox "Текст файла " & Dir(filename$, vbNormal) & _
     " не может быть считан в двумерный массив", vbCritical: Exit Function
    ReDim arr(1 To RowsCount, 1 To ColumnsCount)
 
    For i = LBound(tmpArr1) To UBound(tmpArr1)
        tmpArr2 = Split(Trim(tmpArr1(i)), ColumnsSeparator$)
        For j = 1 To UBound(tmpArr2) + 1
            arr(i + 1, j) = tmpArr2(j - 1)
        Next j
    Next i
    LoadArrayFromTextFile = arr        ' возвращаем результат в виде двумерного массива
End Function

Понравилась статья? Поделить с друзьями:
  • Vba открыть книгу excel невидимо
  • Vba открыть документ word по имени
  • Vba определить координаты ячейки excel
  • Vba определить другой excel
  • Vba объединить документы word в один