Почему я не могу правильно прочитать данные .csv и как я мог написать код только для выбора определенных столбцов?

#excel #vba #csv

Вопрос:

код считывает все файлы данных csv из того же пути/папки, в которой я сохраняю этот код VBA в отдельном файле .xlsm.

Первый файл формируется довольно хорошо, так что у меня есть 3 чистых столбца. Начав читать второй файл в пределах пути, он начнет считывать все данные в формате .csv

Ты знаешь, почему?

И как можно было бы просто прочитать определенные столбцы из файлов, которые не находятся рядом друг с другом? Например, столбец А и столбец С, например.

Заранее большое вам спасибо

 Sub Zusammenfuegen()
Dim strOrdner As String
Dim lngZeile As Long, lngZeileMax As Long
Dim lngZMax As Long, lngZeileFrei As Long
Dim wkbQuelle As Workbook
Dim objLST As ListObject

Application.ScreenUpdating = False

Tabelle4.UsedRange.Clear
'Tabelle4.Range("A1:C1").Value = Array("Datum", "Umsatz", "Region")
lngZeileFrei = 1
strOrdner = ThisWorkbook.Path

With Tabelle1
 
 lngZeileMax = .Cells(.Rows.Count, 1).End(xlUp).Row
 
 For lngZeile = 2 To lngZeileMax
 
   Workbooks.OpenText strOrdner amp; "" amp; .Cells(lngZeile, 1).Value, Semicolon:=True, local:=True
   Set wkbQuelle = ActiveWorkbook
   .Cells(lngZeile, 2).Value = "eingelesen am " amp; Now
   
   With wkbQuelle.Worksheets(1)
    
    lngZMax = .Cells(.Rows.Count, 1).End(xlUp).Row
    lngZeileFrei = Tabelle4.Cells(Tabelle4.Rows.Count, 1).End(xlUp).Row   1
    .Range(.Cells(2, 1), .Cells(lngZMax, 3)).Copy _
    Destination:=Tabelle4.Cells(lngZeileFrei, 1)
    
   End With
   wkbQuelle.Close savechanges:=False
   
 Next lngZeile

End With

With Tabelle4
 Set objLST = .ListObjects.Add(SourceType:=xlSrcRange, _
  Source:=.Range("A1").CurrentRegion, _
  xlListObjectHasHeaders:=xlYes)
 objLST.Name = "MeinListObject"
End With

Application.ScreenUpdating = True

End Sub
 

Комментарии:

1. Используйте текстовый редактор, такой как notepad , чтобы сравнить первый и второй файлы на предмет любых различий в символе разделителя, кавычках, конце строки и т.д. Поступают ли csv-файлы от пользователей с различными локальными настройками ?

2. @CDP1802 спасибо. Данные .csv не возникают из одного и того же источника SAP. Единственным пользователем, который сгенерировал все эти файлы, был я, так что на самом деле разницы быть не может.

3. Хорошо, что вы на самом деле подразумеваете под «считыванием всех данных в формате .csv» , вы имеете в виду, что вся строка считывается в один столбец ? Являются ли 3-й, 4-й , 5-й и т.д. файлы читаются неправильно, а также 2-й ?

4. да, это файл .csv, но я не знаю, почему

5. да точно так, как вы описали его в одном столбце…в каждой строке

Ответ №1:

Код выглядит хорошо, и если есть какие-либо проблемы, проверьте, хорошо ли отформатирован csv.

Что касается конкретных столбцов: вместо того, чтобы принимать все данные

 '.Range(.Cells(2, 1), .Cells(lngZMax, 3)).Copy _
'Destination:=Tabelle4.Cells(lngZeileFrei, 1)
 

установите необходимый диапазон с именованными столбцами, как показано ниже

 .Range("A2:A" amp; lngZMax amp; ",C2:C" amp; lngZMax amp; ",D2:D" amp; lngZMax).Copy _
Destination:=Tabelle4.Cells(lngZeileFrei, 1)
 

Например, если исходный csv содержит 4 столбца A B C D с 20 строками, где первая строка и второй столбец B должны быть пропущены, то диапазон функций VBA должен выглядеть следующим образом

 Range("A2:A20,C2:D20") or Range("A2:A20,C2:C20,D2:D20")
 

Комментарии:

1. Спасибо! К сожалению, это csv file…is вы знаете, что все csv-файлы можно переписать в .xlsx с помощью кода?

2. и спасибо за идею в отношении колонок, отлично работает ! Огромное спасибо.

3. что касается «переписать все csv — файлы в .xlsx с помощью кода» — вы уже открыли csv как Excel, используя метод workbooks.opentext() docs.microsoft.com/de-de/office/vba/api/… Проблема в том, что если csv неверен, то вы не сможете правильно прочитать его как Excel. Поделитесь обоими csv, если вы не можете найти проблему.