Неявные вызовы членов по умолчанию преследуют ваш код повсюду.
reportDict.Add Cells(4, startColumn + i), Cells(startRow, startColumn + i)
Это неявный доступ к Range.[_Default]
вне зависимости от того, какой лист в настоящее время является ActiveSheet
(вы имели в виду wkSheet.Cells
?), чтобы получить Key
- поскольку параметр Key
является String
, Range.[_Default]
неявно приведен к одному, и у вас есть строковый ключ.Однако фактический элемент словаря для этого ключа не такой удачный.
Вот MCVE:
Public Sub Test()
Dim d As Dictionary
Set d = New Dictionary
d.Add "A1", Cells(1, 1)
Debug.Print IsObject(d("A1"))
End Sub
Эта процедура выводит True
на панель отладки (Ctrl + G):то, что вы храните в своем словаре, это не набор строковых значений, а набор Range
ссылок на объекты.
Поэтому, когда вы сделаете это:
Dim myInsert As Variant
Set myInsert = reportDict.Item(Key)
Вы можететакже объявили myInsert As Range
, потому что это единица.
Здесь все становится интереснее:
MsgBox (myInsert)
Не обращайте внимания на лишние скобки, которые принудительно оценивают элемент объекта по умолчанию и передают егоByVal
в функцию MsgBox
- здесь вы неявно преобразуете Range.[_Default]
в String
.Это, вероятно, работает.
Так почему же тогда это не получается?
wkSheet.ListObjects(1).DataBodyRange(2, 1) = reportDict.Item(Key)
Обычно это не так.VBA с радостью сделает это:
wkSheet.ListObjects(1).DataBodyRange.Cells(2, 1).[_Default] = reportDict.Item(Key).[_Default]
И запишет значение в DataBodyRange
из ListObject
в указанном месте.
Я думаю, что это всего лишь красная сельдь,Напишите явный код: если вы хотите сохранить Value
ячейки, сохраните Value
ячейки .Если вы хотите назначить Value
ячейки, назначить Value
ячейки .
Я не могу повторить ошибку 91 с этой настройкой.
Это, однако:
DeleteTableRows (ThisWorkbook.Worksheets("Master").ListObjects("MasterSheet"))
... также принудительно оценивает элемент по умолчанию ListObject
, поэтому DeleteTableRows
не получает ListObject
, он получает String
, который содержит имя объекта, который вы только что разыменовали ... но DeleteTableRows
принимает параметр ListObject
, так что код не может даже получить чтобы запустить FillTableRows
- он должен взорваться с несоответствием типов , прежде чем DeleteTableRows
даже попадет в систему.На самом деле это ошибка времени компиляции .
Так что это довольно длинный ответ, который не доходит до причины ошибки 91 в этой конкретной строке (я не могу воспроизвестиэто), но выделяет метрическую тонну серьезных проблем с вашим кодом, которые очень вероятно связаны с этой ошибкой, которую вы получаете.Надеюсь, это поможет.