Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Задать Set в не процедур - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Задать Set в не процедур (Макросы/Sub)
Задать Set в не процедур
ZetMenChavo Дата: Суббота, 18.06.2022, 04:36 | Сообщение № 1
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 159
Репутация: 7 ±
Замечаний: 0% ±

Excel 2010
Здравствуйте. Иногда, при написании кода, мне прихоидиться использовать объекты Application и WorksheetFunction.
В плане оформления, там где сильно часто нужно было использовать тот же WorksheetFunction, код становился неприглядным.
Я нашёл способ как красивее оформить код, загнав эти объекты в переменные
[vba]
Код
'До
Sub dfhsgh()
    Debug.Print WorksheetFunction.Max(7, 4)
End Sub
'После
Sub dfhsghn()
    Dim WF As WorksheetFunction
    Set WF = WorksheetFunction
    
    Debug.Print WF.Max(7, 4)
End Sub
[/vba]

А ещё, что бы каждый раз не прописывать Dim, сделал его публичным.
[vba]
Код
Public WF As WorksheetFunction
[/vba]
Вопрос мой в том, можно ли и
[vba]
Код
Set WF = WorksheetFunction
[/vba]
сделать публичной, что бы каждый раз не прописывать эту строку в процедурах.
 
Ответить
СообщениеЗдравствуйте. Иногда, при написании кода, мне прихоидиться использовать объекты Application и WorksheetFunction.
В плане оформления, там где сильно часто нужно было использовать тот же WorksheetFunction, код становился неприглядным.
Я нашёл способ как красивее оформить код, загнав эти объекты в переменные
[vba]
Код
'До
Sub dfhsgh()
    Debug.Print WorksheetFunction.Max(7, 4)
End Sub
'После
Sub dfhsghn()
    Dim WF As WorksheetFunction
    Set WF = WorksheetFunction
    
    Debug.Print WF.Max(7, 4)
End Sub
[/vba]

А ещё, что бы каждый раз не прописывать Dim, сделал его публичным.
[vba]
Код
Public WF As WorksheetFunction
[/vba]
Вопрос мой в том, можно ли и
[vba]
Код
Set WF = WorksheetFunction
[/vba]
сделать публичной, что бы каждый раз не прописывать эту строку в процедурах.

Автор - ZetMenChavo
Дата добавления - 18.06.2022 в 04:36
Апострофф Дата: Суббота, 18.06.2022, 07:41 | Сообщение № 2
Группа: Проверенные
Ранг: Обитатель
Сообщений: 444
Репутация: 122 ±
Замечаний: 0% ±

Excel 1997
ZetMenChavo, в модуле ЭтаКнига напишите
[vba]
Код
Private Sub Workbook_Open()
Set WF = WorksheetFunction
End Sub
[/vba]
 
Ответить
СообщениеZetMenChavo, в модуле ЭтаКнига напишите
[vba]
Код
Private Sub Workbook_Open()
Set WF = WorksheetFunction
End Sub
[/vba]

Автор - Апострофф
Дата добавления - 18.06.2022 в 07:41
ZetMenChavo Дата: Воскресенье, 19.06.2022, 00:38 | Сообщение № 3
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 159
Репутация: 7 ±
Замечаний: 0% ±

Excel 2010
Апострофф, интересный способ. Только я заметил один минус. Если в каком то макросе случается ошибка, то Set сбрасывается и перестают работать все макросы использующие эту переменную,
до тех пор пока снова, уже в ручную, не запустить ваш макрос.

Я ещё поэксперементирова с тем что знаю о присвоении переменных. Во первых обнаружил что вместо WorksheetFunction, можно использовать Application,
Попытался использовать следующие строчки:
[vba]
Код
Public WF As New WorksheetFunction
Public Ap As New Application
[/vba]
На первую, с WorksheetFunction, vba ругается, вторая по большей части работает, функции там можно использовать,
но при попытки узнать имя нажатой фигуры выдаёт ошибку.
[vba]
Код
'Без доп.перемененных
Sub sfnsfgnsgn()
    Debug.Print Application.Caller    '"Овал 2"
    Debug.Print Application.Max(2, 3) ' 3
End Sub

'Вариант 1
Public Ap As Application
Sub sfnsfgnsgn()
    Set Ap = Application     'Приходиться писать Set
    Debug.Print Ap.Caller    'Овал 2"
    Debug.Print Ap.Max(2, 3) ' 3
End Sub

