Переназначение и вставка динамических диапазонов в VBA - PullRequest
0 голосов
/ 23 июня 2011

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

Диапазон такой:

            A           B
1   15-May-11 23:47:40  False
2   15-May-11 23:49:10  False
3   15-May-11 23:49:10  False
4   15-May-11 23:50:52  True
5   15-May-11 23:50:52  False
6   15-May-11 23:51:56  False
7   15-May-11 23:51:56  True
8   15-May-11 23:53:24  False
9   15-May-11 23:53:24  False

иЯ подготовил эту функцию:

Function selectEvents(rangeTimeValue, Val As String)
    Dim outputRange() As Variant
    j = 1

    For i = 1 To rangeTimeValue.Height
    Val_recorded = rangeTimeValue(i, 2).Value
    Time_recorded = rangeTimeValue(i, 1).Value
        If Val_recorded = Val Then
            ReDim Preserve outputRange(j, 2) '(1)
            outputRange(j, 1) = Time_recorded
            outputRange(j, 2) = Val_recorded
            j = j + 1
        End If
    Next i

    selectEvents = Application.Transpose(outputRange) '(2)
End Function

Теперь есть две проблемы:

  1. функция прерывается, когда массив повторно измеряется во второй раз (1)
  2. У меня также есть ошибка при вставке результатов (2), потому что диапазон должен быть определен до того, как я угадаю, но мне не удается найти способ передать измерение диапазона параметрическим способом

Буду признателен за любую помощь, спасибо!

1 Ответ

0 голосов
/ 23 июня 2011

1. ReDim Preserve

Цитирование из справки VBA

Если вы используете ключевое слово Preserve , вы можете изменить размер только последнего измерения массива

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

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

Пример того, как сделать обе эти вещи:

Dim nVal As Long
nVal = WorksheetFunction.CountA(rangeTimeValue.Columns(1))
ReDim outputRange(1 To nVal, 1 To 2)

2. «Вставка» результатов

Я не уверен, что вы имеете в виду здесь, потому что вы нигде ничего не вставляете. Это опечатка, где вы имели в виду pas * s * ing? Или ты имеешь ввиду транспонирование? Я не могу понять, что вы пытаетесь сделать в этой строке с .Transpose. Я не знаю. Я просто сделаю удар в темноте:

Если вы хотите разместить содержимое вашего массива outputRange где-нибудь на вашем листе, то вот как вы могли бы это сделать:

Dim rngOutput As Range
Set rngOutput = Sheet1.Range("G12") ' or wherever
rngOutput.Resize(UBound(outputRange, 1), UBound(outputRange, 2)) _
    = outputRange

Кстати, outputRange - довольно ужасное имя для вашего массива. Это не Range, так что это имя может привести к путанице, и я думаю, что это действительно так для вас. Почему бы не назвать это, например varOutput вместо этого, поскольку это массив Variant.

...