Динамический массив

Тема в разделе "Lotus - Программирование", создана пользователем DEN888, 18 фев 2009.

  1. DEN888

    DEN888 Гость

    Подскажите, пожалуйста.

    Есть массив:
    (LotusScript)
    [codebox]
    ReDim MyArr(2, 2)
    MyArr(1, 1) = 1
    MyArr(2, 1) = 2
    MyArr(1, 2) = 3
    MyArr(2, 2) = 4
    'Добавляем элемент (столбец)
    ReDim Precerve MyArr(2, 3)
    MyArr(1, 3) = 5
    MyArr(2, 3) = 6
    [/codebox]

    Как добавить строку?

    На такой вариант выдает ошибку "Subscript out of range"
    [codebox]
    ReDim Precerve MyArr(3, 2)
    MyArr(3, 1) = 5
    MyArr(3, 2) = 6
    [/codebox]
     
  2. DEN888

    DEN888 Гость

    Разобрался.
    [codebox]Redim MyArr(1, 0)
    Redim Preserve MyArr(1, 1)
    MyArr(0, 1) = 1
    MyArr(1, 1) = 2
    Redim Preserve MyArr(1, 2)
    MyArr(0, 2) = 3
    MyArr(1, 2) = 4
    [/codebox]
     
  3. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Я всегда четко границы указываю: Dim MyArr(1 To 2, 1 To 3).
    На всякий случай(потому что есть такая штука как Option Base). -_-
     
  4. DEN888

    DEN888 Гость

    Спасибо за подсказку.

    Недавно начал изучать массивы в Lotus.
    Второй день бьюсь, не могу понять суть работы. :)

    Задача заключается в передаче данных в массив, (число столбцов постоянные,
    а количество строк меняется, как динамически менять массив?)
    а с массива в Excel.

    Set Range = AppExl.("A1:B4")
    Range.Value = MyArr

    Данные, например:

    Code Nm
    444 test1
    333 test2
    777 test3
    888 test4


    Можно, не большой пример, как работать с массивом
     
  5. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    открой хелп, ищи "dynamic arrays", там не много функций для работы с массивами, примеры есть, будут вопросы задавай более конкретно...

    единственное скажу, что в нотесе динамические многомерные (многоуровневые) массивы - еще тот гемор, поэтому, чаще всего приходится выкручиваться, работая с массивами как с одномерными, а с их элементами, соотв., как с другими одномерными массивами, так и проще, и глюков меньше... это касается именно изменения размеров многомерного массива...

    еще один совет, если заранее известны размеры массива, т.е. не во время компиляции, а именно во время выполнения, т.е. массив изначально динамический, то лучше выполнить операцию Redim единожды, задав эти размеры, а не в цикле увеличивать на 1 "размер", т.к. это корректнее в отношении использования памяти... но это не критично...

    по поводу твоей задачи, не ясно откуда данные передаются, и нужен ли массив в этом случае вообще :) может можно просто циклом пройтись по ячейкам... еще не уверен, что "Range.Value = MyArr" сработает, не пробовал ранее...
     
  6. DEN888

    DEN888 Гость

    Согласен, хелп там хороший, уже смотрел...

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

    делаю на оборот

    MyArr(3,1)
    MyArr(3,2)

    говорит Subscript out of range

    [codebox]Sub Click(Source As Button)
    Dim ExlApp, Range As Variant

    Set ExlApp = CreateObject("Excel.Application")
    ExlApp.Visible = False
    ExlApp.Workbooks.Add

    '''''''''''''''''''''''''''''''''''''''''''''''''''''''
    'Взято из хелпа
    Redim MyArr(2, 2)
    MyArr(1,1) = 1
    MyArr(2,1) = 2
    MyArr(1,2) = 3
    MyArr(2,2) = 4

    Redim Preserve MyArr(2,3)
    MyArr(1,3) = 5
    MyArr(2,3)=6
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''

    Set Range = ExlApp.Range("A1:D10")
    Range.Value = MyArr
    ExlApp.Visible = True
    End Sub[/codebox]
     
  7. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    я как-то пробовал извращиться с переменной Variant (Не МАССИВ!!!)
    пользовал функции Split, Join и в конце FullTrim . Собирал строку с разделителем... а потом разбивал на массив
    Это достаточно удобно для одномерных массивов... но думаю можно применить и к n-мерным... главное чтоб строка влезла и не спутать порядок элементов... отсутствие определенного элемента придется заменять пустой строкой или 0 в зависимости от типа :)

    в твоем случае можно получить строку 444#test1#333#test2#777#test3#888#test4#
    и работать с ней во вложеных циклах
     
  8. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    ну вот не слушаешь, что тебе говорят :)

    сделай так:
    Код (Text):
    dim a as variant
    dim b as variant

    redim a (0 to 1)
    for i = lbound(a) to ubound(a)
    redim b (0 to 1)
    b(0) = "a" & cstr(i) & "b0"
    b(1) = "a" & cstr(i) & "b1"
    a(i) = b
    next i
    на выходе получишь массив
    a0b0 a0b1
    a1b0 a1b1
     
  9. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Если не ошибаюсь, то эксель такую конструкцию не примет.

    DEN888
    Можешь код показать?
     
  10. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    Код (Text):
    Range.Value = MyArr
    Я так понимаю ты хочешь передать значения всего массива в одну ячейку? Если не ошибаюсь Ехель понимает только простые типы данных
    Потому String или Variant тебе в помощь... иначе строку не склеишь
     
  11. DEN888

    DEN888 Гость

    [codebox]Sub Click(Source As Button)
    Dim ExlApp, Range As Variant

    Set ExlApp = CreateObject("Excel.Application")
    ExlApp.Visible = False
    ExlApp.Workbooks.Add

    Redim MyArr(2, 2)

    MyArr(1,1) = 1
    MyArr(2,1) = 2

    MyArr(1,2) = 3
    MyArr(2,2) = 4
    'добавляет столбец, а мне нужно строку
    'Redim Preserve MyArr(3,2) не работает
    Redim Preserve MyArr(2,3)
    MyArr(1,3) = 5
    MyArr(2,3)=6

    'ExlApp.Range("A1:D10") примерный диапазон для примера
    '10 заменится на переменную, которая будет суммироваться в цикле
    Set Range = ExlApp.Range("A1:D10")
    Range.Value = MyArr
    ExlApp.Visible = True
    End Sub[/codebox]

    нет, я хочу передать массив в диапазон ExlApp.Range("A1:D10"), да Variant, то что надо так, содержатся числовые, текстовые, дата данные
     
  12. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    https://sec.deutsche-rentenversicherung.de/...4c?OpenDocument
    получается что нельзя акпкопределять массив если он уже был определен ранее... не важно как... в момент декларирования или первого переопределения.
    Остается только выполнить Erase перед новым переопределение. Правда тогда потеряешь данные какие в ней были
     
  13. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Всё понятно.Оказывается, это фича такая:
     
  14. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    это специфика решения проблем - если багу править влом, то ее нужно задокументировать и назвать фичей :rolleyes:
     
  15. Constantin A Chervonenko

    Constantin A Chervonenko Well-Known Member

    Регистрация:
    30 май 2006
    Сообщения:
    1.288
    Симпатии:
    0
    "Баг, переживший три фикса - считать фичей"(с)
     
  16. K-Fire

    K-Fire Гость

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

    Насколько я понимаю использование массива вам нужно только для увеличения производительности? ИМХО никакой разницы не будет, все равно ячейки будут заполнены в цикле, только цикл будет либо в лотусе, либо внутри функции екселя.

    Вопрос: ексель на экране отображается в момент заполнения данных или нет?
     
  17. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    думаю что не отображается... ну я бы по крайней мере так и делал.

    А по производительности - считаю что ход верен... зачем весить Лотус если задачу можно перекинуть на другое вспомогательное приложение?

    И вообще... нам-то собственно чего... автор темы вообще молчит :(
     
  18. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    K-Fire
    Разница будет и весьма существенная. Наверное, эксель после каждого изменения ячеек делает перерасчет формул и т.п. Поэтому выгоднее изменить сразу несколько ячеек. Чем больше, тем лучше.
    Я думаю, нужно сделать массив массивов(как написал Akupaka). В эксель выводить построчно.
     
  19. Kee_Keekkenen

    Kee_Keekkenen Well-Known Member

    Регистрация:
    5 сен 2006
    Сообщения:
    616
    Симпатии:
    4
    в случаях, когда типы данных позволяют, то я использую их строковые представления в таких конструкция
    Код (Text):
    dim tmp variant
    const DELIM ="~*~"

    'как пример цикл чего-нибудь из чего берем единичное значение
    forall s in somthing
    tmp = tmp & DELIM & cstr(s)
    endforall
    tmp = strright(tmp,DELIM)
    tmp = split(tmp,DELIM)
    по-моему это достаточно эффективно
     
  20. DEN888

    DEN888 Гость

    Да, массив служит для увеличения производительности.

    Excel соответственно скрываю (указал в коде примера :( ).
    Разница будет.
    Сравните сами.
    Варианты:
    1) Заполнять массив в цикле. Вывод массива в диапазон.
    2) Или заполнять ячейки в цикле.

    в данный момент у меня реализованно следующим образом, (в принципе работает быстро)

    в цикле узнаю количество для массива, затем в втором цикле заполняю массив.

    Результат (~5000 записей, 7 столбцов)
    1 вариант 2 сек.
    2 вариант ~ 1 минута
    разница заметна ;)


    ;) почему молчит?
     
Загрузка...
Похожие Темы - Динамический массив
  1. WingmanIX
    Ответов:
    2
    Просмотров:
    1.452
  2. Marazm
    Ответов:
    0
    Просмотров:
    1.294
  3. Ruslan737
    Ответов:
    0
    Просмотров:
    1.107
  4. Ruslan737
    Ответов:
    0
    Просмотров:
    879
  5. Ruslan737
    Ответов:
    0
    Просмотров:
    894

Поделиться этой страницей