Можно ли получить доступ к коллекции, которая находится в нижней части стека? - PullRequest
0 голосов
/ 29 января 2019

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

Лучший способ сделать это - создать эту коллекцию в нижнем слое, где будет использоваться коллекция, и сохранить коллекцию, даже если коллекция выходит за рамки.

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

Я чувствую, что должнабыть лучшим способом решить мою проблему, но я просто не могу ее найти.Кто-нибудь знает ответ?

Я просто настроил текст в Excel следующим образом:

(A) (1)

(B) (2)

(C) (3)

(D) (4)

(E) (5)

'The Code works, but what I am asking is it possible to dont pass dict through all those sub

Sub Main()

Static dict As New Dictionary
Dim x As Integer

Set dict = readrange

Do While x < 3
    somesub dict
    x = x + 1
Loop


End Sub

'----------------------- Следующий модуль ----------------------------------------------------

Sub somesub(dict As Dictionary) '<----------------------- Dont want this dict
    'some code which doesnt not use the dict
    Dictchange dict

End Sub

'----------------------- Следующий модуль ----------------------------------------------------

Sub Dictchange(dict As Dictionary)  '<----------------------- Dont want this dict too

    Cells(dict(dict.Keys(0)), 4) = "Done"

    'Is it possible to call dict in Main without pass the chain
    'I cant use public as in the real code, "somesub" and "Dictchange" are in different module
    'I could use Global, but i always feel like it just a "Dirty" way to fix thing

    dict.Remove dict.Keys(0)

End Sub

'----------------------- Следующий модуль ---------------------------------------------------

'In the real code, this is one function in a class Module
Function readrange() As Dictionary

Dim temp As New Dictionary
For i = 1 To 5

    temp.Add Cells(i, 1).Value, Cells(i, 2).Value

Next i

Set readrange = temp

End Function

Надеюсь, это поможет

1 Ответ

0 голосов
/ 30 января 2019

Как я уже сказал в своем комментарии: Сделайте ваш dict глобальной переменной.

Option Explicit

Public dict As Dictionary 'this is globally defined in a module

Sub Main()
    Dim x As Long

    Set dict = ReadRangeToDict

    Do While x < 3
        SomeProcedure
        x = x + 1
    Loop
End Sub

Function ReadRangeToDict() As Dictionary
    Dim TempDict As New Dictionary

    Dim iRow As Long
    For iRow = 1 To 5
        If Not TempDict.Exists(Cells(iRow, 1).Value) Then 'check if key already exists to prevent errors!
            TempDict.Add Cells(iRow, 1).Value, Cells(iRow, 2).Value
        End If
    Next iRow

    Set ReadRangeToDict = TempDict
End Function

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

Sub SomeProcedure()
    'output the dict in the immediate window

    Dim itm As Variant
    For Each itm In dict
        Debug.Print itm, dict(itm)
    Next itm
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...