Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Программирование, связанное с MS Office > не редекларирует массив


Автор: Twwi 15.9.2006, 15:18
Друзья, у меня проблема с редекларацией массива
Код

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

Автор: Aloha 15.9.2006, 16:47
Twwi
Проблема в следующем: при использовании ключевого слова Preserve можно изменять только верхнюю границу последней размерности многомерных массивов. Подробнее можно посмотреть, например, http://msdn2.microsoft.com/en-us/library/w8k3cys2.aspx:
Цитата
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


Автор: ИгнатьевАлексей 15.9.2006, 17:22
Да! Действительно та ки есть....
Но вот здесь  
http://msdn.microsoft.com/library/rus/default.asp?url=/library/rus/vblr7/html/vastmredim.asp
 я нашел фразу
Цитата

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

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

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

Автор: Twwi 16.9.2006, 08:16
Спасибо, 
Aloha , я чесно говоря эту фразу читала как нельзя уменьшать размерность массива вообще, а не последней.. Интересно можно транспонировать массив?) Наверное опять через for...  Будем изыскивать..
ИгнатьевАлексей , я об этом тоже подумывала, но мне это показалось дольше, т.к. для того чтобы просчитать размер массива, а потом заполнить его потребуется два раза прогнать код указанный ранее.  Может я не права? Спасибо за совет, попробую и так и эдак smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)