Здравствуйте. Иногда, при написании кода, мне прихоидиться использовать объекты 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
Апострофф, интересный способ. Только я заметил один минус. Если в каком то макросе случается ошибка, то 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]
Апострофф, интересный способ. Только я заметил один минус. Если в каком то макросе случается ошибка, то 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
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
Попытался использовать следующие строчки: 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
Попытался использовать следующие строчки: 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
Gustav, ОГРОМЕННОЕ СПАСИБО Работает именно так как и хотелось, даже с Application вместо WorksheetFunction. Даже не обязательно в одном модуле держать, что дополнительно облегчает написание макросов в разных модулях
Gustav, ОГРОМЕННОЕ СПАСИБО Работает именно так как и хотелось, даже с Application вместо WorksheetFunction. Даже не обязательно в одном модуле держать, что дополнительно облегчает написание макросов в разных модулях ZetMenChavo
Апострофф, Вам тоже спасибо за попытки решить мой вопрос. Полезно было узнать про то как запускать макрос при открытии книги и то что значения публичных переменных сохраняются, даже если ни один макрос не запущен
Апострофф, Вам тоже спасибо за попытки решить мой вопрос. Полезно было узнать про то как запускать макрос при открытии книги и то что значения публичных переменных сохраняются, даже если ни один макрос не запущен ZetMenChavo