KUDRIN Пользователь Сообщений: 324 |
#1 07.04.2015 18:49:26 Здравствуйте!
какие из них универсальные? например из этого списка «a = Empty» работает и для & и для $ Изменено: KUDRIN — 07.04.2015 19:31:23 |
||
Про Erase и Nothing — в Справке. |
|
KUDRIN Пользователь Сообщений: 324 |
#3 07.04.2015 19:05:58
Имеется ввиду не про каждую команду в отдельности (название которой еще поискать нужно), Примерно как в этой статье про объявление переменных Изменено: KUDRIN — 07.04.2015 19:31:41 |
||
Добрый вечер |
|
The_Prist Пользователь Сообщений: 14182 Профессиональная разработка приложений для MS Office |
А зачем, собственно, обнуление потребовалось? Я понимаю некоторые объекты и массивы. Но остальные-то переменные.После выполнения процедуры объявленные внутри неё переменные сами обнуляются и память не засоряют. Следовательно очистка как таковая ничего не даст… Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы… |
KUDRIN Пользователь Сообщений: 324 |
Alexander88
, Нашел только для C — https://msdn.microsoft.com/ru-ru/library/83fhsxwc.aspx , есть ссылка для Excel ? The_Prist , Это уже вопрос другой. Была похожая тема , из четырех ответов — подходящим оказался только один. Так и здесь — зачем и почему, можно пообсуждать, но когда вообще нет такой таблички, то неудобно. Банально переменная используется в цикле и приходится либо присваивать значение и обнулять через if else или обнулять через подобные команды, список которых я и ищу. Изменено: KUDRIN — 07.04.2015 19:34:25 |
The_Prist Пользователь Сообщений: 14182 Профессиональная разработка приложений для MS Office |
Тут как бы понимаете…Вопрос зачем не совсем от лени задан. Если для очистки памяти — то это лишнее. Если для дальнейшего использования — значит алгоритмы хромают. Ведь Вы сами назначаете значения переменным и вольны делать проверки их значения. Variant в зависимости от назначенного типа. Но можно просто =0. Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы… |
vikttur Пользователь Сообщений: 47199 |
По поводу Object… Где-то когда-то мелькало, что переменные объектов чистить обязательно, иначе остаются в памяти. |
KUDRIN Пользователь Сообщений: 324 |
#9 07.04.2015 19:50:36 Буратине дали три яблока. Два он съел. Сколько яблок осталось у Буратины? Думаете одно? Ничего подобного. Никто же не знает сколько у него уже было яблок до этого. Мораль — обнуляйте переменные!!! The_Prist , Спасибо за комментарий по разным типам переменных
Однозначно да или нет не могу сказать, но это как минимум зависит конкретно от самого объекта и от количества циклов, прецеденты уже были. если проблем в конкретном примере нет, то наверное и не обязательно Изменено: KUDRIN — 07.04.2015 19:55:22 |
||
The_Prist Пользователь Сообщений: 14182 Профессиональная разработка приложений для MS Office |
Вить, на самом деле не совсем правда. VB вычищает память после завершения процедуры. Правда, не всегда корректно может это сделать именно для объектов. В последних версиях VBA не наблюдал такого. Для своей уверенности лучше очищать. В больших проектах так делаю. А вообще в последнее время обленился с этим делом в VBA — редко это делаю. Но и проблем от этого не наблюдал. Вот в C это дело не прощается — лучше вычистить все Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы… |
vikttur Пользователь Сообщений: 47199 |
Понял, спасибо. |
Alexander88 Пользователь Сообщений: 400 |
#12 07.04.2015 20:08:13
Можно посмотреть в окне Locals при обьявлении
Изменено: Alexander88 — 07.04.2015 20:11:12 |
||||
The_Prist Пользователь Сообщений: 14182 Профессиональная разработка приложений для MS Office |
Никак. Объект сразу после End With уничтожается. Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы… |
Alexander88 Пользователь Сообщений: 400 |
#14 07.04.2015 20:34:41 The_Prist, Спасибо |
VB6/VBA uses deterministic approach to destoying objects. Each object stores number of references to itself. When the number reaches zero, the object is destroyed.
Object variables are guaranteed to be cleaned (set to Nothing
) when they go out of scope, this decrements the reference counters in their respective objects. No manual action required.
There are only two cases when you want an explicit cleanup:
-
When you want an object to be destroyed before its variable goes out of scope (e.g., your procedure is going to take long time to execute, and the object holds a resource, so you want to destroy the object as soon as possible to release the resource).
-
When you have a circular reference between two or more objects.
If
objectA
stores a references toobjectB
, andobjectB
stores a reference toobjectA
, the two objects will never get destroyed unless you brake the chain by explicitly settingobjectA.ReferenceToB = Nothing
orobjectB.ReferenceToA = Nothing
.
The code snippet you show is wrong. No manual cleanup is required. It is even harmful to do a manual cleanup, as it gives you a false sense of more correct code.
If you have a variable at a class level, it will be cleaned/destroyed when the class instance is destructed. You can destroy it earlier if you want (see item 1.
).
If you have a variable at a module level, it will be cleaned/destroyed when your program exits (or, in case of VBA, when the VBA project is reset). You can destroy it earlier if you want (see item 1.
).
Access level of a variable (public vs. private) does not affect its life time.
Обнуление всех переменных. |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
AndreA SN 1014 / 118 / 2 Регистрация: 26.08.2011 Сообщений: 1,113 Записей в блоге: 2 |
||||
1 |
||||
11.11.2021, 13:55. Показов 1664. Ответов 3 Метки нет (Все метки)
Нарисовал вот такое
Как правильно очистить эту переменную?
0 |
2630 / 1636 / 744 Регистрация: 23.03.2015 Сообщений: 5,143 |
|
11.11.2021, 14:02 |
2 |
РешениеSet Rng = Nothing
1 |
1014 / 118 / 2 Регистрация: 26.08.2011 Сообщений: 1,113 Записей в блоге: 2 |
|
11.11.2021, 15:49 [ТС] |
3 |
Narimanych, спасибо, особенно за цитату.
0 |
2630 / 1636 / 744 Регистрация: 23.03.2015 Сообщений: 5,143 |
|
11.11.2021, 16:04 |
4 |
AndreA SN,
0 |
У меня ситуация, когда мне нужно clear
переменную lastWord
, чтобы msgbox
ничего не отображал в следующем loop
.
Следующий код — это просто пример.
Sub clear_lastWord_Variable()
Dim wordArr() As String
Dim lastword As String
Do
selection.Find.ClearFormatting
selection.Find.Font.Bold = True
With selection.Find
.Forward = True
.Wrap = wdFindStop
End With
selection.Find.Execute
If selection.Find.Found Then
wordArr = Split(selection, " ")
For i = LBound(wordArr) To UBound(wordArr) Step 1
lastword = wordArr(i)
Next i
MsgBox lastword
' here should be something to clear lastword
Else
Exit Do
End If
Loop
End Sub
Это видео может помочь вам узнать секретный трюк https://youtu.be/MaiSBVguh28
2 ответа
Лучший ответ
Вы не можете «очистить» переменную, не являющуюся объектом, вы можете только установить для нее определенное значение. Для строковой переменной это обычно пустая строка ""
.
lastword = ""
Или (идентичный)
lastword = vbNullString
Для объектных переменных существует Set myObj = Nothing
.
17
Andre
15 Май 2016 в 07:30
Если ваша переменная не является объектом, вы также можете:
lastword = Empty
6
I.Samp
21 Дек 2018 в 09:52