Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

2 Март 2021, 11:39 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Здесь можно поблагодарить участников форума Улыбка
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: 1 2 »   Вниз
  Печать  
Автор Тема: массив константа  (Прочитано 6878 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Alex16
Форумчанин
***
Offline Offline

Сообщений: 114


« Стартовое сообщение: 15 Ноябрь 2016, 10:47 »

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

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
Гуру
*******
Offline Offline

Пол: Мужской
Сообщений: 3 061


iMac, LibreOffice и Apache OpenOffice


« Ответ #1: 15 Ноябрь 2016, 11:12 »

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

Alex16
Форумчанин
***
Offline Offline

Сообщений: 114


« Ответ #2: 15 Ноябрь 2016, 11:24 »

Понятно. Спасибо.
Т.е. если у меня есть номера семи колонок(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
Гуру
*******
Offline Offline

Пол: Мужской
Сообщений: 3 061


iMac, LibreOffice и Apache OpenOffice


« Ответ #3: 15 Ноябрь 2016, 11:35 »

Я так понимаю, что вы хотите "намертво" забить данные в массив? Может так:
Код:
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
Но и в этом случае можно переназначить элемент массива и размерность массива, так что массив не может быть неизменяемый.
« Последнее редактирование: 15 Ноябрь 2016, 11:40 от rami » Записан

Alex16
Форумчанин
***
Offline Offline

Сообщений: 114


« Ответ #4: 15 Ноябрь 2016, 13:42 »

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

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...
« Последнее редактирование: 15 Ноябрь 2016, 14:02 от Alex16 » Записан
rami
Гуру
*******
Offline Offline

Пол: Мужской
Сообщений: 3 061


iMac, LibreOffice и Apache OpenOffice


« Ответ #5: 15 Ноябрь 2016, 14:14 »

Т.е. мне нужно еще и преобразовывать (StrToInt(Arr(N))) каждый элемент "массива"?
Вообще надо всегда определять переменные, если не хотите удивляться Шокирован , либо пользоваться функциями преобразования (строки в число и т.д.). Ещё пример:
Код:
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
Гуру
*******
Offline Offline

Пол: Мужской
Сообщений: 3 061


iMac, LibreOffice и Apache OpenOffice


« Ответ #6: 15 Ноябрь 2016, 14:23 »

Можно и такой вариант цикла:
Код:
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
Форумчанин
***
Offline Offline

Сообщений: 114


« Ответ #7: 15 Ноябрь 2016, 14:48 »

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

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

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

Const 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
« Последнее редактирование: 15 Ноябрь 2016, 15:09 от Alex16 » Записан
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Киев
Сообщений: 2 764


Помогаю людям и компьютерам понимать друг друга


WWW
« Ответ #8: 15 Ноябрь 2016, 15:10 »

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

Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне
Alex16
Форумчанин
***
Offline Offline

Сообщений: 114


« Ответ #9: 15 Ноябрь 2016, 15:21 »

А, понял намек. Т.е. вместо 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

Это имелось ввиду?
« Последнее редактирование: 15 Ноябрь 2016, 15:24 от Alex16 » Записан
rami
Гуру
*******
Offline Offline

Пол: Мужской
Сообщений: 3 061


iMac, LibreOffice и Apache OpenOffice


« Ответ #10: 15 Ноябрь 2016, 15:33 »

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

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

А вообще дайте файл примера, а то мы так "неевклидово программирование" изобретём Смеющийся Смеющийся Смеющийся
Записан

JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Киев
Сообщений: 2 764


Помогаю людям и компьютерам понимать друг друга


WWW
« Ответ #11: 15 Ноябрь 2016, 16:14 »

вместо getCellByPosition использовать что-то вроде getCellByName (пока еще не искал инфу)
Точно! Только искать инфу бесполезно - getCellByName это функция, которую еще только предстоит написать. А под заголовками я вообще-то имел в виду не A-B-C, а "Товар", "Цена", "Дата поступления", "Дата списания" и т.п. То есть, те самые заголовки колонок данных, о необходимости которых не устают повторять все справочные пособия по электронным таблицам
Записан

Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне
Alex16
Форумчанин
***
Offline Offline

Сообщений: 114


« Ответ #12: 15 Ноябрь 2016, 16:30 »

Так не хорошо, 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." выходит.
« Последнее редактирование: 15 Ноябрь 2016, 16:38 от Alex16 » Записан
Alex16
Форумчанин
***
Offline Offline

Сообщений: 114


« Ответ #13: 15 Ноябрь 2016, 16:36 »

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

Пол: Мужской
Сообщений: 3 061


iMac, LibreOffice и Apache OpenOffice


« Ответ #14: 15 Ноябрь 2016, 16:41 »

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

Страниц: 1 2 »   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!