Модераторы: mihanik
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> не редекларирует массив 
V
    Опции темы
Twwi
Дата 15.9.2006, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 8.11.2005
Где: Домодедово

Репутация: 1
Всего: 5



Друзья, у меня проблема с редекларацией массива
Код

Dim final()
 budget_1 = budget_rows("ЖА", fd, ld)
  ''''''
  y = 0
For Each pr In sub_projects
  For Each ce In cost_el
      sum_rur = 0
      sum_usd = 0
     For Each Row In budget_1
        If Worksheets("база").Range("D" & Trim(Str(Row))).Value = pr And _
           Worksheets("база").Range("F" & Trim(Str(Row))).Value = ce Then
           sum_rur = sum_rur + Worksheets("база").Range("r" & Trim(Str(Row))).Value
           sum_usd = sum_usd + Worksheets("база").Range("t" & Trim(Str(Row))).Value 
           project = Worksheets("база").Range("c" & Trim(Str(Row))).Value
        End If
    Next Row
        If sum_rur Or sum_usd <> 0 Then
           ReDim Preserve final(y, 5)    'строка ошибки
           final(y, 0) = "ЖА"
           final(y, 1) = project
           final(y, 2) = pr
           final(y, 3) = ce
           final(y, 4) = sum_rur
           final(y, 5) = sum_usd
           y = y + 1
         End If
    Next ce
    Next pr


Ошибка: Subscript out of range (Error 9).  СТрока 18
на момент ошибки у=1, предыдущее значение 0. Т.е. в массив final(0,5) строка занесена успешно (и редекларировлся он успешно), но увеличить размер массива до final(1,5) не можетsmile

Это сообщение отредактировал(а) Twwi - 15.9.2006, 15:19
PM MAIL ICQ   Вверх
Aloha
Дата 15.9.2006, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


.
**


Профиль
Группа: Участник Клуба
Сообщений: 351
Регистрация: 14.5.2006

Репутация: 5
Всего: 165



Twwi
Проблема в следующем: при использовании ключевого слова Preserve можно изменять только верхнюю границу последней размерности многомерных массивов. Подробнее можно посмотреть, например, здесь:
Цитата
If you use Preserve, you can resize only the last dimension of the array, and for every other dimension you must specify the same bound it already has in the existing array.

На мой взгляд, надо поменять размерности массива final(). Например, такая конструкция работает:
Код
Sub sTest()
  Dim final()
  For y = 1 To 10
    ReDim Preserve final(5, y)
    final(0, y) = "ЖА"
    final(1, y) = project
    final(2, y) = pr
    final(3, y) = ce
    final(4, y) = sum_rur
    final(5, y) = sum_usd
  Next y
End Sub



Это сообщение отредактировал(а) Aloha - 15.9.2006, 16:55
PM   Вверх
ИгнатьевАлексей
Дата 15.9.2006, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 369
Регистрация: 18.11.2005

Репутация: 2
Всего: 3



Да! Действительно та ки есть....
Но вот здесь  
http://msdn.microsoft.com/library/rus/defa.../vastmredim.asp
 я нашел фразу
Цитата

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

Звучит логично.

В данном случае, имхо, надо пользоваться способом работы с дин. массивами, который описан ввезде традиционно первым, т.е. сначала впервой группе циклов с неизв. количеством повторений определить полностью размерность массива, зетем ReDim, а потом - его заполнение при помощи For...Next. 
Я вообще то так и делал всегда, т.к. когда то прочитал , что второй способ (твой) проигрывает в быстродействии из-за многократного перераспределения памяти. Вот ты увидел и второй минус....


--------------------
Vingrad - FOREVER !!! 

"Как вы яхту назовете - так она и поплывет!" 
 Капитан Врунгель 
PM MAIL   Вверх
Twwi
Дата 16.9.2006, 08:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 8.11.2005
Где: Домодедово

Репутация: 1
Всего: 5



Спасибо, 
Aloha , я чесно говоря эту фразу читала как нельзя уменьшать размерность массива вообще, а не последней.. Интересно можно транспонировать массив?) Наверное опять через for...  Будем изыскивать..
ИгнатьевАлексей , я об этом тоже подумывала, но мне это показалось дольше, т.к. для того чтобы просчитать размер массива, а потом заполнить его потребуется два раза прогнать код указанный ранее.  Может я не права? Спасибо за совет, попробую и так и эдак smile
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Программирование, связанное с MS Office"
mihanik staruha

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами



  • Несанкционированная реклама на форуме запрещена
  • Пожалуйста, давайте своим темам осмысленный, информативный заголовок. Вопль "Помогите!" таковым не является.
  • Чем полнее и яснее Вы изложите проблему, тем быстрее мы её решим.
  • Оставляйте свои записи в "Книге отзывов о работе администрации"
  • А вот тут лежит FAQ нашего подраздела


Если Вам понравилась атмосфера форума, заходите к нам чаще!
С уважением mihanik и staruha.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Программирование, связанное с MS Office | Следующая тема »


 




[ Время генерации скрипта: 0.0416 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.