2015-06-15 4 views
0

У CSV (текстовые файлы с разделителями-запятыми) есть имя листа? Нужно ли указывать диапазон для копирования данных?ADO Connection and Recordset = ""

Мои умения SQL слабы.

Я пытаюсь получить весь текст из моего файла export.csv в рабочий лист, где столбец «Цена» не пуст и сортирует его по «sku».

Я могу открыть файл и построить строку SQL, но должна быть ошибка?

отладчик показывает строку как:

"SELECT * FROM [export$] WHERE price IS NOT NULL ORDER BY sku;" 

Когда я пытаюсь открыть соединение и Recordset отладчика обуви они оба содержат значение «».

Set rsCon = CreateObject("ADODB.Connection") 
Set rsData = CreateObject("ADODB.Recordset") 

Когда я добираюсь до их использования, я иду прямо в свою ловушку ошибок.

rsCon.Open szConnect 
rsData.Open szSQL, rsCon, 0, 1, 1 

Я зову подпрограмму со следующими данными:

GetData "export.csv", "экспорт", "A: AH", "BirdFeet", "В1", "Артикул", True, True

Вот и полная подпрограмма.

Public Sub GetData(SourceFile As Variant, SourceSheet As String, SourceRange As String, _ 
               TargetSheet As String, TargetRange As String, _ 
               TargetSortColumn As String, _ 
               HaveHeader As Boolean, UseHeaderRow As Boolean) 

    Dim lColumn As Long 
     Dim lCount As Long 
     Dim lRow As Long 

     Dim rsCon As Object 
     Dim rsData As Object 

     Dim szConnect As String 
     Dim szSQL As String 

     lRow = Range(TargetRange).Row 
     lColumn = Range(TargetRange).Column 

     ' Create the connection string. 
     If HaveHeader = False Then               'No there is NOT a header row. 
      If Val(Application.Version) < 12 Then 
       szConnect = "Provider=Microsoft.Jet.OLEDB.4.0;" & _ 
          "Data Source=" & SourceFile & ";" & _ 
          "Extended Properties=""Excel 8.0;HDR=No"";" 
      Else 
       szConnect = "Provider=Microsoft.ACE.OLEDB.12.0;" & _ 
          "Data Source=" & SourceFile & ";" & _ 
          "Extended Properties=""Excel 12.0;HDR=No"";" 
      End If 
     Else                    'Yes there is a Header Row 
      If Val(Application.Version) < 12 Then 
       szConnect = "Provider=Microsoft.Jet.OLEDB.4.0;" & _ 
          "Data Source=" & SourceFile & ";" & _ 
          "Extended Properties=""Excel 8.0;HDR=Yes"";" 
      Else 
        If (Right(SourceFile, 4) = ".csv") Then 
         szConnect = "Provider=Microsoft.Jet.OLEDB.4.0;" & _ 
            "Data Source=" & SourceFile & ";" & _ 
            "Extended Properties=""text; HDR=Yes; FMT=Delimited; IMEX=1;""" 
        Else 
         szConnect = "Provider=Microsoft.ACE.OLEDB.12.0;" & _ 
            "Data Source=" & SourceFile & ";" & _ 
            "Extended Properties=""Excel 12.0;HDR=Yes"";" 
        End If 
      End If 
     End If 

     If SourceSheet = "" Then               'Create query strings 

      szSQL = "SELECT * FROM " & SourceRange$ & " ORDER BY sku;" 

     ElseIf SourceSheet = "DiamondAvian" Or SourceSheet = "export" Then 
      szSQL = "SELECT * FROM [" & SourceSheet$ & "$" & "] WHERE price IS NOT NULL ORDER BY " & TargetSortColumn & ";" 'Drops all rows with no Price 

     Else 

      szSQL = "SELECT * FROM [" & SourceSheet$ & "$" & SourceRange$ & "] WHERE sku IS NOT NULL ORDER BY " & TargetSortColumn & ";" 'THIS WORKS FOR DICIONARY 

     End If 

     On Error GoTo SomethingWrong 

     Set rsCon = CreateObject("ADODB.Connection") 
     Set rsData = CreateObject("ADODB.Recordset") 

     rsCon.Open szConnect 
     rsData.Open szSQL, rsCon, 0, 1, 1 
                          ' Check to make sure we received data and copy the data 
     If Not rsData.EOF Then 

      If HaveHeader = False Then 
       Cells(1, 1).CopyFromRecordset rsData 
      Else 
                          'Add the header cell in each column if the last argument is True 
       If UseHeaderRow Then 
        For lCount = 0 To rsData.Fields.Count - 1        'Builds the Header row one column at a time. 
         Cells(lRow, lColumn + lCount).value = rsData.Fields(lCount).Name  'lcount determines the Column to paste header info in. 
        Next lCount 
       Cells(lRow + 1, lColumn).CopyFromRecordset rsData       'This is the step that copies and Pastes the data. 
       Else 
        Cells(lRow + 1, lColumn).CopyFromRecordset rsData 
       End If 
      End If 

     Else 
      MsgBox "No records returned from : " & SourceFile, vbCritical 
     End If 

     rsData.Close                  ' Clean up our Recordset object. 
     Set rsData = Nothing 
     rsCon.Close 
     Set rsCon = Nothing 

     Exit Sub 

SomethingWrong: 

    MsgBox "The file name, Sheet name or Range is invalid of : " & SourceFile, vbExclamation, "Error" 

On Error GoTo 0 

End Sub 

Выборочные данные из export.csv

sku price post_date  post_date_gmt 
B1  - M  4/19/2015 11:15 4/19/2015 15:15 
B8  8.06  4/19/2015 11:11 4/19/2015 15:11 
B1  10.79 4/19/2015 11:08 4/19/2015 15:08 
B2  11.65 4/19/2015 11:08 4/19/2015 15:08 
B3  11.98 4/19/2015 11:08 4/19/2015 15:08 
B3B 12.74 4/19/2015 11:08 4/19/2015 15:08 
B4  16.24 4/19/2015 11:08 4/19/2015 15:08 
SB  770  4/3/2015 12:37 4/3/2015 16:37 

ответ

0

Я не использовал путь к каталогу, в котором хранится файл csv в строке szConnect. Я использовал имя файла, а не путь.

Я добавил строку «strWorkingDir» и установил ее равной директории файлов, и теперь она отлично работает.

https://msdn.microsoft.com/en-us/library/ms974559.aspx

CraigM

1

SQL не поддерживает <> операцию на Null. Заменить

"SELECT * FROM [export$] WHERE price <> NULL ORDER BY sku;" 

с

"SELECT * FROM [export$] WHERE price IS NOT NULL ORDER BY sku;" 

Это аналогичный вопрос мотивировка. link

+0

Я сделал НЕ изменить. ADODB.Connection и ADODB.Recordset остаются с их значениями "", и подпрограмма все еще попадает в ловушку ошибки. – CraigM

Смежные вопросы