массив константа

Автор Alex16, 15 ноября 2016, 10:47

0 Пользователи и 1 гость просматривают эту тему.

Alex16

Здравствуйте! Подскажите пожалуйста как объявить константу массив (глобальную для модуля)?

const Arr = Array(2, 3, 5, 6, 57, 34, 6) <<<<

Sub LoadData
for N = LBound(Arr) to UBound(Arr)
   print Arr(N)
Next N
End Sub

Или как еще можно сделать константу с заранее установленными значениями, ну типа множества числовых значений?

rami

Константа должна быть числом или строкой.

Alex16

Понятно. Спасибо.
Т.е. если у меня есть номера семи колонок(Column в Calc) (2, 3, 5, 6, 57, 34, 6) и мне нужно по ним пробежаться
это нужно отдельно семь циклов делать?

Хотел примерно так:
const Arr = Array(2, 3, 5, 6, 57, 34, 6) <<<<

Sub LoadData
for N = LBound(Arr) to UBound(Arr)
   For R = 10 to 100     <<<< 10 и 100 это номера строк и они тоже объявлены константами, тут все ок
      ...Sheet.getCellByPosition(Arr(N), R).Value...
    Next R
Next N
End Sub

И это не одна процедура где используются номера колонок....
Как такое можно оптимизировать?

rami

#3
Я так понимаю, что вы хотите "намертво" забить данные в массив? Может так:
Const mas="2,3,5,6,57,34,6"

Sub LoadData
Arr=split(mas,",")
for N = LBound(Arr) to UBound(Arr)
  print Arr(N)
Next N
End Sub

Но и в этом случае можно переназначить элемент массива и размерность массива, так что массив не может быть неизменяемый.

Alex16

#4
Хм.. Вроде бы оно, то самое что нужно, но....

Const mas="2,3,5,6,57,34,6"

Sub LoadData1
Arr=split(mas,",")
for N = LBound(Arr) to Arr(3)       'UBound(Arr)
  print Arr(N)
Next N
End Sub
Результат split - String
Т.е. мне нужно еще и преобразовывать (VALUE(Arr(N))) каждый элемент "массива"?

...Sheet.getCellByPosition( Arr(N),  R).Value...

rami

Цитата: Alex16 от 15 ноября 2016, 11:42Т.е. мне нужно еще и преобразовывать (StrToInt(Arr(N))) каждый элемент "массива"?
Вообще надо всегда определять переменные, если не хотите удивляться :o , либо пользоваться функциями преобразования (строки в число и т.д.). Ещё пример:
Const s="1,6,3,8,11,4"

Sub Main
Dim aa(4) As Integer, x%
aa=split(s,",")
For i=LBound(aa) To UBound(aa)
x=aa(i)              'переменная X является числом, потому,что определена как Integer
y=val(aa(i))         'переменная Y не определена, но функция val() преобразует строку в число
Next
End Sub

rami

Можно и такой вариант цикла:
Const s="1,6,3,8,11,4"

Sub main
Dim n%
For Each n In split(s,",")
x=ThisComponent.Sheets(0).getCellByPosition(0,n).Value
Next
End Sub

Alex16

#7
Спасибо. Оба варианта работают.
Я пробовал так:

const ArrStr = "2,3,5,6,57,34,6"

Sub LoadData
Arrs=Split(ArrStr, ",")
for N = LBound(Arrs) to UBound(Arrs)
   For R = 10 to 100     <<<< 10 и 100 это номера строк и они тоже объявлены константами, тут все ок
     ...Sheet.getCellByPosition(Val(Arrs(N)), R).Value...
   Next R
Next N
End Sub

но у меня вопрос был немного по другому, т.е. чтоб без преобразований, хотя второй вариант наверное пошустрее будет, так ведь?

Цитата: rami от 15 ноября 2016, 12:14Const s="1,6,3,8,11,4"

Sub Main
Dim aa(4) As Integer, x%
Можно вопрос, для чего нужно Dim aa(4) As Integer ? Это объявление одномерного массива чисел из 5 элементов? а в константе 6.... Опечатка?)

Const s="1,2,4,8,11,4,7,67"

Sub Main1212
Dim aa(4) As Integer, x%
aa=split(s,",")
For i=LBound(aa) To aa(1)  <<<< все равно вылетаем за пределы хоть вроде и аа объявлен как Integer и aa(1) имеет значение 2
x=aa(i)              'переменная X является числом, потому,что определена как Integer
y=val(aa(i))         'переменная Y не определена, но функция val() преобразует строку в число
print aa(i)
Next
End Sub

