Ваша проблема в том, что вы пытаетесь изменить свой реквизит из компонента. Вы можете либо обработать это внутри компонента с состоянием, либо сделать обратный вызов через подпорки из родительского компонента и обработать удаление там, примерно так:
Я упростил Ваш код, и это должно хорошо работать (я объясню изменения ниже):
def create_querytable2():
constring = "OLEDB;Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\path\to\db.mdb;"
SQL = "Select * from tblName;"
excel = client.CreateObject("Excel.Application", dynamic=True)
excel.Visible = True
ws = excel.Workbooks.Add().Worksheets(1)
ws.QueryTables.Add(constring, ws.Range["A1"], SQL).Refresh()
QueryTables. Добавьте (), функция может создать объекты Соединения и Recordset для Вас, так, чтобы упростил много вещей... просто необходимо добавить, какое соединение это находится в строке conneciton (часть "OLEDB").
Letting Excel делает большую часть работы, кажется, решает Вашу проблему :)
Похоже, что Ваша ошибка находится на этой строке:
qt = ws.QueryTables.Add(rs, ws.Range["A1"])
Я думаю, что Ваша проблема состоит в том, что Вы используете синтаксис Python для поиска значения в Наборе VBA. Попытайтесь изменить свои квадратные скобки на круглые скобки.
т.е.
qt = ws.QueryTables.Add(rs, ws.Range("A1"))
Причем причина - это в VBA при вызове Collection как это, Range("A1")
, Вы на самом деле звоните, это - метод по умолчанию, Range.Item("A1")
. В основном Наборы VBA не переводят в словари Python.
Я получаю это от этого потока форума и моего опыта с VBA.
Редактирование, должное прокомментировать:
К сожалению, я попробовал обоих: как отмечено в Вашей ссылке, они иногда не делают, то же самое, но мое инстинктивное чувство здесь - то, что' [' более вероятно, будет тем, что я хочу. – mavnn
Вы знаете если comtypes.client.CreateObject
работает то же как win32com.client.Dispatch
? Вы могли бы попытаться создать свой объект com с win32com пакетом и видеть, имеет ли это значение.