Использование ADODB для доступа к открытому файлу xls - PullRequest
4 голосов
/ 24 января 2012

Хотя я работаю с VBA для Excel довольно давно, у меня есть одна проблема, которую я не могу решить самостоятельно. Я описал это ниже, надеюсь получить помощь или совет.
Я использую Excel 2007 и Windows XP, все они обновлены с помощью новейших патчей.

Я очень часто использую следующий код для получения данных из другой книги:

Set conn = New ADODB.Connection
conn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=g:\source.xls;Extended Properties=Excel 8.0;"

Sql = "SELECT Field1, Field2 FROM [Sheet1$]"

Set rst = New ADODB.Recordset
rst.Open Sql, conn, adOpenForwardOnly

Worksheets("Results").Range("A2").CopyFromRecordset rst

rst.Close
Set rst = Nothing

conn.Close
Set conn = Nothing

Как можно проще - просто подключитесь к файлу и получите из него некоторые данные. Он отлично работает до тех пор, пока исходный файл, который находится на общем сетевом диске (g: \ source.xls), не открыт на другом компьютере.
Когда какой-то пользователь на другом компьютере открыл файл и я пытаюсь выполнить следующий код, я заметил одну вещь, от которой я хотел бы избавиться: исходный файл Excel открыт (в режиме только для чтения) на моем компьютере, и он не закрывается после того, как соединение с этим файлом было закрыто . Что еще хуже, даже если я закрою этот исходный файл вручную, он оставит некоторый мусор в моем файле, как будто он никогда не закрывался: см. Рисунок после нескольких выполнений кода (исходные файлы были закрыты ранее):
enter image description here

Я начал верить, что это ошибка, которую нельзя устранить - надеюсь, я ошибаюсь:)

Ответы [ 3 ]

4 голосов
/ 25 января 2012

Ваша версия Excel 2007 или более поздняя?

, если используется Microsoft.ACE.OLEDB.12.0 у провайдера, и ваша проблема решена.

[] ´s

3 голосов
/ 07 февраля 2012

На самом деле это известная ошибка, см .: http://support.microsoft.com/default.aspx?scid=kb;en-us;319998&Product=xlw. Запрос открытой книги Excel с VBA приводит к утечке памяти, так как ссылка не освобождается даже при закрытии соединения и очистке объекта.

0 голосов
/ 24 января 2012

Было бы гораздо лучше открыть источник данных Excel, используя встроенную ссылку Excel, а не соединение ADO, например:

Dim xlApp As New Excel.Application
Dim xlWrkBk As Excel.WorkBook

xlApp.WorkBooks.Open FILENAME
Set xlWrkBk = xlApp.ActiveWorkbook

А потом иди отсюда

...