2013-11-14 17 views
0

Я работаю над таблицей и с помощью Excel VBA - Словарь - я пытаюсь захватить все детали - 1) Первый шаг - поиск в столбце «Результаты» - если значение «Нет» - тогда нам нужно прочитать все значения с соответствующим заголовком. 2) Итак, для 2-й записи - т. Е. Name = XYZ - нам нужно сохранить все детали. Основываясь на столбце «Кол-во предметов» - нам нужно сохранить ценность всех предметов и их соответствующих меток - будут использоваться для дальнейшего расчета и создания столбца «Результат».Excel VBA - Словарь - сохранение и получение значений

Я получил это частично работает - как я могу захватить детали - но не в состоянии хранить информацию о всех субъекта и их знаки:

Sr. No. Results Out? Result Name Age No. of Subjects Subject Names Marks 
1   Yes   Pass ABC  21  3   Maths   10 
                  Science   26 
                  History   34 
2   No     XYZ  10  2   Maths   24 
                  Science   36 

Ниже приведен код, который я использовал, что частично работая:

Public Sub test_dict() 

Dim dict As New Scripting.dictionary 
Set dict = New dictionary 

sSheetIndex = 1 
intTargetRow = 2 

Set objUsedRange = Worksheets.Item(3).UsedRange 

For Iter = 1 To objUsedRange.Columns.Count 
    sCellName = objUsedRange.Cells(1, Iter) 
    sCellValue = objUsedRange.Cells(intTargetRow, Iter) 
    dict.Item(sCellName) = sCellValue 

Next 


For i = 0 To dict.Count - 1 
    s = dict.Items()(i) 
    Debug.Print dict.Keys()(i) & " " & dict.Items()(i) 
    Debug.Print s 
Next i 

End Sub 
+2

Что я Ваш вопрос? И зачем вам словарь? Похоже, вы можете получить все, что вам нужно, только с формулами рабочих таблиц. –

+0

@RachelHettinger - На самом деле я использую словарь, так как будет большой нет. (около 14000) - и мне придется обрабатывать их и использовать в качестве ввода для других функций, и это будет намного сложнее, поэтому используйте словарь, а не формулы рабочей таблицы. Мой вопрос - это то, что, когда я использую словарь, я могу хранить сопоставление ключевых значений для всех полей, кроме отображения объектов и меток. Возможно, мне придется использовать другой словарь специально для темы и меток, но не знаю, как соотнести его с 1-м словарем. – Krishna

+0

Итак, вы используете объект словаря, потому что это то, что вам нужно передать другим функциям, правильно? Если да, то посмотрите на эти другие функции, чтобы увидеть, как должны быть переданы данные объектов/меток. –

ответ

1

Решена проблема с кодом ниже - пришлось использовать 2 отдельные словари:

Public Sub test_dict() 

Dim dict As New Scripting.dictionary 
Set dict = New dictionary 

sSheetIndex = 1 
intTargetRow = 2 

Set objUsedRange = Worksheets.Item(3).UsedRange 

For Iter = 1 To objUsedRange.Columns.Count 
    sCellName = objUsedRange.Cells(1, Iter) 
    sCellValue = objUsedRange.Cells(intTargetRow, Iter) 
    dict.Item(sCellName) = sCellValue 

    If sCellName = "Subject Names" Then 
     Call test_dict_2 
    End If 

Next 

For i = 0 To dict.Count - 1 
    s = dict.Items()(i) 
    Debug.Print dict.Keys()(i) & " " & dict.Items()(i) 
    Debug.Print s 
Next i 

End Sub 



Public Sub test_dict_2() 

Dim dict_2 As New Scripting.dictionary 
Set dict_2 = New dictionary 

sSheetIndex = 1 
intTargetRow = row_counter 

Set objUsedRange = Worksheets.Item(3).UsedRange 

For Iter = 1 To objUsedRange.Columns.Count 
    sHeader = objUsedRange.Cells(1, Iter) 
    sCellValue = objUsedRange.Cells(intTargetRow, Iter) 

    If sHeader = "No. of Subjects" Then 
     mv_cnt = sCellValue 
    End If 

    If sHeader = "Subject Names" Then 

     Dim a 
     a = Iter + mv_cnt 
     For Iter_2 = Iter To (a - 1) 

      sHeader = objUsedRange.Cells(1, Iter) 
      sCellName = objUsedRange.Cells(intTargetRow, Iter) 
      sCellValue = objUsedRange.Cells(intTargetRow, Iter + 1) 
      dict_2.Item(sCellName) = sCellValue 
      intTargetRow = intTargetRow + 1 

     Next 

     intTargetRow = row_counter 

    End If 

Next 

For i = 0 To dict_2.Count - 1 
    s = dict_2.Items()(i) 
    Debug.Print dict_2.Keys()(i) & " " & dict_2.Items()(i) 
    Debug.Print s 
Next i 

Set dict_2 = Nothing 

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