Как удалить переменные в excel

 

KUDRIN

Пользователь

Сообщений: 324
Регистрация: 30.12.2012

#1

07.04.2015 18:49:26

Здравствуйте!
подскажите, где почитать про обнуление переменных?
что-то типа таблички

Код
Erase a 'массив
Set a = Nothing 'object, range
a = VbNullString '$
a = "" '$
a = Empty '&
a = 0 '&

какие из них универсальные? например из этого списка «a = Empty» работает и для & и для $

Изменено: KUDRIN07.04.2015 19:31:23

 

Про Erase и Nothing — в Справке.
VbNullString и «» это разные вещи, в Справке тоже упоминается.
Empty это константа типа Variant, поэтому при присвоении преобразуется в 0, пустую строку, False.

 

KUDRIN

Пользователь

Сообщений: 324
Регистрация: 30.12.2012

#3

07.04.2015 19:05:58

Цитата
Казанский написал: Про Erase и Nothing — в Справке.

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

Примерно как в

этой статье

про объявление переменных

Изменено: KUDRIN07.04.2015 19:31:41

 

Добрый вечер
Может посмотреть на значения неинициализированных переменных?

 

The_Prist

Пользователь

Сообщений: 14182
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

А зачем, собственно, обнуление потребовалось? Я понимаю некоторые объекты и массивы. Но остальные-то переменные.После выполнения процедуры объявленные внутри неё переменные сами обнуляются и память не засоряют. Следовательно очистка как таковая ничего не даст…

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

KUDRIN

Пользователь

Сообщений: 324
Регистрация: 30.12.2012

Alexander88

, Нашел только для C —  

https://msdn.microsoft.com/ru-ru/library/83fhsxwc.aspx

, есть ссылка для Excel ?

The_Prist

, Это уже вопрос другой. Была

похожая тема

, из четырех ответов — подходящим оказался только один. Так и здесь — зачем и почему, можно пообсуждать, но когда вообще нет такой таблички, то неудобно. Банально переменная используется в цикле и приходится либо присваивать значение и обнулять через if else или обнулять через подобные команды, список которых я и ищу.
или например объект забивает память до 100%, если обрабатывается в цикле без обнуления

Изменено: KUDRIN07.04.2015 19:34:25

 

The_Prist

Пользователь

Сообщений: 14182
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

Тут как бы понимаете…Вопрос зачем не совсем от лени задан. Если для очистки памяти — то это лишнее. Если для дальнейшего использования — значит алгоритмы хромают. Ведь Вы сами назначаете значения переменным и вольны делать проверки их значения.
Но раз так надо, то по простому:
Integer,Long,Byte,Double,Decimal(уже не используется),Currency,Syngle,Date = по умолчанию имеют значение 0. Его и надо присваивать.
String — =»»
Array — Erase Arr
Object — Set obj = Nothing

Variant в зависимости от назначенного типа. Но можно просто =0.

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

vikttur

Пользователь

Сообщений: 47199
Регистрация: 15.09.2012

По поводу Object… Где-то когда-то мелькало, что переменные объектов чистить обязательно, иначе остаются в памяти.
Завршаем процедуру — чистим.
Правда? Неправда?

 

KUDRIN

Пользователь

Сообщений: 324
Регистрация: 30.12.2012

#9

07.04.2015 19:50:36

Буратине дали три яблока. Два он съел. Сколько яблок осталось у Буратины? Думаете одно? Ничего подобного. Никто же не знает сколько у него уже было яблок до этого. Мораль — обнуляйте переменные!!!

The_Prist

, Спасибо за комментарий по разным типам переменных

Цитата
Правда? Неправда?

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

Изменено: KUDRIN07.04.2015 19:55:22

 

The_Prist

Пользователь

Сообщений: 14182
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

Вить, на самом деле не совсем правда. VB вычищает память после завершения процедуры. Правда, не всегда корректно может это сделать именно для объектов. В последних версиях VBA не наблюдал такого.
Проблемы могут возникнуть при очистке переменных уровня проекта — с ними у VBA бывают проблемы при закрытии проекта, в котором они были инициализированы. При этом это могло повлечь остаток в памяти ссылки на уже не существующий объект, с которым она все еще была связана(можно наблюдать это при попытке переместить файл и запрет ОС на это — спасает разблокировка процесса путем закрытия Excel).

