Проблемы со словарем VBA - PullRequest
0 голосов
/ 05 декабря 2018

У меня есть следующая подпрограмма, которую я перебираю при запуске полной рабочей книги.То, что я пытаюсь сделать, это создать словарь, который записывается в подпрограмму, а затем также доступен в подпрограмме, чтобы получить максимальное значение.Если я создаю словарь в подпрограмме, он перезаписывается построчно, поэтому я не могу получить максимальное значение, если я создаю словарь в другом подпрограмме, у меня возникают проблемы с записью в него.Что вы предлагаете?

Private Sub CalculateCoordinates(sThread, node As IXMLDOMNode)
  Dim parent_node As IXMLDOMNode, x As Integer, y As Integer, 
  y_max_branch As Integer, nList As IXMLDOMNodeList
  Dim StepId As String, strXpath As String
  Dim inputer, inputer2, inputer3, inputer4 As String
  Dim stry As String
  Dim dict As Scripting.Dictionary

  set dict = New Scripting.Dictionary

  add.dict y , x 

  debug.print Application.WorksheetFunction.Max(dict.keys)

  Call AddCoordinates(node, x, y)
End Sub

Спасибо за ответы, я изменил код соответствующим образом, но я все еще получаю перезаписываемый словарь в каждой строке.Я считаю, что это вызывает это: - Установите dctCurrent = Новый словарь Где я могу определить его из подпрограммы, чтобы остановить его перезапись каждой строки?

Public dctCurrent As Dictionary
Debug.Print "max ITEM:- "; Application.Max(dctCurrent.Items)
Call EntryProcToMyLogic(x, y)
Call AddCoordinates(node, x, y)
End Sub

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Public Sub EntryProcToMyLogic(x, y)
  Set dctCurrent = New Dictionary      
  Call CalculateCoordinates()

  dctCurrent.Add x, y

  Debug.Print "max KEY:- "; Application.Max(dctCurrent.Keys)
  Debug.Print "max ITEM:- "; Application.Max(dctCurrent.Items)

End Sub

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

Чтобы предотвратить перезапись, вы можете проверить, если dctCurrent уже создано (если не dctCurrent Is Nothing) до Set dctCurrent = New Dictionary.

Создать функцию, которая возвращает dctCurrent, и у вас нетбеспокоиться.

Option Explicit 'Top of module
Private dctCurrent As Scripting.Dictionary

Public Function CurrentDict() as Scripting.Dictionary
  If dctCurrent Is Nothing Then
    Set dctCurrent = New Scripting.Dictionary
  End If
  Set  CurrentDict = dctCurrent
End Function

Теперь вы можете использовать CurrentDict, не зная, был ли создан dctCurrent или нет.

Public Sub EntryProcToMyLogic(x, y)
  CurrentDict.Add x, y

  Debug.Print "max KEY:- "; Application.Max(CurrentDict.Keys)
  Debug.Print "max ITEM:- "; Application.Max(CurrentDict.Items)
End Sub
0 голосов
/ 05 декабря 2018

Хотя на самом деле я не вижу определенной словарной переменной, я подозреваю, что вам нужно объявить эту переменную на уровне модуля (возможно, как Private), чтобы все процессы в этом модуле могли ссылаться на нее.

Удостоверьтесь, что вы объявляете переменную только на уровне модуля и что в записи proc вы фактически устанавливаете ее в новый словарь.Этот подход гарантирует, что вы контролируете, когда он создается.

Option Explicit
Dim dctCurrent As Dictionary

Private Sub EntryProcToMyLogic()
    Set dctCurrent = New Dictionary

    [other functionality to set up call to CalculateCoordinates()]

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