Страницы: 1 2 След.
RSS
Как задать константу массива
 
Доброго времени суток, Планетяне!

Хочу задать публичной константой массив типа Public Const FFF_arrCol = Array(1,2,3).
Интернет говорит, что подобное сделать нельзя и нужно задавать строку с разделителями или писать функцию, возвращающую всегда один и тот же массив.

Действительно ли массив не может быть константой и как вы делаете в подобных случаях?…
Изменено: Jack Famous - 07.06.2019 13:19:58
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Массив - не константа.
Передавать из одной процедуры в другую или объявить массив публичной переменной
 
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
Изменено: Jack Famous - 07.06.2019 13:27:40
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
так не даёт
А кто разрешал выполнять строку кода вне процедуры?

Зачем усложнять?
Код
Public FFF_arrCol()

Sub FillingArray()
    FFF_arrCol = Array("_est", "_part", "_rate", "_det")
End Sub
 
Цитата
vikttur: А кто разрешал выполнять строку кода вне процедуры?
вот и я также подумал)) значит, неправильно понял…
Цитата
vikttur: Зачем такие сложности?
да вроде ничего сложного. У вас просто 1 массив, а у меня 2)) функция запускается 1 раз - при открытии файла. Таким образом, получается тоже самое, что константа, только сбросится в случае ошибки (в отличие от неё).
Изменено: Jack Famous - 07.06.2019 13:41:46
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал: да вроде ничего сложного.
Добавьте еще 5-6 массивов :)
 
Цитата
vikttur: Добавьте еще 5-6 массивов
не понимаю, к чему вы клоните)
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
К тому, что там, где достаточно одного массива, не нужно засорять память другими

Цитата
тоже самое, что константа, только сбросится в случае ошибки (в отличие от неё).
Если значений мало, можно задать их отдельными константами, использовать или по отдельности, или в процедуре формировать массив.

P.S. Хотя, отдельные константы - глупость. Можно же формировать масив прямо в процедуре.
 
Цитата
Jack Famous написал:
функция запускается 1 раз - при открытии файла.
Джек, а в чём прелесть именно функцией? Почему бы в обычной процедуре один раз не присвоить значение глобальной переменной?
 
Jack Famous, Кроме того что переменная отличается от константы тем, что ей можно присвоить другое значение, константа просто заменяется при компиляции тем что прописано, но все ж только использую значения. Это позволяет и код делать читаемым, ведь не даром есть vbCrLf ….. И прописать значение один раз.
Изменено: БМВ - 07.06.2019 14:01:07
По вопросам из тем форума, личку не читаю.
 
Цитата
Jack Famous написал:
Как задать константу массива
никак
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
vikttur: достаточно одного массива
а с чего вы взяли, что мне одного достаточно? У меня их вообще 4 и они никак не дублируют друг-друга))
А в "константах" нужны, потому что эти массивы используются в разных макросах, но при этом должны быть идеинтичны - проще же править в 1 месте, не так ли?)
Цитата
Юрий М: в чём прелесть именно функцией
не видно в окне вызова макросов (Alt+F8). Во всём остальном процедуры и функции равны (на практике). Ну ещё функция может вернуть что-либо, в отличие от процедуры

БМВ, вот я и хотел как-нибудь "массив прописать" - удобно же было бы)

Цитата
Ігор Гончаренко: никак
а вы как делаете?
Изменено: Jack Famous - 07.06.2019 14:06:08
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
не видно в окне вызова макросов (Alt+F8).
А Private уже отменили? ))
 
Цитата
Jack Famous написал: а с чего вы взяли, что мне одного достаточно?
Писал только о процедуре в сообщении. Там не нужжно использовать два массива.

Цитата
Jack Famous написал: проще же править в 1 месте, не так ли?
Согласен. Из каждой процедуры, где используется массив, запуск процедуру из сообщения №4
 
Цитата
Юрий М: А Private уже отменили?
а Private уже стало можно вызывать из другого модуля?  :D
Цитата
vikttur: Из каждой процедуры, где используется массив, запуск процедуру
да - можно и так, но мне проще сразу определить все при запуске книги. Просто нужно быть уверенным, что во время работы макросов не произойдёт ошибки. Если такой уверенности нет, то вызывать в каждом, как вы и говорите. А вызывать 1 общий или для каждого - мне проще 1  и разницы в скорости нет (мгновенно)
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
а вы как делаете?
в зависимости от задачи от условий
только это разговор для другой темы:
как задать массив констант?
ответ:
любым известным и удобным Вам способом обьявите переменную массива и присвойте его элементам значения констант