JohnSUN

Alex16, а зачем ты привязываешься к номерам колонок? У данных нет подписей в заголовке?
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

Alex16

#9
А, понял намек. Т.е. вместо getCellByPosition использовать что-то вроде getCellByName (пока еще не искал инфу)
И в первом цикле брать букву колонки из строкового массива, а во втором прицеплять к ней индекс числового цикла и использовать именованный адрес, так?

Примерно:
Const StrColumns = "A, C, F, G, J"

Sub LoadData1
StrColumnsArr=split(StrColumns, ",")
for N = LBound(StrColumnsArr) to UBound(StrColumnsArr)
  for K = 10 to 100
   Addr =  StrColumnsArr(N) & K
   ...getCellByName(Addr).Value...
  next K
Next N
End Sub

Это имелось ввиду?

rami

Цитата: Alex16 от 15 ноября 2016, 12:48Можно вопрос, для чего нужно Dim aa(4) As Integer ? Это объявление одномерного массива чисел из 5 элементов? а в константе 6.... Опечатка?)
Для запутывания следов, ;D ;D ;D , это я делал проверку с другими данными, в константу добавил, а массив не изменил :( . Вообще я массивы определяю как Dim massiv() — тип всегда вариант без размеров, редко другой тип. С массивами нужно быть внимательным, они иногда в самый не подходящий момент могут удивлять :o (при не правильной работе).

Цитата: Alex16 от 15 ноября 2016, 12:48For i=LBound(aa) To aa(1)  <<<< все равно вылетаем за пределы хоть вроде и аа объявлен как Integer и aa(1) имеет значение 2
Так не хорошо, LBound(aa) нижняя граница массива (по умолчанию всегда нуль), aa(1) само по себе строка (в момент присвоения данных массив меняет тип) — из-за этого цикл идёт на бесконечность.

А вообще дайте файл примера, а то мы так "неевклидово программирование" изобретём ;D ;D ;D

JohnSUN

Цитата: Alex16 от 15 ноября 2016, 15:21
вместо getCellByPosition использовать что-то вроде getCellByName (пока еще не искал инфу)
Точно! Только искать инфу бесполезно - getCellByName это функция, которую еще только предстоит написать. А под заголовками я вообще-то имел в виду не A-B-C, а "Товар", "Цена", "Дата поступления", "Дата списания" и т.п. То есть, те самые заголовки колонок данных, о необходимости которых не устают повторять все справочные пособия по электронным таблицам
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

Alex16

#12
Цитата: rami от 15 ноября 2016, 13:33Так не хорошо, LBound(aa) нижняя граница массива (по умолчанию всегда нуль), aa(1) само по себе строка
Это понятно. я так чисто быстро машинально для проверки, ну и
Цитировать(в момент присвоения данных массив меняет тип) — из-за этого цикл идёт на бесконечность.

ЦитироватьА вообще дайте файл примера, а то мы так "неевклидово программирование" изобретём

Да если честно, пока нет никакого файла, кроме как набора процедур в модуле Standard в моих макросах :)
Я уже несколько дней собираю эти "кусочки", что бы потом слепить конечный результат

В данном случае мне достаточно будет вот такой макрос:
Const StrColumns = "A, C, F, G, J"

Sub LoadData1222
StrColumnsArr=split(StrColumns, ",")
for N = LBound(StrColumnsArr) to UBound(StrColumnsArr)
  for K = 10 to 12
   Addr = StrColumnsArr(N) & K
   ThisComponent.Sheets(1).getCellByName(Addr).SetString(ThisComponent.Sheets(0).getCellByName(Addr).GetString)
  next K
Next N
End Sub

Но пока вот такая вот ошибка "Свойство или метод не найдены: getCellByName." выходит.

Alex16

Цитата: JohnSUN от 15 ноября 2016, 14:14А под заголовками я вообще-то имел в виду не A-B-C, а "Товар", "Цена", "Дата поступления", "Дата списания" и т.п.
Ай, нет.... Есть номера(или буквы) колонок, и кол-во строк.
Цитата: JohnSUN от 15 ноября 2016, 14:14Только искать инфу бесполезно - getCellByName это функция
Хм... понятно... Но ведь можно же как-то стандартно обратится к ячейке по "имени" (адресу)

rami

Цитата: Alex16 от 15 ноября 2016, 14:30Но пока вот такая вот ошибка "Свойство или метод не найдены: getCellByName." выходит.
Надо: getCellRangeByName