Страницы: 1 2 3 След.
RSS
Описание применения "Set"
 
Доброго времени суток!  
 
Прошу описать применение функцию "Set" на доступном языке :)  
 
Особенно интересует когда обязательно объявлять:  
Set "Переменная" = Nothing  
а когда нет.  
 
Спасибо заранее!  
 
P.S. буду рад любому Вашему ответу, даже короткому ;)
<FONT COLOR="CadetBlue">
 
Для переменных текстового, числового и логического типов SET не применяется.  
(применяется оператор LET, который можно не писать)  
Let a = "текст": a="текст2": x = 5.25  
 
Для ОБЪЕКТОВ необходимо использовать оператор SET  
set a = worksheets(1): set x = range("a2:d4")
 
Всегда желательно в конце процедуры:  
Set "Переменная" = Nothing  
Это принудительно очистит память.
Я сам - дурнее всякого примера! ...
 
И вообще, вас что, на Гугле забанили?  
 
По VBA есть куча справочников - в каждом описано различие между SET и LET  
 
Цитата:  
 
В VBA существует два основных типа инструкций присваивания Let и  
Set. Инструкция Let используется в том случае, когда требуется присвоить  
значение выражения переменной или свойству. Её структура имеет следующий  
вид:  
      [Let] имя переменной = выражение
      Значение выражения может быть присвоено только в том случае, когда  
типы переменной и выражения совместимы. Например, нельзя присвоить  
строковой переменной значение выражения, являющегося числовым.  
 
 
    Инструкция Set присваивает ссылку на объект переменной или свойству  
объекта. При этом переменной присваивается выражение или значение,  
возвращаемое функцией. Структура инструкции Set имеет следующий вид:  
    Set переменная = [New] выражение | Nothing
    New - необязательный элемент. Это главное слово используется при  
описании для создания нового неявного экземпляра объекта. Если переменная  
содержит ссылку на объект, то при новом присвоении эта ссылка  
освобождается.  
    Выражение - обязательный элемент, представляющий выражение,  
состоящее из имени объекта, переменной соответствующего типа, функции  
или метода, которые возвращают объект того же типа.  
    Nothing - необязательный элемент, который разрывает связь элемента  
переменная с каким-либо определённым объектом. При этом переменная  
получает значение Nothing.
 
ИМХО, если переменная определена в процедуре (локальная), то время её жизни ограничено процедурой и по окончании процедуры (Exit Sub) все локальные переменные "умирают" и освобождают память. Поэтому Set "Переменная" = Nothing для локальных переменных делать не обязательно (конечно, если сама процедура не жутко жадная в смысле пожирания памяти)
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
{quote}{login=Alex_ST}{date=10.06.2010 11:29}{thema=}{post}Поэтому Set "Переменная" = Nothing для локальных переменных делать не обязательно (конечно, если сама процедура не жутко жадная в смысле пожирания памяти){/post}{/quote}Позвольте не согласиться. VBA редактор не такой уж продвинутый, как может показаться и он своими силами высвобождает память не всегда корректно. Он по идее должен все выгрузить, но такое происходит далеко не всегда. Лично я предпочитаю в большинстве случаев именно принудительно высвобождать память от подобных переменных, что и Вам советую.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
{quote}{login=Alex_ST}{date=10.06.2010 11:29}{thema=}{post}ИМХО, если переменная определена в процедуре (локальная), то время её жизни ограничено процедурой и по окончании процедуры (Exit Sub) все локальные переменные "умирают" и освобождают память. Поэтому Set "Переменная" = Nothing для локальных переменных делать не обязательно (конечно, если сама процедура не жутко жадная в смысле пожирания памяти){/post}{/quote}  
Алекс, я согласен с Вами, но считается хорошим тоном в прогаммировании такие переменные убивать после объявления.  
Это так же как с оператором Goto. Вроде и работает как надо, но не рекомендуют(и тон плохой). Сам никогда не использую:-) Если уж приспичило, то Gosub-Return. С уважением, Сергей.
Я сам - дурнее всякого примера! ...
 
Ну вот, за Димой разве успеешь.... Могу только дополнить - не только в ВБА. ВБ5, ВБ6 тоже грешили этим. И сами разработчики рекомендовали делать ТАК явно.
Я сам - дурнее всякого примера! ...
 
По поводу "правил хорошего тона" при программировании абсолютно с вами согласен. Это как ржавчина на кузове автомобиля: на скорость не влияет, но и самому смотреть противно, и похвастаться перед другими как-то стыдно...  
Я сам всегда использую явное определение переменных через Dim (Option Explicit у меня ставится по умолчанию)и "убиение" по мере отпадания в них нужды переменных, установленных через Set.  
А уж про комментарии и говорить нечего! Без них и на свою-то программу через месяц будешь долго смотреть и "чесать репу" а что там, как и зачем? А уж про чужие программы и говорить нечего. Некоторые гуру форума, к сожалению иногда грешат примерами без комментариев. Я, если эти примеры кладу к себе в "копилку", то всегда прописываю в макросах что это за модуль, кем написан и откуда взят (ссылка на пост).
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
EducatedFool, спасибо Вам за ответы, но зачем иронизировать или Вы не заметили "...на доступном языке"?!  
 
