очистка переменной

Автор dimmon777, 12 августа 2017, 09:42

0 Пользователи и 1 гость просматривают эту тему.

dimmon777

Добрый день!  Есть макрос,  который в цикле открывает один и тот же  шаблон документа.  Переменной оDoc назначаю ThisDocument,  после выполнения цикла документ закрывается,  макрос возвращается в начало и пытается снова открыть документ,  а в переменной оDoc ещё висит "старый" документ.  В общем нужно очистить переменную оDoc.

rami


economist

Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

rami

Цитата: economist от 12 августа 2017, 11:49
oDoc=ThisComponent
...
oDoc=False
Попытка починить велосипед костылями засчитана ;D

mikekaganski

Функция Erase в StarBasic реализована с учётом различий между VBA и StarBasic (см. lcl_eraseImpl() в basic/source/runtime/runtime.cxx).
В данном случае результат будет Empty.

Конечно, присвоение булевой переменной странный. Но канонический вариант очистки объектной переменной

oDoc = Nothing
С уважением,
Михаил Каганский

economist

Цитата: rami от 12 августа 2017, 10:25Попытка починить велосипед костылями засчитана

В некоторых случаях это как раз то, что нужно. C False вообще трудно что-либо перепутать :-)

Nothing, конечно, правильнее.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

economist

А решать задачу как написал топикстартер, то все варианты - равнозначны:

oDoc=ThisDocument
' или даже правильно:
oDoc=ThisComponent
' все варианты - правильные, сработает любой
oDoc=False
oDoc=Nothing
oDoc=Empty
oDoc=""
oDoc=0
oDoc="пусто"
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

rami

Цитата: economist от 12 августа 2017, 11:58А решать задачу как написал топикстартер, то все варианты - равнозначны:
"Равнозначные" варианты часто приводят к неравнозначным результатам. Переменную очень желательно объявлять:
Dim oDoc As Object
тогда все варианты говорят сами за себя.

dimmon777

Всем огромное спасибо за ответы!! Проблема заключалась в моем нубизме) Нужно было все переменные назначать ПЕРЕД циклом. А я пытался назначить непосредственно в самом теле цикла, что и приводило к ошибке

economist

dimmon777 - в цикле тоже можно назначать переменные. Чего нельзя там делать - это менять саму переменную цикла N
For N=1... или For Each N In...

Чтобы было меньше непоняток - всегда вверху модуля, если он больше 20 строк, пишите:

Option Explicit

А в тексте модуля - объявляйте переменные с указанием их типа:

Dim oDoc As Object

Это не то чтобы ускорит написание кода (скорее наоборот), но число глюков при отладке/доработке уменьшит в 10-100 раз.
   
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...