Для своей уверенности лучше очищать. В больших проектах так делаю. А вообще в последнее время обленился с этим делом в VBA — редко это делаю. Но и проблем от этого не наблюдал. Вот в C это дело не прощается — лучше вычистить все :-)

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

vikttur

Пользователь

Сообщений: 47199
Регистрация: 15.09.2012

Понял, спасибо.
Резюме: публичные лучше очищать.

 

Alexander88

Пользователь

Сообщений: 400
Регистрация: 02.09.2014

#12

07.04.2015 20:08:13

Цитата
KUDRIN написал: есть ссылка для Excel ?

Можно посмотреть в окне Locals при обьявлении
Всегда интересно было, как очистить в такой конструкции? :)

Код
With CreateObject("VBScript.RegExp")
    '
    '
End With

Изменено: Alexander8807.04.2015 20:11:12

 

The_Prist

Пользователь

Сообщений: 14182
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

Никак. Объект сразу после End With уничтожается.

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

Alexander88

Пользователь

Сообщений: 400
Регистрация: 02.09.2014

#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:

  1. 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).

  2. When you have a circular reference between two or more objects.

    If objectA stores a references to objectB, and objectB stores a reference to objectA, the two objects will never get destroyed unless you brake the chain by explicitly setting objectA.ReferenceToB = Nothing or objectB.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.

Обнуление всех переменных.

akobir

Дата: Среда, 06.05.2015, 11:24 |
Сообщение № 1

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 201


Репутация:

9

±

Замечаний:
0% ±


Excel 2010

Добрый день!

Проблема следующая:
Есть цикл, который обрабатывает несколько документов.
В цикле используется множество переменных.
Как (и можно ли) сделать так, чтобы при переходе от документа к документу все переменные обнулялись?


e-mail: akobir.ismailov@gmail.com

 

Ответить

Manyasha

Дата: Среда, 06.05.2015, 11:31 |
Сообщение № 2

Группа: Модераторы

Ранг: Старожил

Сообщений: 2198


Репутация:

898

±

Замечаний:
0% ±


Excel 2010, 2016

akobir, здравствуйте. Как вариант, запихать обработку файла в отдельную UDF, и в цикле вызывать эту функцию с нужными параметрами.


ЯД: 410013299366744 WM: R193491431804

 

Ответить

akobir

Дата: Среда, 06.05.2015, 11:46 |
Сообщение № 3

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 201


Репутация:

9

±

Замечаний:
0% ±


Excel 2010

Manyasha, Думал об этом. :) Надеялся, что есть вариант проще…
[moder]Есть. Посмотреть макрос.


e-mail: akobir.ismailov@gmail.com

Сообщение отредактировал _Boroda_Среда, 06.05.2015, 11:52

 

Ответить

AndreTM

Дата: Среда, 06.05.2015, 13:41 |
Сообщение № 4

Группа: Друзья

Ранг: Старожил

Сообщений: 1762


Репутация:

498

±

Замечаний:
0% ±


2003 & 2010

Надеялся, что есть вариант проще…

Дописать три строчки кода, сделать два копипаста… Куда проще-то уж? :D


Skype: andre.tm.007
Donate: Qiwi: 9517375010

 

Ответить

Hugo

Дата: Среда, 06.05.2015, 14:52 |
Сообщение № 5

Группа: Друзья

Ранг: Участник клуба

Сообщений: 3140


Репутация:

670

±

Замечаний:
0% ±


2010, теперь уже с PQ

А какие проблемы обнулить переменные? Или проблема в том, что это множество нужно обнулять вручную индивидуально (в коде каждую прописать)? Так ведь один раз прописали уже где-то — можно использовать копипаст.
Или можно подойти кардинально — использовать одну переменную-массив. Только в индексах не запутайтесь.
Типа
[vba]

Код

Sub test()
     Dim a(1 To 10) As Double
     a(3) = 25.5
     a(5) = 36.6
     MsgBox a(3) & » — » & a(5)
     Erase a
     MsgBox a(3) & » — » & a(5)
End Sub

[/vba]


excel@nxt.ru
webmoney: R418926282008 Z422237915069

Сообщение отредактировал HugoСреда, 06.05.2015, 14:55

 

