Требования:
Ежедневно импортировать файл CSV
Файл CSV не имеет заголовков
Исключить все записи, помеченные как YES
в номере поля12 из файла CSV
Значения в поле 12: YES
и Null
(т. Е. Пусто)
Добавить отфильтрованные данные CSV в существующий лист с именем Report
Новыйданные должны быть размещены в конце существующих данных, начиная со столбца 2
. column В столбце 1 новые данные должны иметь дату, когда данные были импортированы.
Решение:
Это решение использует операторы ADODB.Connection
, ADODB.RecordSet
и SQL
для фильтрации данных и добавления поля Date
(в первой позиции)с датой обработки.
Да, мы все много раз слышали о мифе о том, что для подключения ADODB требуются заголовки ... Не совсем!
Давайте используем следующие свойства Connection
:
.Provider = "Microsoft.Jet.OLEDB.4.0"
.ConnectionString = "Data Source=" & sPath & ";" & _
"Extended Properties='text;HDR=No;FMT=Delimited(,)'"`
где:
sPath
: содержит местоположение файла
HDR=No
: указывает на отсутствие заголовка
FMT=Delimited(,)
: указывает на файл CSV
Этот SQL command
извлекает необходимыеданные при добавлении поля Date
:
"SELECT #" & Date & "# As [DATE], * FROM [" & sFile & "] Where [F12] Is Null"
Эта функция создает recordset
с данными, извлеченными из файла CSV согласно предоставленному SQL statement
.
Имеет recordset
(выходной объект), path
, filename
и SQL statement
в качестве параметров для обеспечения гибкости.
Возвращает логическое значение, указывающее результат процесса.True
: записи, соответствующие SQL command
, были найдены и извлечены, False
: нет записей, соответствующих SQL command
.
Public Function SQL_ƒCsv_ToRecordSet(oOutput As Object, _
sPath As String, sFile As String, sSql As String) As Boolean
Dim oAdCn As Object, oAdRs As Object
Rem Set Objects
Set oAdCn = CreateObject("ADODB.Connection")
Set oAdRs = CreateObject("ADODB.Recordset")
Rem Open Connection
With oAdCn
.Provider = "Microsoft.Jet.OLEDB.4.0"
.ConnectionString = "Data Source=" & sPath & ";" & _
"Extended Properties='text;HDR=No;FMT=Delimited(,)'"
.Open
End With
Rem Apply SQL to Source
With oAdRs
.LockType = 1 'adLockReadOnly
.CursorType = 3 'adOpenStatic
.ActiveConnection = oAdCn
.Open Source:=sSql, Options:=1 'adCmdText
Rem Validate Results
If .RecordCount = 0 Then Exit Function
End With
Rem Set Results
Set oOutput = oAdRs
SQL_ƒCsv_ToRecordSet = True
End Function
Используйте эту процедуру для вызова функции:
Private Sub Csv_Import()
Dim oAdRs As Object, ws As Worksheet
Dim sPath As String, sFile As String, sSql As String
Dim lRow As Long, sMsgBdy As String
Rem Set Variables & Objects
sFile = "FMSQRY.CSV"
sPath = "N:\Operations\001 Daily Management\Shop Goods" 'No separator at the end!
sSql = "SELECT #" & Date & "# As [DATE], * FROM [" & sFile & "] Where [F12] Is Null" 'Update as required
Set ws = ThisWorkbook.Worksheets("Report") 'Update as required
Rem Extract filtered data from csv file
If SQL_ƒCsv_ToRecordSet(oAdRs, sPath, sFile, sSql) Then
Rem Post extracted records (with the date of extraction in Field 1)
With ws
lRow = 1 + .Cells(.Rows.Count, 3).End(xlUp).Row
.Cells(lRow, 1).CopyFromRecordset oAdRs
End With
sMsgBdy = "Records added successfully…"
Else
Rem No Records Filtered
sMsgBdy = "No records found in: " & vbCrLf _
& vbTab & sFile & vbCrLf _
& vbTab & sPath
End If
MsgBox sMsgBdy, vbInformation
End Sub