Есть ли способ использовать поставщик OLE DB для Jet в несохраненной книге Excel?

Я работаю с поставщиком Microsoft OLE DB для Jet для выполнения запросов к электронным таблицам в Excel с использованием VBA. Есть ли способ выполнить следующий код в несохраненной книге?

Например, ActiveWorkbook.FullName возвращает «Книга1», если книга никогда не сохранялась. В этом случае источник данных будет считать, что путь является активным каталогом, и выдаст ошибку, поскольку файл никогда не сохранялся.

Есть ли способ использовать временный файл Excel в качестве источника данных для Jet? Я хотел бы проверить это, но я даже не знаю, как вернуть путь и имя для временного файла Excel.

Public Sub LocalJetQuery()

    Dim objStartingRange As Range
    Dim objConnection As New ADODB.Connection
    Dim objRecordset As New ADODB.Recordset

    Dim strDSN As String
    Dim strSQL As String

    Set objStartingRange = Application.Selection

    If CLng(Application.Version) >= 12 Then
        strDSN = "Provider=Microsoft.ACE.OLEDB.12.0;" _
        & "Data Source=" & objStartingRange.Worksheet.Parent.FullName & ";" _
        & "Extended Properties=""Excel 12.0 Xml;HDR=No;IMEX=1"";"
    Else
        strDSN = "Provider=Microsoft.Jet.OLEDB.4.0;" _
        & "Data Source=" & objStartingRange.Worksheet.Parent.FullName & ";" _
        & "Extended Properties=""Excel 8.0;HDR=No;IMEX=1"";"
    End If

    strSQL = "SELECT * FROM [" & objStartingRange.Worksheet.Name & "$];"

    objConnection.Open strDSN
    objRecordset.Open strSQL, objConnection

    Application.Workbooks.Add(xlWBATWorksheet).Sheets(1).Cells(1, 1).CopyFromRecordset objRecordset

End Sub

Спасибо!


person Kuyenda    schedule 08.01.2010    source источник
comment
Откуда вы это запускаете? Сам Эксель? Если это так, вы можете сделать то, что вам нужно, автоматизировав сам Excel, то есть в коде VBA. Я разработчик Access, поэтому не могу рассказать вам, как это делается, но с помощью VBA вы можете работать с данными в том состоянии, в котором они загружены в экземпляр Excel, независимо от того, были ли они сохранены на диск.   -  person David-W-Fenton    schedule 09.01.2010
comment
Да, внутри Excel. Я хочу выполнять SQL-запросы к данным в электронных таблицах, но не хочу заранее сохранять книгу.   -  person Kuyenda    schedule 09.01.2010
comment
Я не вижу способа запустить SQL-запрос к несохраненным данным. Это не означает, что вы не можете смотреть на данные и использовать возможности Excel для выполнения почти того же самого. Задумывались ли вы об автоматизации функции фильтрации? Возможно, вы сможете сделать простой фильтр и таким образом проверить полные поля. Но было бы намного проще просто сохранить электронную таблицу (или ее копию как временный файл для запросов!).   -  person David-W-Fenton    schedule 10.01.2010
comment
Я не думал об автоматизации функциональности фильтра. Я посмотрю на это. Я также обнаружил, что у Jet нет тех же ограничений, что и у электронных таблиц Excel, что вызывает другие проблемы. При работе в Excel проще оставаться в пределах функциональности Excel, но я оставлю этот вопрос поднятым. Может кто придумает обходной путь. Спасибо, Дэвид!   -  person Kuyenda    schedule 11.01.2010
comment
Вы можете просто сохранить новую книгу как временный файл, а затем удалить файл excel после того, как закончите с ним? ваш код выглядит так, как будто он просто создает новую книгу и сбрасывает ваш запрос в эту новую книгу. вы могли бы просто сбросить свой запрос на новую страницу в вашей текущей книге, если вы не собираетесь его сохранять? Затем выполните другие манипуляции, а затем удалите этот временный лист. Не совсем уверен, чего вы пытаетесь достичь...   -  person Fink    schedule 13.01.2010
comment
@Fink: это был просто тест, чтобы увидеть, смогу ли я выполнить простой запрос к несохраненной книге. Сброс его в другую книгу был другим тестом. Если бы я собирался использовать временный файл для запуска запросов Jet, я бы просто скопировал его напрямую. CopyFromRecordset, похоже, имеет проблемы с большими диапазонами. Спасибо!   -  person Kuyenda    schedule 31.01.2010


Ответы (1)


Нет. Как говорит Дэвид Фентон в комментариях.

person MarkJ    schedule 31.01.2010
comment
@MarkJ: забыл, что это осталось без ответа. Спасибо! - person Kuyenda; 31.01.2010
comment
Мне трудно в это поверить, потому что интерфейс реализован (на самом деле много реализаций), а также очень полезен. Это все еще правильный ответ по состоянию на 2014 год? - person Patrick Fromberg; 29.01.2014
comment
@PatrickFromberg Не уверен, о каком интерфейсе вы говорите. Я не знаю точно, правильный ли это ответ (но подозреваю, что да). Если кто-то еще знает, может быть, они могли бы опубликовать и сообщить нам? - person MarkJ; 29.01.2014