Спасибо Вам, Алексей, Дмитрий и Сергей!  
 
P.S. теперь все понятно и просто.
<FONT COLOR="CadetBlue">
 
Алекс, я покраснел прочитав:  "к сожалению иногда грешат примерами без комментариев." Правда, неудобно. Но я так и читаю чужой код. Не глядя на комменты. Самоучка - и так привык. С Вами абсолютно согласен(только вчера azam-у объяснял полезность комментов), но себя, боюсь, уже не исправлю:-( Я на этом форуме мнооооогому пытаюсь научиться. В первой строке списка доброта Юрий М, его умение общаться, не обижая других. Мне бы так. Ладно, что-то я совсем расчувствовался(это из мультика, не подумайте).
Я сам - дурнее всякого примера! ...
 
зря вы на goto ополчились  :)  иногда без него никак..  
 
коммменты, да, ленюсь писать, каюсь :)
Живи и дай жить..
 
Я тоже не понимаю, чем GoTo не угодил. Да, плохо смотрится, когда таких переходов куча и они используются нецелесообразно. Но иногда ведь действительно нужен этот переход и если без него, то наоборот, код смотрится более неграмотно и загроможденно, потому что приходится выдумать обходные пути. И не помню, чтобы кто-то рекомендовал его не использовать.  
 
Вывод: не брезгуйте этим оператором - он бывает весьма полезен и не вреден в умеренных количествах.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Мне лично комменты писать откровенно лень. Прописывать комменты бывает намного дольше, чем сами коды. Для себя я пишу с комментами, а в форум - лень....  
 
P.S. Исправляться не собираюсь. Пока, во всяком случае.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
{quote}{login=слэн}{date=10.06.2010 12:52}{thema=}{post}зря вы на goto ополчились  :)  иногда без него никак..  
коммменты, да, ленюсь писать, каюсь :){/post}{/quote}  
Хоть один случай бы увидеть, когда никак. Видимо я один понимаю вредность этого оператора.  
Ну -  
http://khpi-iip.mipk.kharkiv.edu/library/extent/dijkstra/pp/ewd215.html  
почитайте(прям сейчас нашел, не умею, как Дима, доходчиво объяснять)
Я сам - дурнее всякого примера! ...
 
Но что-то есть в этом GoTo... В AutoIt с 3-й версии его вообще убрали, тоже мучался, так я и не понял, как сподручнее обходить, местами вообще придуманный алгоритм менять приходилось...
 
{quote}{login=Hugo}{date=10.06.2010 02:04}{thema=}{post}Но что-то есть в этом GoTo... В AutoIt с 3-й версии его вообще убрали, тоже мучался, так я и не понял, как сподручнее обходить, местами вообще придуманный алгоритм менять приходилось...{/post}{/quote}  
Вопрос структурирования прогаммы. А вообще-то я рад, что привлек к обсуждению таких уважаемых на форуме ребят. С вами уютно!
Я сам - дурнее всякого примера! ...
 
вот пример когда никак:  
 
on error goto    
 
 
вот пример, когда как, но не красиво и yt'aatrnbdyj^  
 
 
for i=1 to n  
for j=1 to m  
if a(i,j)=0 then goto ext  
next j  
next i  
ext:    
 
можно, конечно, функцией оформить, с использованием exit function, но на вызов функции тратится время
Живи и дай жить..
 
{quote}{login=слэн}{date=10.06.2010 02:12}{thema=}{post}  
вот пример, когда как, но не красиво и yt'aatrnbdyj^{/post}{/quote}  
Согласен. Вот мой пример:  
http://forum.ixbt.com/topic.cgi?id=23:31044
 
Слэн(хочу Вас все же называть с большой буквы), плохой пример. Во всех примерах мэтров программирования goto используется только для определения ошибки, с последующим Exit Sub. То есть goto на выход. И я в жизни не встречал ситуаций, когда нельзя было избежать его. Поначалу(это еще в 2000 где-то), напрягало, помню. Зато сейчас даже в мыслях не бывает. Вот так мозги перестроились. Прсто блок стоит.
Я сам - дурнее всякого примера! ...
 
{quote}{login=Казанский}{date=10.06.2010 02:17}{thema=Re: }{post}{quote}{login=слэн}{date=10.06.2010 02:12}{thema=}{post}  
вот пример, когда как, но не красиво и yt'aatrnbdyj^{/post}{/quote}  
Согласен. Вот мой пример:  
http://forum.ixbt.com/topic.cgi?id=23:31044{/post}{/quote}  
Это пример, когда нельзя?  
Set s = Range("a:a").Find("конь")  
If Not s Is Nothing Then  
   If s.Offset(0, 1) = "белый" Then  
       answer = "YES"  
   Else  
       GoTo label1  
   End If  
Else  
label1:  
   answer = "NO"  
End If  
Как минимум две строки лишние и одной недостает(Set s = Nothing).
Я сам - дурнее всякого примера! ...
 
вообщето алгоритм можно записать так:  
 
