Доступ к словарю в различных подпрограммах в VBA - PullRequest
0 голосов
/ 09 октября 2019

Я хочу сохранить некоторый статус в VBA (Excel), используя словарь, но у меня возникли проблемы с доступом к нему в другом подпункте.

В конце я хочу использовать вложенный словарь, содержащий идентификаторы в качестве первичных ключей и длядля каждого идентификатора мне нужно несколько сообщений о состоянии с соответствующей отметкой времени:

Example: {ID_1: {status_1: 09.10.19 06:47, status_2: 09.10.19 07:00,...}, ID_2:{status_6: 09.10.19 06:30, status_1: 09.10.19 06:20}}

До сих пор я просто пытался получить простой словарь, содержащий только идентификатор и статус:

Option Explicit  Public dict As Scripting.Dictionary  Public id As Integer


Public Sub Worksheet_Change(ByVal Target As Range)
    On Error GoTo Fin

    Dim current_status As String

    current_status = Tabelle4.Range("B11").Value
    id = Tabelle3.Cells(7, 6).Value

    Application.EnableEvents = False
    If Not Intersect(Target, Range("C12:G12")) Is Nothing Then


        If dict Is Nothing Then
            Set dict = New Scripting.Dictionary

            dict.Add (id), current_status

        'Checks if inner dict exists
        ElseIf Not dict(id).Exists Then

            dict.Add (id), current_status

        End If

    End If

    Fin:

         Application.EnableEvents = True
    End Sub

Обратите внимание, что я меняю ID вручную, и current_status будет сгенерирован в B11 путем изменения одного из значений в C12 на G12 (именно поэтому я использовал событие Change). В конце я хочу сохранить записи обо всех обновлениях состояния, которые происходят, и отслеживать, когда они происходят.

Моя проблема заключается в том, что это работает для 1 записи. Я могу создать одну запись в части «Если dict is Nothing Then» и могу получить к ней доступ даже после события. (например, вставка MsgBox dict (ID) в начале перед повторным вызовом события.) Я также хочу напечатать результат, используя кнопку в моем Excel. Однако, когда я звоню:

Public Sub print_dict()    

MsgBox dict(id)

End Sub

, я получаю сообщение об ошибке, что dict не определено. «MsgBox id» возвращает пустой MsgBox.

Может быть, кто-то может мне помочь. Я довольно новичок в VBA и все еще борюсь с ним: D

Приветствия!

1 Ответ

1 голос
/ 09 октября 2019
dict(id).Exists 

должно быть

dict.Exists(id)

При использовании обработчика ошибок стоит убедиться, что вы не пропускаете проблемы с синтаксисом кода.

Я предполагаю, что MsgBox dict(id) завершится неудачно, потому что этот саб находится в обычном модуле, а не в вашем модуле листов.

MsgBox id дает вам пустое окно сообщения, потому что вы не используете Option Explicit в своем модуле обычного кода: переменная id не существует в области видимости, к которой ваш Sub может получить доступ, нобез Option Explicit ваш код автоматически создает (пустую) переменную id для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...