Ищу объяснение строки кода

#vba

#vba

Вопрос:

Немного новичок в vba, и у меня был приятель, который дал мне эту строку:

ReDim Сохраняет InputD(от 1 до UBound(InputD, 1), от 1 до 3)

Я не совсем уверен, что делает эта строка, я понимаю ReDim для изменения значений в массиве и сохранения, в котором хранятся все данные, кроме последнего. Что именно операторы «To» делают внутри этого массива? это просто указание, сколько раз повторять?

Ответ №1:

  1. ReDim Preserve тогда действует иначе ReDim . Он способен изменять только последнее измерение и сохранять (существующие) значения (если таковые имеются). То, как вы это используете, немного странно. Я имею в виду, обычно полезно, чтобы ReDim массив с размерами (особенно последний) мог охватывать предполагаемое количество загружаемых элементов плюс что-то еще. Обычно используется переменная, увеличиваемая с каждым добавленным новым элементом, чтобы Redim Preserve иметь этот конкретный номер переменной.

Например:

 Sub testRedimPreserve()
 Dim sh As Worksheet, arr, arrToProcess, i As Long, k As Long
 Set sh = ActiveSheet
 arr = sh.Range("A2:A20"): k = 1
 ReDim arrToProcess(1 To 2, 1 To UBound(arr))  'redim at a maximum which surely will not be exceeded
  For i = 1 To UBound(arr)
    If arr(i, 1) = "x" Then
        arrToProcess(1, k) = "Row " amp; i: arrToProcess(2, k) = "OK": k = k   1
    End If
  Next i
  'Since some values in the range are not "x", the obtained array must use Redim Preserve:
  ReDim Preserve arrToProcess(1 To 2, 1 To k - 1) 'All the elements value up to k -1 are kept/preserved
  'Since only the last dimension can be preserved, the obtained array must be trasnposed.
  sh.Range("C2").Resize(k - 1, 2).Value = WorksheetFunction.Transpose(arrToProcess)
End Sub
  

1.a Конечно, если у вас массив большего размера и вам нужны только его первые три столбца, вы можете поступить так, как предложил ваш друг.

  1. Redim arr(1 to x) означает, что первый элемент измерения равен 1. В таком случае он будет содержать элементы от 1 до x. Если не указать таким образом, я имею в виду ReDim arr(x) , что первый элемент равен нулю. Это VBA по умолчанию. Он работает в базе 0. За исключением случая, когда Option Base 1 используется поверх модуля…

Ответ №2:

Если вы посмотрите на документацию для ReDim, вы увидите индексы в круглых скобках, а если вы посмотрите дальше, вы увидите объяснение индексов:

Требуется. Размеры переменной массива; может быть объявлено до 60 кратных измерений. Аргумент subscripts использует следующий синтаксис:

[ Нижний ] верхний [, [Нижний ] верхний ] . . .

Если явно не указано в lower , нижняя граница массива управляется оператором Option Base . Нижняя граница равна нулю, если нет базового оператора Option.

Это означает, что вы изменяете размер своего массива InputID с того, каким он был раньше, на (от 1 до его верхних границ от предыдущего) для первого измерения и (от 1 до 3) для второго измерения.

Комментарии:

1. Я не уверен, что вы получаете в @FaneDuru в документации упоминается все, что вы сказали, и вопрос был явно о нижних индексах. Если вы не знаете границ первых измерений, полезно проверить границы при изменении размера массива

2. Я комментирую ваш ответ по ошибке. Я думал, что я комментирую вопрос OP… Затем я подумал, что, возможно, будет полезно разместить более подробный ответ, соответствующий лучшему пониманию ReDim Preserve смысла…

3. Еще немного разъяснений от вас обоих, эта строка изменяет физический размер моего массива с 1 на верхние границы в 1-м измерении и с 1 на 3 во втором? Упрощенный, я думаю, как из массива 1×1 в массив ((пока не закончатся данные) x 3).

4. @TrustedHippo: 1. Если вы хотите обратиться ко мне, когда я разместил ответ, пожалуйста, прокомментируйте мой ответ. Таким образом, нет необходимости помечать меня. 2. Нет, это ничего не меняет в первом измерении. Это невозможно ! Это означает, что первое измерение сохраняется таким, каким оно было, а для второго установлено значение 3. Если в вашем массиве более 3 столбцов, это означает, что после Redim Preserve него будет такое же количество строк, но только три столбца. От 1 до 3. Если вместо 1 To 3 вас будет только `3′, оставшихся столбцов будет 4. От 0 до 3.

5. @TrustedHippo: 3. Мы здесь, когда кто-то тратит некоторое время на то, чтобы ответить на наш вопрос, И мы считаем ответ «замечательным / полезным и т. Д.», Мы устанавливаем флажок на левой стороне кода, чтобы сделать его принятым ответом . Таким образом, кто-то другой, ищущий аналогичную проблему, будет знать, что ответ решил вашу проблему…