'Вариант 2
Public Ap As New Application
Sub sfnsfgnsgn()
    'Уже без Set, но Caller не работает
    Debug.Print Ap.Caller    '"Error 2023"
    Debug.Print Ap.Max(2, 3) ' 3
End Sub
[/vba]


Сообщение отредактировал ZetMenChavo - Воскресенье, 19.06.2022, 00:41
 
Ответить
СообщениеАпострофф, интересный способ. Только я заметил один минус. Если в каком то макросе случается ошибка, то Set сбрасывается и перестают работать все макросы использующие эту переменную,
до тех пор пока снова, уже в ручную, не запустить ваш макрос.

Я ещё поэксперементирова с тем что знаю о присвоении переменных. Во первых обнаружил что вместо WorksheetFunction, можно использовать Application,
Попытался использовать следующие строчки:
[vba]
Код
Public WF As New WorksheetFunction
Public Ap As New Application
[/vba]
На первую, с WorksheetFunction, vba ругается, вторая по большей части работает, функции там можно использовать,
но при попытки узнать имя нажатой фигуры выдаёт ошибку.
[vba]
Код
'Без доп.перемененных
Sub sfnsfgnsgn()
    Debug.Print Application.Caller    '"Овал 2"
    Debug.Print Application.Max(2, 3) ' 3
End Sub

'Вариант 1
Public Ap As Application
Sub sfnsfgnsgn()
    Set Ap = Application     'Приходиться писать Set
    Debug.Print Ap.Caller    'Овал 2"
    Debug.Print Ap.Max(2, 3) ' 3
End Sub

'Вариант 2
Public Ap As New Application
Sub sfnsfgnsgn()
    'Уже без Set, но Caller не работает
    Debug.Print Ap.Caller    '"Error 2023"
    Debug.Print Ap.Max(2, 3) ' 3
End Sub
[/vba]

Автор - ZetMenChavo
Дата добавления - 19.06.2022 в 00:38
Апострофф Дата: Воскресенье, 19.06.2022, 12:50 | Сообщение № 4
Группа: Проверенные
Ранг: Обитатель
Сообщений: 444
Репутация: 122 ±
Замечаний: 0% ±

Excel 1997
там где сильно часто нужно было использовать тот же WorksheetFunction, код становился неприглядным.

Позвольте не согласиться. WorksheetFunction понятнее(нагляднее) какого-то WF
А про "приглядность" - на вкус и цвет товарищей нет :'(
 
Ответить
Сообщение
там где сильно часто нужно было использовать тот же WorksheetFunction, код становился неприглядным.

Позвольте не согласиться. WorksheetFunction понятнее(нагляднее) какого-то WF
А про "приглядность" - на вкус и цвет товарищей нет :'(

Автор - Апострофф
Дата добавления - 19.06.2022 в 12:50
ZetMenChavo Дата: Воскресенье, 19.06.2022, 13:44 | Сообщение № 5
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 159
Репутация: 7 ±
Замечаний: 0% ±

Excel 2010
Апострофф,
[vba]
Код
'Вариант 1
VibrnParam = WorksheetFunction.Max(1, WorksheetFunction.Min(3, VibrnParam + KC))
'Вариант 2
VibrnParam = WF.Max(1, WF.Min(3, VibrnParam + KC))
[/vba]
Второй вариант читать легче, когда лишний текст в названии объекта запакован в более компактную форму.
 
Ответить
СообщениеАпострофф,
[vba]
Код
'Вариант 1
VibrnParam = WorksheetFunction.Max(1, WorksheetFunction.Min(3, VibrnParam + KC))
'Вариант 2
VibrnParam = WF.Max(1, WF.Min(3, VibrnParam + KC))
[/vba]
Второй вариант читать легче, когда лишний текст в названии объекта запакован в более компактную форму.

Автор - ZetMenChavo
Дата добавления - 19.06.2022 в 13:44
ZetMenChavo Дата: Воскресенье, 19.06.2022, 13:52 | Сообщение № 6
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 159
Репутация: 7 ±
Замечаний: 0% ±

Excel 2010
А ещё вот к примеру
[vba]
Код
Public CoStS() As ColorStops   'Cells(1).Interior.Gradient.ColorStops
Public CoSt() As ColorStop     'Cells(1).Interior.Gradient.ColorStops(1)
Public TxRng() As TextRange2   'ActiveSheet.Shapes(k).TextFrame2.TextRange
Public FilFor() As FillFormat  'ActiveSheet.Shapes(k).Fill
Public ColFor() As ColorFormat 'ActiveSheet.Shapes(k).Fill.GradientStops(1).Color
[/vba]
Словом, возможность заключать значения и объекты в компактные переменные, не для бесполезного дела придумана. :)
 
