Распечатать массив VBA в ячейках Excel

Я пытаюсь распечатать массив, созданный VBA, в ячейки электронной таблицы Excel. Значения перколяции и стока продолжают получать ошибки «нижний индекс вне допустимого диапазона» Правильно ли я создаю массивы шлангов? Я объединил вычисление и подфункцию печати в одну.

 NumMonth = 12
 Dim col As Long
 Dim rw As Long
 rw = 4
 col = 13

 Range(Cells(rw, col), Cells(rw + NumMonth - 1, col)).Value = _
    Application.Transpose(WC)

Range(Cells(rw, col + 1), Cells(rw + NumMonth - 1, col + 1)).Value = _
    Application.Transpose(Runoff)

   Range(Cells(rw, col + 2), Cells(rw + NumMonth - 1, col + 2)).Value = _
     Application.Transpose(Percolation)
   End Sub

person user1977802    schedule 22.02.2013    source источник
comment
не могли бы вы предоставить некоторые образцы данных?   -  person glh    schedule 23.02.2013
comment
Месяц: 1-12, Ref Et: 0,4, осадки: 0,07, fc: 0,3, pwp = 0,1, WC (i) = 0,15. Я не знаю лучшего способа предоставить данные ??   -  person user1977802    schedule 23.02.2013


Ответы (2)


Ваши Precip и RefET всегда равны, должно ли это быть?

Precip(i) = Cells(4 + i, 2).Value
RefET(i)  = Cells(4 + i, 2).Value

Кроме того, когда вы устанавливаете массивы Runoff и Percolation, они ничего не устанавливают, если ваш оператор if не выполняется (см. Ниже), и я мог бы встретить его с предоставленными данными:

If (fc - WC(j - 1) + RefET(i) * dz < Precip(i) * dz) then

Я бы добавил кое-что, чтобы в них всегда была ценность:

If (fc - WC(j - 1) + RefET(i) * dz < Precip(i) * dz) Then
    Runoff(i) = (Precip(i) - (fc - WC(j - 1) + RefET(i)) * dz) * 0.5
    Percolation(i) = (Precip(i) - (fc - WC(i - 1) + RefET(i)) * dz) * 0.5
    WC(j) = fc
Else
    Runoff(i) = 0
    Percolation(i) = 0
    WC(j) = WC(j - 1) + Precip(i) - RefET(i) / dz
End If

Сделав это, я обнаружил, что вы не ReDim добавили переменные Runoff и Percolation. вам нужно добавить следующее в свою WaterBalanceRead подпрограмму.

ReDim Runoff(1 To NumMonth + 1)
ReDim Percolation(1 To NumMonth + 1)
person glh    schedule 23.02.2013
comment
Спасибо, что обнаружили ошибку чтения данных! Если я использую предоставленные мной данные, мои массивы все равно не будут установлены? - person user1977802; 23.02.2013
comment
@ user1977802 - последняя строчка исправила мою! - person glh; 23.02.2013

Его application.transpose вместо workheetfunction

  Range(Cells(rw, col), Cells(rw + NumMonth - 1, col)).Value = _
      application.Transpose(WC)

Вот тестовая подлодка

Sub test()
Dim myarray As Variant

'this is a 1 row 5 column Array
myarray = Array(1, 2, 3, 4, 5)

'This will fail because the source and destination are different shapes
Range("A1:A5").Value = myarray


'If you want to enter that array into a 1 column 5 row range like A1:A5

Range("A1:A5").Value = Application.Transpose(myarray)
End Sub

Вы получите сообщение об ошибке, если вызовете массив, созданный в другой подпрограмме. Причину этого можно увидеть в окне местных жителей, когда вы пошагово просматриваете свой код. Когда вы запускаете подпрограмму, которая создает ваш массив, она будет отображаться в локальных переменных, когда подпрограмма закончится, она исчезнет, ​​что означает, что она больше не хранится в памяти. Чтобы ссылаться на переменную или массив из другого подпрограммы, вы должны передать ее.

Передавать массивы или переменные можно разными способами. Вот несколько ссылок, Здесь И здесь

person scott    schedule 22.02.2013
comment
Нет, application.Tanspose не работает. Это массив, созданный в VBA - person user1977802; 23.02.2013
comment
Я думаю, что внес правильные изменения в код, который вы мне рекомендовали (см. Правки в исходном сообщении), однако он все еще не работает. Я правильно это делаю? - person user1977802; 23.02.2013
comment
Есть ошибка? Вы можете столкнуться с проблемой использования диапазона, не назначенного листу .. например sheets("sheet1").range("A1:A5").value = application.transpose(wc) - person scott; 23.02.2013
comment
да, это та же ошибка, которую я получал ранее - недопустимая процедура или ошибка вызова. Если я изменю его на Sheets (sheet1) .Range (M5: M22) .Value = Application.Transpose (WC), я все равно получаю ту же ошибку. - person user1977802; 23.02.2013
comment
хорошо, похоже, вы имеете в виду массивы, созданные в другом подпрограмме, это вызовет ошибку. Я получаю сообщение об ошибке компиляции, у вас включен явный параметр? - person scott; 23.02.2013
comment
да. У меня есть опция явного включения. да, мои массивы были созданы в другом подпрограмме, я создал подпрограмму только для их печати. - person user1977802; 23.02.2013
comment
@ user1977802. Чтобы передать массив WC в другую подпрограмму, вы должны убедиться, что эта переменная определена как глобальная вне всех подпрограмм. Это сохранит ваши обновления в переменной - person glh; 23.02.2013
comment
Я объявил это глобальным. Я включил и отредактировал свой полный код выше. - person user1977802; 23.02.2013
comment
Я объединил свои вычисления и подфункцию печати. Кажется, все печатается правильно, за исключением Percolation () и Runoff (). Правильно ли я создаю эти массивы? - person user1977802; 23.02.2013