2013-12-05 11 views
0

Я относительный новичок в VB, поэтому у меня возникают реальные проблемы, пытаясь понять, как все сочетается. В настоящее время я пытаюсь использовать глобальный словарь для хранения значений заголовков/столбцов, чтобы их можно было быстро получить при запуске (поскольку номера столбцов могут меняться в зависимости от содержимого). Однако я изо всех сил пытаюсь заставить словарь работать, он, кажется, добавляет значения, но позже в коде появляется как пустая, я понятия не имею, что я делаю неправильно, и буду признателен за любую помощь.Словарь Excel не обновляется?

Public dataHeaders As Dictionary 


Public Function getCases() 

Set dataHeaders = CreateObject("Scripting.Dictionary") 

For i = 1 To 100 
    If IsEmpty(Worksheets("DATA").Cells(1, i)) Then 
     Exit For 
    Else 
     dataHeaders.Add Worksheets("DATA").Cells(1, i), i 
    End If 
Next 


For i = 1 To 10 

    For j = 1 To 750 
     If Worksheets("Summary").Cells(1, i) = Worksheets("DATA").Cells(dataHeaders("Checker"), j) Then 
      Worksheets("Summary").Cells(2, i) = Worksheets("Summary").Cells(2, i) + 1 
     End If 
    Next 
Next 

End Function 
+0

Я была такая же проблема. Вы можете посмотреть мой вопрос здесь: http://stackoverflow.com/questions/17601919/global-variable-loses-its-value – ApplePie

+0

Эй, Сэм, я использовал словарь, потому что мне нужно идентифицировать столбцы со строками (это имя, адрес и т. д.), я находился под массивами показов только что используемых целых чисел? Но любая помощь, которую вы можете получить, будет оценена по достоинству! – user3070580

+0

Это вопрос Excel VBA? Я не вижу здесь вопроса VB6. – Bob77

ответ

0

Я подозреваю, что ваша проблема либо проблема с корпусом, либо пробел. Чтобы избавиться от этой проблемы, используйте Trim и UCase (или LCase), чтобы нормализовать текст перед его использованием в словаре.

Я тестировал код, приведенный ниже, и выводит то, что я ожидал бы ..

Sub test() 


Dim headers As Dictionary 
Dim valueCount As Integer 
Dim ws As Worksheet 
Dim headerRange As Range 

Set ws = Sheet1 

Set headers = New Dictionary 

'get last column on the right of our header row 
valueCount = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column 


Set headerRange = ws.Cells(1, 1).Resize(1, valueCount) 

    Dim i As Long 
    i = 1 

    For Each cell In headerRange 

    'Trim and convert to upper when assigning to array. 
    headers.Add UCase(Trim(cell.Value)), i 
    i = i + 1 

    Next cell 


    For Each Key In headers.Keys 

     'Note the usage of Trim and UCase 
     Debug.Print "item: " & Key & " Value : " & headers(UCase(Trim(Key))) 
    Next Key 


End Sub 
+0

Еще раз спасибо Сэму, к сожалению, когда я пытаюсь использовать этот код, он выводит сообщение об ошибке, требующее Object (но не беспокоит выделение местоположения проблемы). Не предполагается, что есть способ импортировать код LUA? Не слишком обремененный этим! : D – user3070580

+0

Просто измените 'Set headers = new Dictionary' на' Set headers = CreateObject ("Scripting.Dictionary") ', который должен исправить его. Код для меня не является ошибкой, потому что у меня есть библиотека скриптов, связанная в моем excel , (Я полагал, что вы тоже это сделали, когда объявляете свои заголовки в виде словаря, а не объекта) – Sam

+0

@ user3070580 Кроме того, вам действительно не нужен мой код, ваш код должен работать. Просто попробуйте использовать 'UCase' и' Trim' в как я продемонстрировал, посмотрим, исправляет ли это вашу проблему. – Sam

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