2015-11-16 6 views
2

Так что у меня есть программа excel, которая проходит через несколько PDF-файлов и извлекает из них данные. Для этого он использует рубрику, в которой рассматриваются ключевые значения Named Ranges, которые являются RubricItems, RatingsValuesRow и RatingsColumn. Я должен использовать названные диапазоны, потому что рубрика может измениться в любой момент времени. Bellow - это фрагмент кода, с которым у меня возникают проблемы.Ссылка на словарь внутри словаря внутри словаря excel - VBA Обязательная ошибка объекта

Для этого rubricItemC.value = 1, subRubricItem = а, ratCell = 4

Dim ratingsCol As Range 
Dim ratingsVal As Range 
Dim rubricItem As Range 
Dim rubricItemC As Range 
Dim subRubricItem As Range 
Dim gradeCount As Integer 
Dim c As Range 
Dim ratCount As Range 
Dim ratCell As Range 

count = 0 
gradeCount = 0 
Set rubricItem = Workbooks(strRubricTemplateFilename).Worksheets(RubricSheet).Range("RubricItems") 
Set ratingsVal = Workbooks(strRubricTemplateFilename).Worksheets(RubricSheet).Range("RatingsValuesRow") 
Set ratingsCol = Workbooks(strRubricTemplateFilename).Worksheets(RubricSheet).Range("RatingsColumn") 

'populates the ratings values which consist of [X,1,2,3,4] 
For Each c In ratingsVal.Cells 
    If Not (c.Value = "") Then 
    gradeValuesDict.Add c.Value, gradeCount 
    End If 
Next 

'iterates through each item in the rubric 
For Each c In rubricItem.Cells 
    Set rubricItemC = c 
    Set ratCell = Cells(rubricItemC.Row, ratingsCol.Column) 
    Set subRubricItem = rubricItemC.offset(0, 1) 

    'checks to see if the dictionary exist if not create it. 
    If Not dict.Exists(rubricItemC.Value) Then 
     'adds to the dictionary passing another dictionary as the item. 
     dict.Add rubricItemC.Value, subRubricDict 
    End If 

    'checks to see if the sub dictionary exists if not create it. 
    If Not dict.Item(rubricItemC.Value).Exists(subRubricItem.Value) Then 
     dict.Item(rubricItemC.Value).Add subRubricItem.Value, gradeValuesDict 
    End If 
     dict.Item(rubricItemC.Value).Item(subRubricItem).Item(ratCell) = dict.Item(rubricItemC.Value).Item(subRubricItem).Item(ratCell) + 1 
Next 

Это где я получаю свой объект, необходимую ошибку.

dict.Item(rubricItemC.Value).Item(subRubricItem).Item(ratCell) = dict.Item(rubricItemC.Value).Item(subRubricItem).Item(ratCell) + 1 

Я довольно новыми для VBA, но то, что Im пытается сделать здесь задание с gradeCount в пределах нескольких уровней dictionarys и увеличить значение на 1.

+0

у вас есть '" 'один в середине линии, как это должно быть здесь? (С одной другой, потому что не может быть только один) – R3uK

+0

Вашей линии ошибки в коде много двойных кавычек, которые не отображаются и не отображаются в вашем комментарии. '" categoryItemC.Value "' не то же самое, что 'рубрикаItemC.Value'.' "ratCell" 'это не то же самое, что' ratCell' ... Что такое фактическое утверждение в вашем коде? –

+0

Я действительно пробовал оба не работать, возвращая ту же ошибку. Я не совсем уверен, какой синтаксис верен. @ASH – Persiden

ответ

1

Словарь объекта принимает ссылки на объекты как ключи. По этой причине, когда вы вводите элемент с некоторым Range object в качестве ключа, вы не можете получить тот же элемент, используя ключ range's value, он не найдет его. То же самое применяется, если вы добавляете элемент со значением и пытаетесь получить его объектом диапазона (ссылка).

Как правило, если ваш ключ в .Add является Range, используйте тот же объект диапазона как ключ в .Item. С другой стороны, если ваш ключ в .Add является Range.Value (это то, что вы на самом деле хотите сделать), используйте тот же value в качестве ключа в .Item.

dict.Item(rubricItemC.Value).Item(subRubricItem.Value).Item(ratCell.Value) = dict.Item(rubricItemC.Value).Item(subRubricItem.Value).Item(ratCell.Value) + 1 
+0

отлично! это отлично работало, и я не уверен, почему я не ссылался на значения sub/ratCell изначально, даже несмотря на то, что я сделал это для рубрикиItemC – Persiden

+0

* Парадигма свойства * по умолчанию является источником ошибки во многих ситуациях, одна из которых была той, с которой вы столкнулись. Отлично знать, что проблема решена :) –

+1

@ user2062443 - Пожалуйста, отметьте как ответ, если это сработало для вас :) –

Смежные вопросы