#vba
#vba
Вопрос:
Немного новичок в vba, и у меня был приятель, который дал мне эту строку:
ReDim Сохраняет InputD(от 1 до UBound(InputD, 1), от 1 до 3)
Я не совсем уверен, что делает эта строка, я понимаю ReDim для изменения значений в массиве и сохранения, в котором хранятся все данные, кроме последнего. Что именно операторы «To» делают внутри этого массива? это просто указание, сколько раз повторять?
Ответ №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 Конечно, если у вас массив большего размера и вам нужны только его первые три столбца, вы можете поступить так, как предложил ваш друг.
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. Мы здесь, когда кто-то тратит некоторое время на то, чтобы ответить на наш вопрос, И мы считаем ответ «замечательным / полезным и т. Д.», Мы устанавливаем флажок на левой стороне кода, чтобы сделать его принятым ответом . Таким образом, кто-то другой, ищущий аналогичную проблему, будет знать, что ответ решил вашу проблему…