Хочу задать публичной константой массив типа Public Const FFF_arrCol = Array(1,2,3). Интернет говорит, что подобное сделать нельзя и нужно задавать строку с разделителями или писать функцию, возвращающую всегда один и тот же массив.
Действительно ли массив не может быть константой и как вы делаете в подобных случаях?…
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
vikttur, Public FFF_arrCol: FFF_arrCol = Array(3, 4, 11, 9) — так не даёт, если правильно понял
Пока всё-таки сделал через функцию. Почти тоже самое
Код
Public FFF_arrTblNames(), FFF_arrCol()
'----------------------------------------------------------------------------------------------------
Public Function FFF_GetPublicArrays()
FFF_arrTblNames = Array("_est", "_part", "_rate", "_det")
FFF_arrCol = Array(3, 4, 11, 9)
End Function
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
да вроде ничего сложного. У вас просто 1 массив, а у меня 2)) функция запускается 1 раз - при открытии файла. Таким образом, получается тоже самое, что константа, только сбросится в случае ошибки (в отличие от неё).
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Jack Famous, Кроме того что переменная отличается от константы тем, что ей можно присвоить другое значение, константа просто заменяется при компиляции тем что прописано, но все ж только использую значения. Это позволяет и код делать читаемым, ведь не даром есть vbCrLf ….. И прописать значение один раз.
а с чего вы взяли, что мне одного достаточно? У меня их вообще 4 и они никак не дублируют друг-друга)) А в "константах" нужны, потому что эти массивы используются в разных макросах, но при этом должны быть идеинтичны - проще же править в 1 месте, не так ли?)
не видно в окне вызова макросов (Alt+F8). Во всём остальном процедуры и функции равны (на практике). Ну ещё функция может вернуть что-либо, в отличие от процедуры
БМВ, вот я и хотел как-нибудь "массив прописать" - удобно же было бы)
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
а Private уже стало можно вызывать из другого модуля?
Цитата
vikttur: Из каждой процедуры, где используется массив, запуск процедуру
да - можно и так, но мне проще сразу определить все при запуске книги. Просто нужно быть уверенным, что во время работы макросов не произойдёт ошибки. Если такой уверенности нет, то вызывать в каждом, как вы и говорите. А вызывать 1 общий или для каждого - мне проще 1 и разницы в скорости нет (мгновенно)
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
в зависимости от задачи от условий только это разговор для другой темы: как задать массив констант? ответ: любым известным и удобным Вам способом обьявите переменную массива и присвойте его элементам значения констант
а ответ НИКАК - полностью исчерпывает возможные ответы на поставленный в этой теме вопрос.
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
— популярный при поиске, но, всё-таки, ДРУГОЙ вопрос. Спасибо
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Public FFF_arrColInitialized As Boolean
Public FFF_arrCol
Sub LoadFFF_arrCol()
If FFF_arrColInitialized Then Exit Sub
FFF_arrCol = Array(1,2,3)
'...
FFF_arrColInitialized = True
end sub
Sub main
Call LoadFFF_arrCol
'…..
end sub
И можно вызывать хоть в каждой процедуре его использующей.
, а также через Alt+F8, чего я не хочу)) В принципе, я так и делаю, только функциями — чем они вам не нравятся?
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Если лень заморачиваться именно отдельными функциями на присвоение значений массиву каждый раз, можно классы использовать. В стандартный модуль:
Код
Option Explicit
Public aPubAr
Sub CheckTypeArr()
Dim caa As New clsArr
Debug.Print aPubAr(0)
End Sub
в новый модуль класса(который называется clsArr):
Код
Option Explicit
Private Sub Class_Initialize()
aPubAr = Array(1, 2, "three")
End Sub
Private Sub Class_Terminate()
aPubAr = Empty
End Sub
Здесь массив будет заполняться при каждом создании нового класса(Dim caa As New clsArr). Можно заполнять так сразу все массивы в одном классе, можно на каждый массив свой класс. Зависит от задач.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Ну пусть будет Функция, которую можно будет вызвать с листа :-) если она Public. Только обращаю внимание, что LoadFFF_arrCol проинициализирует то что нужно один раз. Далее вызвать можно, но смысл.
В общем, я понял, что константой массив задать нельзя, поэтому задаём переменную и присваиваем ей значения функцией или процедурой (не суть важно). По примерам спасибо - буду думать, может что и приплету к себе)) классы меня давно интригуют, но пока что безуспешно
Всем большущее спасибо! Если у кого-то ещё есть мысли, то с удовольствием почитаю
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Jack Famous написал: крайне неудобная вещь (как минимум нет подсказок)
И в чём же неудобства? Про какие подсказки разговор, если вместо Call использовать Run?
Цитата
Jack Famous написал: мне проще сразу определить все при запуске книги
Private Sub Workbook_Open() в помощь: при открытии книги присвоили двум (четырём) глобальным переменным значения и используем эти массивы в любом модуле. Повторю вопрос: в чём в данном случае (с массивами) прелесть именно функции?
Цитата
Jack Famous написал: а Private уже стало можно вызывать из другого модуля?
Юрий М, как по мне - те же яйца - только в профиль. Я функцией присваиваю. Вы макросом. Можно и по событию. Только, если нет полной уверенности, что не будет ошибок, которые "сбросят" переменные, то даже по событию надо вызывать процедуру или функцию, а не присваивать руками. Разницы, наверное, никакой. Я привык функцией, в основном. Её не видно в окне запуска макроса, она может возвращать значения. Это для меня плюсы. Можно вызвать с листа - ну будет ошибка в ячейке в крайнем случае. Хотя пользователи обычно не ищут макро функции, а вот окном вызова макроса пользуются
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Jack Famous написал: Её не видно в окне запуска макроса
Если в начало модуля поставить
Код
Option Private Module
то макросы этого модуля нельзя будет запускать из других проектов (с помощью метода Application.Run) и они не будут видны при нажатии Alt+F8. Вызывать из других модулей этого же проекта можно.
sokol92, а вот это новая для меня и очень крутая штука - спасибо большое! Уже точно знаю, где она будет очень уместна…
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