Sub t()  
anser = "NO"  
Set s = Range("a:a").Find("конь")  
If s Is Nothing Then Exit Sub  
If s.Offset(0, 1) = "белый" Then answer = "YES"  
End Sub  
 
что короче, яснее и быстрее  
 
 
но я уже приводил на форуме множество раз алгоритмы, с использованием on error goto ( и в паре с ним ще и просто goto) - да, можно сделать по-другому, но так быстрее.. зачем же делать хуже, но без goto ?
Живи и дай жить..
 
можно еще так:  
 
Sub t()  
on error goto ex  
anser = "NO"  
If Range("a:a").Find("конь").Offset(0, 1) = "белый" Then answer = "YES"  
ex:End Sub
Живи и дай жить..
 
Слэн, Вы читаете, что я пишу?  
"Во всех примерах мэтров программирования goto используется только для определения ошибки, с последующим Exit Sub. То есть goto на выход."  
И как мое утверждение конфликтует с Вашим: "on error goto"? :-)
Я сам - дурнее всякого примера! ...
 
В слове anser буква W пропущена, но это уже флуд. Если честно - боюсь, Диме позавчера спать не давали, оффтопили по полной. Чувствую, психанет и начнет стирать все без разбора. А главное по делу! Хотя этот топик флудом не считаю. Мы, как программеры, обсуждаем целесообразность применения оператора goto.
Я сам - дурнее всякого примера! ...
 
Эммм...мммм...а хорошая тема получилось :)  
 
Спасибо и за "GoTo" ;)
<FONT COLOR="CadetBlue">
 
Ну, я бы не был так категоричен, утверждая, что обсуждение целесообразности применения оператора goto в топике с названием "Описание применения "Set"" не является оффтопом...  
Бедный топик-стартер уже давно наверное забросил читать эту тему ввиду распухания головы от развёрнутой здесь продвинутыми программистами дискуссии...
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Да... А топик-стартер-то, оказывается, ещё не спит, а тему-то просматривает...
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
<но я уже приводил на форуме множество раз алгоритмы, с использованием on error goto ( и в паре с ним еще и просто goto)>  
 
вот пример из моего решателя балды: (уж поверьте - оптимизировал-оптимизировал :) )  
 
Sub fnd(ByVal s$)  
Dim lens&  
lens = Len(s)  
'If lens < maxw Then Exit Sub  
Dim arr_r, pos&, n&, k&, sr$  
Dim s_n$, s_e$  
If s = "?êî" Then  
   pos = pos  
End If  
On Error Resume Next  
     
   pos = InStr(1, s, "?")  
   s_n = Left(s, pos - 1)  
   s_e = Right(s, lens - pos)  
   ReDim arr_r(1 To 16)  
For k = 1 To 33  
   On Error GoTo er1  
   sr = s_n & arr_abc(k) & s_e  
   If cwt(sr) Then:  
   On Error GoTo n1  
   If chad(sr) = 0 Then GoTo nxt1  
n1: n = n + 1  
   If n > UBound(arr_r) Then ReDim Preserve arr_r(1 To n + 16)  
   arr_r(n) = sr  
   If n > UBound(arr_letter) Then ReDim Preserve arr_letter(1 To n + 99)  
   arr_letter(n) = arr_abc(k)  
   Resume nxt1  
er1: Resume nxt1  
nxt1: Next  
   sr = StrReverse(s)  
   pos = Len(s_e)  
   s_n = Left(sr, pos)  
   s_e = Right(sr, lens - pos - 1)  
On Error GoTo er2  
For k = 1 To 33  
   On Error GoTo er2  
   sr = s_n & arr_abc(k) & s_e  
   If cwt(sr) Then:  
   On Error GoTo n2  
   If chad(sr) = 0 Then GoTo nxt2  
n2:  n = n + 1  
   If n > UBound(arr_r) Then ReDim Preserve arr_r(1 To n + 16)  
   arr_r(n) = sr  
   If n > UBound(arr_letter) Then ReDim Preserve arr_letter(1 To n + 99)  
   arr_letter(n) = arr_abc(k)  
   Resume nxt2  
er2: Resume nxt2  
nxt2: Next  
If n = 0 Then Exit Sub  
'If lens > maxw + 2 Then  
'    maxw = lens - 2  
'    k = 7  
'    Cells(k, 1).Resize(n, 4).Insert Shift:=xlDown  
'Else  
   k = Cells(Rows.Count, 1).End(xlUp).Row + 1  
'End If  
Application.EnableEvents = False  
Cells(k, 1).Resize(n) = Application.Transpose(arr_r)  
Cells(k, 3).Resize(n) = Cells(i, j).Address(0, 0)  
Cells(k, 2).Resize(n) = lens  
Cells(k, 4).Resize(n) = Application.Transpose(arr_letter)  
Application.EnableEvents = True  
numn = numn + n  
numv = numv + 66  
End Sub
Живи и дай жить..
 
To Alex_ST: Ну вот. пришел поручик Ржевский и все опошлил:-)  
При чем тут топикстартер... Я не понимаю:-)
Я сам - дурнее всякого примера! ...
Страницы: 1 2 3 След.
Читают тему
Наверх