Ответить

RAN

Дата: Среда, 06.05.2015, 15:01 |
Сообщение № 6

Группа: Друзья

Ранг: Экселист

Сообщений: 5645

А зачем вообще обнулять?
Инициализировать в начале цикла. Что, скорее всего, и происходит. За все время пришлось, может, пару раз обнулять отдельно.


Быть или не быть, вот в чем загвоздка!

 

Ответить

krosav4ig

Дата: Среда, 06.05.2015, 17:14 |
Сообщение № 7

Группа: Друзья

Ранг: Старожил

Сообщений: 2346


Репутация:

989

±

Замечаний:
0% ±


Excel 2007,2010,2013

Или можно подойти кардинально

Вкл-Выкл режима конструктора, шоб наверняка
[p.s.]Этнияоносамо


email:krosav4ig26@gmail.com WMR R207627035142 WMZ Z821145374535 ЯД 410012026478460

 

Ответить

vladimir-shagaliev

Дата: Среда, 06.05.2015, 20:16 |
Сообщение № 8

Группа: Пользователи

Ранг: Прохожий

Сообщений: 8


Репутация:

0

±

Замечаний:
0% ±


Excel 2007

[moder]Здесь этого не нужно писать. Удалил. Вы можете создать тему в свободном общении — это ветка форума такая.

Сообщение отредактировал _Boroda_Среда, 06.05.2015, 20:46

 

Ответить

akobir

Дата: Четверг, 07.05.2015, 13:59 |
Сообщение № 9

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 201


Репутация:

9

±

Замечаний:
0% ±


Excel 2010

Прошу администрацию сильно не пинать — но код приложить не могу — политика конфиденциальности. Заменять значения — реально очень долго.
Отвечаю на вопрос зачем обнулять:
Есть n-количество магазинов, которые обрабатываются. Все используют одинаковую отчетность, из которых, соответственно берутся данные.
Отчет формируется за каждый день.
Я, используя переменные и цикл считаю значения по столбцам для каждого магазина.
Далее это значение вставляю в сводный отчет и перехожу к следующему магазину.
Соответственно, чтобы переменные не продолжали складывать значения — необходимо обнулить.
Возможно, все это можно было прописать проще — но я не эксперт. :)

Как решил проблему:
Задал public-переменные в модуле и там же написал процедуру обнуления переменных.
После обработки каждого магазина вызывается процедура обнуления, после этого переход к следующему.


e-mail: akobir.ismailov@gmail.com

 

Ответить

Саня

Дата: Пятница, 08.05.2015, 11:46 |
Сообщение № 10

Группа: Друзья

Ранг: Ветеран

Сообщений: 1067


Репутация:

560

±

Замечаний:
0% ±


XL 2016

Как (и можно ли) сделать так, чтобы при переходе от документа к документу все переменные обнулялись?

в качестве развлечения, видимо…
[vba]

Код

sub s1()
   ‘ здесь код

   ‘ «вызываем» след. процедуру
   application.ontime now+timeserial(0,0,2),»s2″
   end
end sub

sub s2()
   ‘…
end sub

[/vba]

 

Ответить

AndreA SN

1014 / 118 / 2

Регистрация: 26.08.2011

Сообщений: 1,113

Записей в блоге: 2

1

11.11.2021, 13:55. Показов 1664. Ответов 3

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Нарисовал вот такое

Visual Basic
1
2
3
4
5
6
7
8
9
Dim rng
...
 
 
            On Error Resume Next
            Set rng = Range("A2:A" & n).SpecialCells(xlCellTypeVisible)
...
            If IsEmpty(rng) = False Then 
                 rng = Nothing ' вот тут неправильно

Как правильно очистить эту переменную?



0



2630 / 1636 / 744

Регистрация: 23.03.2015

Сообщений: 5,143

11.11.2021, 14:02

2

Лучший ответ Сообщение было отмечено AndreA SN как решение

Решение

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

Понравилась статья? Поделить с друзьями:

А вот еще интересные статьи:

  • Как удалить перекрестную ссылку в word
  • Как удалить перегородки в таблице excel
  • Как удалить переводы строк в word
  • Как удалить первые три символа в ячейке excel
  • Как удалить первые символы в ячейке excel формула

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии