Страницы: 1
RSS
VBA. Объявление большого числа переменных с одинаковым типом, Укоротить строки с объявлением однотипных переменных
 
Иногда приходится объявлять большое число переменных с одинаковым типом. Например:
Код
Dim a0 as Byte, a1 as Byte, a2 as Byte, a3 as Byte, a4 as Byte, a5 as Byte, a6 as Byte, a7 as Byte, a8 as Byte, a9 as Byte
Dim b0 as Byte, b1 as Byte, b2 as Byte, b3 as Byte, b4 as Byte, b5 as Byte, b6 as Byte, b7 as Byte, b8 as Byte, b9 as Byte
' ...........
Dim m0 as Byte, m1 as Byte, m2 as Byte, m3 as Byte, m4 as Byte, m5 as Byte, m6 as Byte, m7 as Byte, m8 as Byte, m9 as Byte
Интересует, можно ли объявить все эти переменные с нужным типом Byte, не вставляя после каждой из их as Byte.
 
нет, нельзя. а почему для них не использовать
Код
Dim a(10) as byte
'или так:
Dim a(10,8) as byte
Изменено: buchlotnik - 16.07.2020 15:55:58
Соблюдение правил форума не освобождает от модераторского произвола
 
если подойдет тип Integer можете обьявить так: a0%, a1% ....
но напрашивается 1 масиив
dim a(1 to 13, 0 to 9) as byte
или несколько
dim a(0 to 9) as byte, b(0 to 9) as byte ...
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
tolikt, применение такого количества переменных, да еще с непонятными именами... Что-то не так в датском королевстве )
 
Цитата
vikttur написал:
применение такого количества переменных, да еще с непонятными именами...
ну есть надежда, что это просто иллюстрация к вопросу. А ответ выше дан. Или никак или массив.
А вот если имена имеют осмысленно езначение, то можно использовать собственный TYPE
Код
Public Type allByte
one As Byte
two As Byte
three As Byte
for As Byte
five As Byte
six As Byte
seven As Byte
End Type

Sub test()
Dim a As allByte
Dim b As allByte
Dim c As allByte
a.one = 7
b.three = 6
c.five = 5
End Sub
Изменено: БМВ - 16.07.2020 16:36:05
По вопросам из тем форума, личку не читаю.
 
Код
DefByte A-C

Sub test()
MsgBox TypeName(a)
MsgBox TypeName(C100)
End Sub
все необъявленные переменные, начинающиеся на A, B и C волшебным образом стали AS BYTE!
 
Апострофф, вот тут точно Option Explicit как воздух необходим, чтоб сюрпризов не было :-)
По вопросам из тем форума, личку не читаю.
 
Лучше бы рассказали зачем вам это? думаю тогда и решить можно по другому
 
БМВ, пофик на Option Explicit. Если тип не указать - всё равно будет BYTE/
Код
Option Explicit
DefByte A-C

Sub test()
Dim a, c100
MsgBox TypeName(a)
MsgBox TypeName(c100)
End Sub
т.е. мечта Толика осуществилась - не надо больше  as Byte писать ;)  
 
Цитата
Апострофф написал:
Если тип не указать - всё равно будет BYTE
так я именно про это. Будет взята переменная aaa, не объявленная, для счетчика иииии....
По вопросам из тем форума, личку не читаю.
 
Цитата
БМВ написал:
не объявленная,
это как? Option Explicit на месте уже. задаём для аааааааа& - и счётчик готовый и не маленький (чуть больше 255-и)
 
Апострофф, я про первый код.
По вопросам из тем форума, личку не читаю.
 
Спасибо. Примерно то, что надо, это DefByte. Попробую прикрутить его.
На самом деле, конечно, многократное объявление As Byte вовсе не критично, можно и покопировать. Я просто думал, что есть какой-то простой способ всё сделать разом.
Необходимость таких многочисленных переменных возникает из-за отчётов со многими (но меньше 256) столбцами на листе. В процессе отладки макроса, точнее, разработки формы отчёта, приходится добавлять/удалять/перемещать столбцы с данными по просьбе руководства. И переменные используются, чтоб не менять номера столбцов по всему коду, а просто менять один раз значение переменной номера столбца. Понятно, что отчёт с сотней столбцов получается громоздким и неудобным, но он используется как промежуточный для сводной таблицы и т.д. Сразу сделать сводную без общего отчёта нельзя, т.к. он тоже просматривается по необходимости.
 
Цитата
tolikt написал:
И переменные используются, чтоб не менять номера столбцов по всему коду
так, то есть потом этой перемeнной присваивается константа?
По вопросам из тем форума, личку не читаю.
 
tolikt, возможно, получите более правильное решение (или подсказку к решению), если создадите тему по задаче.
 
Цитата
БМВ написал:
так, то есть потом этой перемeнной присваивается константа?
Да, почти всегда. Возможно, Const вместо Dim правильнее.

Цитата
vikttur написал:
возможно, получите более правильное решение (или подсказку к решению), если создадите тему по задаче.
Спасибо, но не думаю, что задача заслуживает отдельной темы. Просто хотел прояснить этот нюанс. Ну и в некоторых случаях, при переменном количестве столбцов, уже использую массив констант, как указал buchlotnik в #2.
 
Цитата
tolikt написал:
Const вместо Dim правильнее.
Const вместо Dim НИКАК не избавит ва сот а0, а1, а2... м7, м8, м9 - сколько было обьявлений столько их и останется (117 шт.)
а можно сделать 1 обьявление
а (1 to 13, 0 to 9) as byte - это все!
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
tolikt написал:
Возможно, Const вместо Dim правильнее.
Почему возможно? Константа заменяется компилятором и соверешенно не важно байт она или ....
По вопросам из тем форума, личку не читаю.
 
С DefByte всё нормально получается.
А массив a(0 to 99) в моём случае особо смысла не имеет. Дело в том, что номера столбцов не просто переменные a00, a01 и т.д., как изначально я указал, а вполне осмысленные: cDateOtgruz, cDateOplaty, cNumDoc, cNumTTN, cPartnerName, cPartnerCode, cSummaDoc и так несколько десятков переменных. И удобнее пользоваться ими: cBruttoV визуально гораздо более информативная переменная, чем a(46).
Конструкцию типа Const cPriceOpt3 = 38 использовать пытался, но удобнее использовать Dim, как оказалось. Инициализация переменных идёт в виде
Код
i=0
cDateOtgruz = i: i = i + 1
cDateOplaty = i: i = i + 1
'.........
cPriceOpt3 = i: i = i + 1
'.........
cLastCol = i: i = i + 1
При необходимости их можно просто менять местами, не заботясь о конкретном значении переменной. С Const cPriceOpt3 = i такая фишка не проходит.
Изменено: tolikt - 01.08.2020 16:23:57
 
Я так понимаю, что переменные у Вас имеют последовательные значения (как минимум, большинство). А что мешает использовать Enum ?
Код
Enum MyConstants
  cDateOtgruz = 1 'начальное значение, если не указать, будет 0
  cDateOplaty ' автоматически = 2 (предыдущее + 1)
  cSomeConst ' автоматически = 3 (предыдущее + 1)
'......... и т.д.
  cPriceOpt3
'.........
  cLastCol
End Enum
Изменено: Alec Perle - 01.08.2020 17:24:34
 
Цитата
tolikt написал: А массив a(0 to 99) в моём случае особо смысла не имеет...
Это потому что вы с массивами работать не умеете )))  
 
Цитата
tolikt написал:
И переменные используются, чтоб не менять номера столбцов по всему коду, а просто менять один раз значение переменной номера столбца.
Не правильно ты, дядя Федор, бутерброд ешь.
Вариант 1 - сделать умную таблицу, и работать с ней, используя ее наименования столбцов.
Вариант 2 - эмулировать аналогичное макросом, например через коллекцию.
При этом руководство само сможет таскать столбцы в угодное им место, не нарушая при этом работу макроса.
Страницы: 1
Наверх