Строка подключения ADODB для .csv - PullRequest
0 голосов
/ 06 сентября 2011

Я хочу обработать CSV-файлы с помощью ADODB в Excel VBA.Я попробовал несколько найденных в сети строк, но ни одна из них, похоже, не работает.Я получаю путь к файлу, используя:

strVFile = Application.GetOpenFilename("CSV (*.csv), *.csv")

И затем я передаю strVFile в качестве параметра в подпункт objReport.Load strVFile.Заголовок подпрограммы: Public Sub Load(ByVal strFilename As String).

Затем я пытаюсь установить соединение ADODB, используя строку:

pconConnection.ConnectionString = _
            "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strFilename & _
            ";Extended Properties=""text;HDR=Yes;FMT=Delimited(;)"";Persist Security Info=False"
    pconConnection.Open

Когда я запускаю макрос и выбираю файл CSV, возникает ошибка, говорячто «данный путь не является допустимым путем».Что я делаю не так?

Редактировать (код) ,

Модуль mdlReport

Public Sub Report()
    Dim objReport As clsReport


    MsgBox "Please select .csv file", vbInformation + vbOKOnly
    strVFile = Application.GetOpenFilename("CSV (*.csv), *.csv")

    If strVFile <> False Then
        Set objReport = New clsReport

        objReport.Load strVFile

    End If
End Sub

Класс clsReport

Private pconConnection As ADODB.Connection
Private prstRecordset As ADODB.Recordset

Private Sub Class_Initialize()
  Set pconConnection = New ADODB.Connection
  pconConnection.ConnectionTimeout = 40
End Sub

Public Sub Load(ByVal strFilename As String)

    pconConnection.ConnectionString = _
            "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strFilename & _
            ";Extended Properties=""text;HDR=Yes;FMT=Delimited(;)"";Persist Security Info=False"
    pconConnection.Open

End Sub

Ответы [ 3 ]

8 голосов
/ 06 сентября 2011

Для текстового файла Data Source - это папка, а не файл.Файл представляет собой таблицу (SELECT * FROM ..).Смотри http://www.connectionstrings.com/textfile

1 голос
/ 06 сентября 2011

Я нашел ответ на мою проблему. Для текстовых файлов (как сказал Рему) Data Source - это просто путь к папке, без имени файла. Кроме того, вместо использования:

C:\dir\dir2\

Я должен был использовать

C:\\dir\\dir2\\

Чтобы получить имя файла из полного пути:

strFilename = Dir(strFilepath)

Чтобы получить только путь без имени файла:

strFilepath = Left$(strFilepath, InStrRev(strFilepath, "\"))

Чтобы изменить формат пути с '\' на '\\', я просто использовал:

strFilepath = Replace(strFilepath, "\", "\\")

Проблема решена, спасибо за интерес.

0 голосов
/ 13 октября 2018

Вот обновление с использованием Microsoft.ACE.OLEDB.16.0 в качестве поставщика.

Убедитесь, что в VBAproject сначала добавлена ​​справочная библиотека «Библиотека объектов данных Microsoft ActiveX 6.1».

Sub testrunSQLQueryForCSV()
    Dim arrayTest
    arrayTest = runSQLQueryForCSV("C:\xxx\yyyy\", "SELECT * FROM mycsvfile.csv")

    'NOTE: for CSV the Data Source reference is to the directory and the csv file is similar
    'to one "worksheet" in an excel file and is simply referenced in the SQL statement
End Sub


Public Function runSQLQueryForCSV(fileDirPath As String, SQLStatement As String)

    Dim Conn As New ADODB.Connection
    Dim RecSet As New ADODB.Recordset

    With Conn
       .Provider = "Microsoft.ACE.OLEDB.16.0"  'Can use many providers, but this is the latest and it works with csv files also
       .ConnectionString = "Data Source=" & fileDirPath & ";Extended Properties='text'"
    End With

    Conn.Open

    RecSet.Open SQLStatement, Conn
    runSQLQueryForCSV = RecSet.GetRows()

    Conn.Close
    Set RecSet = Nothing
    Set Conn = Nothing
End Function
...