а ответ НИКАК - полностью исчерпывает возможные ответы на поставленный в этой теме вопрос.
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
Ігор Гончаренко: как задать массив констант?
— популярный при поиске, но, всё-таки, ДРУГОЙ вопрос. Спасибо
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Jack Famous,

Код
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, чего я не хочу))
В принципе, я так и делаю, только функциями — чем они вам не нравятся?  :)
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
а Private уже стало можно вызывать из другого модуля?
И раньше можно было: Run.
 
Если лень заморачиваться именно отдельными функциями на присвоение значений массиву каждый раз, можно классы использовать. В стандартный модуль:
Код
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 проинициализирует то что нужно один раз. Далее вызвать можно, но смысл.
По вопросам из тем форума, личку не читаю.
 
Юрий М, крайне неудобная вещь (как минимум нет подсказок)
Цитата
Дмитрий(The_Prist) Щербаков: Если лень заморачиваться именно отдельными функциями на присвоение значений массиву каждый раз, можно классы использовать
спасибо за вариант, но не настолько лень  :D я всё думаю, куда классы и пользовательские типы лучше применить…
Цитата
БМВ: Функция, которую можно будет вызвать с листа
не так страшно))

В общем, я понял, что константой массив задать нельзя, поэтому задаём переменную и присваиваем ей значения функцией или процедурой (не суть важно). По примерам спасибо - буду думать, может что и приплету к себе)) классы меня давно интригуют, но пока что безуспешно  :D

Всем большущее спасибо!
Если у кого-то ещё есть мысли, то с удовольствием почитаю ;)
Изменено: Jack Famous - 07.06.2019 16:26:42
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
крайне неудобная вещь (как минимум нет подсказок)
И в чём же неудобства? Про какие подсказки разговор, если вместо Call использовать Run?


Цитата
Jack Famous написал:
мне проще сразу определить все при запуске книги
Private Sub Workbook_Open() в помощь: при открытии книги присвоили двум (четырём) глобальным переменным значения и используем эти массивы в любом модуле.
Повторю вопрос: в чём в данном случае (с массивами) прелесть именно функции?

Цитата
Jack Famous написал:
а Private уже стало можно вызывать из другого модуля?  
Да ещё и с улыбочкой...
Можно.
 
Юрий М, как по мне - те же яйца - только в профиль. Я функцией присваиваю. Вы макросом. Можно и по событию. Только, если нет полной уверенности, что не будет ошибок, которые "сбросят" переменные, то даже по событию надо вызывать процедуру или функцию, а не присваивать руками. Разницы, наверное, никакой. Я привык функцией, в основном. Её не видно в окне запуска макроса, она может возвращать значения. Это для меня плюсы. Можно вызвать с листа - ну будет ошибка в ячейке в крайнем случае. Хотя пользователи обычно не ищут макро функции, а вот окном вызова макроса пользуются
Изменено: Jack Famous - 07.06.2019 16:48:36
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Jack Famous, ну я же говорю про данный конкретный случай - про какой вызов с листа разговор?
Цитата
Jack Famous написал:
мне проще сразу определить все при запуске книги
Т.е. выполнить один раз.
Цитата
Jack Famous написал:
...не видно в окне запуска макроса...
Private Sub Workbook_Open по Alt+F8 видно?
Впрочем, хозяин барин.
Да и мы ушли от темы про константы.
 
Юрий М, ушли точно) спасибо за разные варианты  ;)
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
Её не видно в окне запуска макроса
Если в начало модуля поставить

Код
Option Private Module

то макросы этого модуля нельзя будет запускать из других проектов (с помощью метода Application.Run) и они не будут видны при нажатии Alt+F8.
Вызывать из других модулей этого же проекта можно.
Изменено: sokol92 - 07.06.2019 17:11:00
Владимир
 
sokol92, а вот это новая для меня и очень крутая штука - спасибо большое!  :idea:
Уже точно знаю, где она будет очень уместна…
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Всеж щедрый форум. Человек за константой пришел, а ему и классов и модулей отгрузили. :-)
По вопросам из тем форума, личку не читаю.
Страницы: 1 2 След.
Наверх