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

 

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

  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_, DrMini  
Задать Set в не процедур
ZetMenChavo Дата: Суббота, 18.06.2022, 04:36 | Сообщение № 1
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 165
Репутация: 7 ±
Замечаний: 0% ±

Excel 2010
Здравствуйте. Иногда, при написании кода, мне прихоидиться использовать объекты Application и WorksheetFunction.
В плане оформления, там где сильно часто нужно было использовать тот же WorksheetFunction, код становился неприглядным.
Я нашёл способ как красивее оформить код, загнав эти объекты в переменные

'До
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



А ещё, что бы каждый раз не прописывать Dim, сделал его публичным.

Public WF As WorksheetFunction


Вопрос мой в том, можно ли и

Set WF = WorksheetFunction


сделать публичной, что бы каждый раз не прописывать эту строку в процедурах.
 
Ответить
СообщениеЗдравствуйте. Иногда, при написании кода, мне прихоидиться использовать объекты 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
Группа: Проверенные
Ранг: Обитатель
Сообщений: 467
Репутация: 129 ±
Замечаний: 0% ±

Excel 1997
ZetMenChavo, в модуле ЭтаКнига напишите

Private Sub Workbook_Open()
Set WF = WorksheetFunction
End Sub

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

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

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

Я ещё поэксперементирова с тем что знаю о присвоении переменных. Во первых обнаружил что вместо WorksheetFunction, можно использовать Application,
Попытался использовать следующие строчки:

Public WF As New WorksheetFunction
Public Ap As New Application


На первую, с WorksheetFunction, 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



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

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

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

Excel 1997
Цитата ZetMenChavo, 18.06.2022 в 04:36, в сообщении № 1 ( писал(а)):
там где сильно часто нужно было использовать тот же WorksheetFunction, код становился неприглядным.

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

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

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

Excel 2010
Апострофф,

'Вариант 1
VibrnParam = WorksheetFunction.Max(1, WorksheetFunction.Min(3, VibrnParam + KC))
'Вариант 2
VibrnParam = WF.Max(1, WF.Min(3, VibrnParam + KC))


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

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

Excel 2010
А ещё вот к примеру

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]
Public CoStS() As ColorStops   'Cells(1).Interior.Gradient.ColorStopsPublic CoSt() As ColorStop     'Cells(1).Interior.Gradient.ColorStops(1)Public ТxRng() As TextRange2   'ActiveSheet.Shapes(k).TextFrame2.TextRangePublic FilFor() As FillFormat  'ActiveSheet.Shapes(k).FillPublic ColFor() As ColorFormat 'ActiveSheet.Shapes(k).Fill.GradientStops(1).Color
[/vba]
Словом, возможность заключать значения и объекты в компактные переменные, не для бесполезного дела придумана. :)

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

начинал с Excel 4.0, видел 2.1
Цитата ZetMenChavo, 19.06.2022 в 00:38, в сообщении № 3 ( писал(а)):
Попытался использовать следующие строчки:
Public WF As New WorksheetFunction
Public Ap As New Application

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

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

Option Explicit

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

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



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

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

Можно объявить в начале модуля публичную функцию с желаемым коротким идентификатором, ВОЗВРАЩАЮЩУЮ объект WorksheetFunction и дальше использовать ее хоть в процедурах, хоть в Окне отладки (если случится ошибка, работоспособность сохранится; IntelliSense по точке также работает):
[vba]
Option ExplicitPublic Function wf() As WorksheetFunction    Set wf = WorksheetFunctionEnd FunctionSub test()    Debug.Print wf.Sum(23, 17, 20)    '= 60End Sub
[/vba]

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

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

Автор - ZetMenChavo
Дата добавления - 20.06.2022 в 08:54
  • Страница 1 из 1
  • 1
Поиск:

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