Ответить
СообщениеА ещё вот к примеру
[vba]
Код
Public CoStS() As ColorStops   'Cells(1).Interior.Gradient.ColorStops
Public CoSt() As ColorStop     'Cells(1).Interior.Gradient.ColorStops(1)
Public TxRng() As TextRange2   'ActiveSheet.Shapes(k).TextFrame2.TextRange
Public FilFor() As FillFormat  'ActiveSheet.Shapes(k).Fill
Public ColFor() As ColorFormat 'ActiveSheet.Shapes(k).Fill.GradientStops(1).Color
[/vba]
Словом, возможность заключать значения и объекты в компактные переменные, не для бесполезного дела придумана. :)

Автор - ZetMenChavo
Дата добавления - 19.06.2022 в 13:52
Gustav Дата: Понедельник, 20.06.2022, 03:04 | Сообщение № 7
Группа: Друзья
Ранг: Участник клуба
Сообщений: 2702
Репутация: 1123 ±
Замечаний: 0% ±

начинал с Excel 4.0, видел 2.1
Попытался использовать следующие строчки:
Public WF As New WorksheetFunction
Public Ap As New Application

На первую, с WorksheetFunction, vba ругается

Можно объявить в начале модуля публичную функцию с желаемым коротким идентификатором, ВОЗВРАЩАЮЩУЮ объект WorksheetFunction и дальше использовать ее хоть в процедурах, хоть в Окне отладки (если случится ошибка, работоспособность сохранится; IntelliSense по точке также работает):
[vba]
Код
Option Explicit

Public Function wf() As WorksheetFunction
    Set wf = WorksheetFunction
End Function

Sub test()
    Debug.Print wf.Sum(23, 17, 20)    '= 60
End Sub
[/vba]


МОИ: Ник, Tip box: 41001663842605
 
Ответить
Сообщение
Попытался использовать следующие строчки:
Public WF As New WorksheetFunction
Public Ap As New Application

На первую, с WorksheetFunction, vba ругается

Можно объявить в начале модуля публичную функцию с желаемым коротким идентификатором, ВОЗВРАЩАЮЩУЮ объект WorksheetFunction и дальше использовать ее хоть в процедурах, хоть в Окне отладки (если случится ошибка, работоспособность сохранится; IntelliSense по точке также работает):
[vba]
Код
Option Explicit

Public Function wf() As WorksheetFunction
    Set wf = WorksheetFunction
End Function

Sub test()
    Debug.Print wf.Sum(23, 17, 20)    '= 60
End Sub
[/vba]

Автор - Gustav
Дата добавления - 20.06.2022 в 03:04
ZetMenChavo Дата: Понедельник, 20.06.2022, 08:50 | Сообщение № 8
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 159
Репутация: 7 ±
Замечаний: 0% ±

Excel 2010
Gustav, ОГРОМЕННОЕ СПАСИБО hands Работает именно так как и хотелось, даже с Application вместо WorksheetFunction. Даже не обязательно в одном модуле держать, что дополнительно облегчает написание макросов в разных модулях :)
 
Ответить
СообщениеGustav, ОГРОМЕННОЕ СПАСИБО hands Работает именно так как и хотелось, даже с Application вместо WorksheetFunction. Даже не обязательно в одном модуле держать, что дополнительно облегчает написание макросов в разных модулях :)

Автор - ZetMenChavo
Дата добавления - 20.06.2022 в 08:50
ZetMenChavo Дата: Понедельник, 20.06.2022, 08:54 | Сообщение № 9
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 159
Репутация: 7 ±
Замечаний: 0% ±

Excel 2010
Апострофф, Вам тоже спасибо за попытки решить мой вопрос. Полезно было узнать про то как запускать макрос при открытии книги и то что значения публичных переменных сохраняются, даже если ни один макрос не запущен :)
 
Ответить
СообщениеАпострофф, Вам тоже спасибо за попытки решить мой вопрос. Полезно было узнать про то как запускать макрос при открытии книги и то что значения публичных переменных сохраняются, даже если ни один макрос не запущен :)

Автор - ZetMenChavo
Дата добавления - 20.06.2022 в 08:54
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Задать Set в не процедур (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!