Страницы: 1
RSS
Получить список всех объявленных переменных из кода, NopePad++ и Locals Window не предлогать :)
 
Добрый День!

Искал и по этому форуму и в гугле, но ни чего к сожалению не нашел :(
Вопрос такой, есть скажем в модуле объявленные переменные допустим:

Код
Public WsR as Worksheet
Public i as Integer, j as Long, s as String


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

Все что смог сделать, это получить имена переменых в текстовом виде.
А вот как обратиться к переменной зная ее текстовое имя или как получить список всех переменных виде самих же переменных, или как очистить/удалить из памяти эту переменную зная ее имя, вот с этим разобраться не могу.
Помогите, пожалуйста! ... кто чем может :)

пример моего кода:
Код
Public WsPD As Worksheet
Public Folder2 As Folder
Public NedStart As Date, NedFin As Date
Public z As Byte, FVS As Byte, RN As Byte
Public MagArr()

Sub test()

'Получаем список всех модулей, форм, листов и т.д. в данной книге
For Each iVBcomponent In ThisWorkbook.VBProject.VBComponents
    'Проверяем являеться ли модулем или формой
    If iVBcomponent.Type = 1 Or iVBcomponent.Type = 3 Then
        'Построчно просматриваем часть модуля с объявленными переменными
        For i = 1 To iVBcomponent.CodeModule.CountOfDeclarationLines
            'Разделям по ","
            x = Split(iVBcomponent.CodeModule.Lines(i, 1), ",")
            'просматриваем получившиеся части
            For j = 0 To UBound(x)
                'Разделям по " " и выбираем переменную
                x1 = Split(x(j), " ")(1)

'**********************************************************************
'Выделенная часть на данный момент не имеет смысла, так как x1 всегда будет string содержащий имя переменной

                Debug.Print x1, TypeName(x1)
                'определяем тип переменной
                Select Case VarLife(x1)
                    Case 1
                        Set x1 = Nothing
                    Case 2
                        Erase x1
                    Case 3
                        x1 = ""
                End Select
'*********************************************************************
            Next j
        Next i
    End If
Next

End Sub

Function VarLife(curVariables As Variant) As Byte
    If IsObject(curVariables) Then VarLife = 1: Exit Function
    If IsArray(curVariables) Then VarLife = 2: Exit Function
    VarLife = 3
End Function

 
можно так
Спасибо
 
Спасибо за ответ!

На сколько смог понять, Вы предлагаете изначально все переменные создавать как элементы словаря, правильно? В любом случае идея интересная и точно пригодится, но не в данном случае.

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

Может что то из WinAPI? ... Хотя на сколько я понял обратиться к переменной напрямую в память по имени нельзя...
Изменено: SkyShark - 01.03.2013 23:49:33
 
Цитата
SkyShark пишет:
К примеру требуется перед завершением выполнения кода получить список всех переменных и очистить их
А зачем это нужно? После завершения процедуры все ее переменные уничтожаются, память освобождается. Исключение составляют переменные, объявленные как Static, они на самом деле хранятся в модуле и "живут" вместе с переменными уровня модуля, пока модуль загружен в память.
Массивы можно очистить оператором Erase.
Изменено: Казанский - 01.03.2013 23:19:15
 
Может не совсем корректно выразился. Код не завершается, а идет ожидание действий пользователя при этом все переменные продолжают существовать и как результат занимают память. Конечно можно не обращать внимания скажем на переменные byte, long, Boolean и т. д. при текущих гигобайтных объемах памяти, но все таки это не совсем правильно.

Плюс ко всем, чем не вариант проверки всех переменных и скажем в случае обнаружения в памяти: 4-х объектов, 5-ти целых и 8-и строковых переменных объявленных и не очищенных в результате работы кода, завершить программу или выдать сообщение.
 
Цитата
SkyShark пишет:
Код не завершается, а идет ожидание действий пользователя при этом все переменные продолжают существовать и как результат занимают память
я, например знаю, что делается с той или иной переменной в определенном участке кода, во время его исполнения.
Спасибо
 
Я тоже знаю, или стараюсь знать и понимать, но дело ни в этом.

Моих знаний просто не хватает что бы решить эту задачу, и даже не знаю в каком направлении искать решение. Можете считать это навязчивой идеей, но хочется все таки найти способ реализации :)
 
А в чём сверхзадача - у Вас недостаточно физической памяти?
 
Памяти хватает, хотя железо встречается разное и бывает удивляет своей "новизной" ;)

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

Цитата
SkyShark пишет:
Интересен сам принцип подобного обращения к переменным зная только имя переменной, которое хранится ввиде текстовой строки
Цитата
R Dmitry пишет:
Код
Public Dict As Object
Sub LoadVar()
Set Dict = CreateObject("scripting.dictionary")
With Dict
.Add "testA", "String"
.Add "testB", 1
.Add "testC", Array(1, 2, 3)
End With
End Sub
Sub tst()
Debug.Print Dict("testA")
Debug.Print Dict("testB")
Debug.Print Join(Dict("testC"), ",")
Set Dict = Nothing
test
On Error Resume Next
Debug.Print Dict("testA")
Debug.Print Dict("testB")
Debug.Print Join(Dict("testC"), "==")
End Sub
Изменено: nerv - 13.03.2013 12:12:42
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
Страницы: 1
Читают тему
Наверх