2017-02-11 2 views
0

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

Однако CSV-файл не имеет согласованного формата и есть столбцы, которые меняют свое местоположение (например, столбец «IBAN» иногда является столбцом № 2, иногда нет 5) или вообще не существует, что приводит к сбою моего макроса.

Что мне нужно, это какой-то код, который сначала работал бы с .csv, проверьте .csv для столбца «IBAN» и импортируйте его после проверки, так что всегда будет иметь место столбец no. 1, и мой макрос обработает колонку №. 1 без проблем.

Любые идеи?

+0

Я собирался предложить в поисках имен, чтобы определить число столбцов, но это, вероятно, лучше решить с помощью ADO для чтения файла CSV с помощью SQL 'SELECT' заявление - что, как вы могли бы иметь последовательные данные собираются в согласованные столбцы. – YowE3K

+0

YowE3K У вас есть какие-либо ресурсы, как это сделать с помощью ADO? Что касается исходного сообщения, я бы рекомендовал рассмотреть возможность использования метода .Range.Find() для поиска данных столбцов и последующего хранения этих столбцов в диапазонах. Я вижу, могу ли я немного добавить пример. –

+0

@BrandonBarney - Я мог бы создать пример, но мне будет легче сделать, когда я получу работу завтра. (Мы используем SQL для чтения CSV-файлов много на работе, но мне очень редко приходится делать то же самое дома - мой банк даже не помещает заголовки столбцов в свои CSV-файлы!) – YowE3K

ответ

1

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

Public Function GetColumnRange(ByVal sSearch As String, r As Object, rSearchArea As Range) 
If Not rSearchArea.Find(sSearch, , , xlWhole) Is Nothing Then 
    Set r = rSearchArea.Find(sSearch, , , xlWhole) 
    r.Select 
    GetColumnRange = True 
End If 

End Function Public Sub CSV_Reformat() Dim ББ As Workbook Dim WS Как Worksheet

Dim arrArgs() As Variant 

Dim cColl As Collection 

Dim rHolder As Object 

Set cColl = New Collection 
arrArgs() = Array("IBAN", "Arg2", "Arg3") 

' Use the code you have to load the .CSV file and to open it 
' Assumes that wb is set to the .CSV file 
' Assumes ws is the first sheet in the .CSV file 

Set wb = ActiveWorkbook ' Replace this with your actual .CSV file 
Set ws = wb.Sheets(1) 

For i = LBound(arrArgs()) To UBound(arrArgs()) 
    If GetColumnRange(arrArgs(i), rHolder, ws.UsedRange) = True Then 
     cColl.Add rHolder 
    End If 
Next 

For i = 1 To cColl.Count 
    Set rHolder = cColl(i) 

    ' Do whatever you need to do with the range here 
    ' For example, you could get the column number: 

    Debug.Print rHolder.Column 
Next 

End Sub 

Я бы также рекомендовал рассмотреть возможность использования массива для этого, если ваш CSV-файл больше. Вы можете загрузить массив при помощи:

Dim arrData() as Variant 
Dim i as Long, Dim j as Long 
Dim lOutput as Long 
Dim bool as Boolean 

' Assumes, as before, that ws is the worksheet we are working in 

arrData() = ws.UsedRange.Value 

Вы можете создать новый массив для вывода чего-то вроде этого:

Dim arrOut() as Variant 

redim arrOut(0 to Ubound(arrData()) - 1, 0 to i) 

' Reduce it by one row since we are creating a zero based array. i is the 
' number of columns you want in the output. 

' Then loop over the data array and put the right columns into your output 

For i = 1 to Ubound(arrData(), 2) ' Loop through the headers in your data 
    bool = True 
    Select Case arrData(1, i) 
     Case "IBAN" 
      lOutput = 0 ' Allows you to determine where the data will be put in your array 
     Case "Arg2" 
      lOutput = 1 
     Case "Arg3" 
      lOutput = 2 
     Case Else 
      bool = False 
    End Select 

    If bool = True Then 
     For j = 1 to Ubound(arrData(), 1) 
      arrOut(j - 1, lOutput) = arrData(j, i) 
     Next 
    End If 
Next 

Это должно позволить вам выбрать определенные данные из файла CSV, и нагрузки это в массив. Затем вы можете вывести свои данные на диапазон по мере необходимости. Например

With wsOutput 
    Set r = .Range("A1").Resize(Ubound(arrOut(), 1) + 1, Ubound(arrOut(), 2) + 1) 
    r.Value = arrOut() 
End With 
0

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

Sub SQL_Extract() 
    Dim objConnection   As Object 
    Dim objRecordset   As Object 
    Dim CSVFilename    As String 
    Dim CSVFilepath    As String 

    CSVFilename = "myCSVFile.csv"   ' Change to name of your CSV file 
    CSVFilepath = "C:\Temp\DownloadFolder\" ' Change to location of CSV file 

    ' Set up connections & dataset objects 
    Set objConnection = CreateObject("ADODB.Connection") 
    Set objRecordset = CreateObject("ADODB.Recordset")  
    objConnection.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" & _ 
            "Data Source=" & CSVFilepath & ";" & _ 
            "Extended Properties=""text;HDR=YES;FMT=CSVDelimited"";" 
    objConnection.Open 

    'Create the SQL command to retrieve information 
    'The following assumes that the CSV file contains columns with headings of 
    ' "IBAN", "Transaction Date" and "Amount". (Any other columns in the file 
    ' will be ignored.) 
    sqlCommand = "SELECT [IBAN], " & _ 
       "  [Transaction Date], " & _ 
       "  [Amount] " & _ 
       "FROM [" & CSVFilename & "]" 
    'Execute the query 
    objRecordset.Open sqlCommand, objConnection, 3, 3, 1 

    If Not objRecordset.EOF Then ' Check whether any records were created by the query 
     ' Write out the results of the query 
     ' Change "A2" to top left cell of area where you want results written 
     Range("A2").CopyFromRecordset objRecordset 
    End If 

    objRecordset.Close 
    objConnection.Close 
End Sub 
Смежные вопросы