как использовать массивы в VBA - PullRequest
0 голосов
/ 02 августа 2011

Как написать функцию VBA, которая:

  • принимает массив, необязательный минимум и необязательный максимум
  • возвращает массив, каждое значение которого меньше минимума, замененного наминимальное значение, и каждое значение выше максимального заменяется максимальным значением?

И как я могу протестировать функцию путем

  1. вызова ее из формулы массива на листе и
  2. путем записи в диапазон из VBAмассив?

Ответы [ 3 ]

2 голосов
/ 03 августа 2011

Это скорее доказательство концептуальной функции, чем практическая. Вам необходимо использовать тип Variant для необязательных параметров, если вы не хотите устанавливать значение по умолчанию и вместо этого использовать функцию «IsMissing».

Требуется диапазон Excel, такой как A1: A5 или A1: B5, и 2 дополнительных параметра (мин. И макс.). Он выдаст строку, сообщающую вам новые значения диапазона.

В качестве теста положите значения 1,2,3,4,5 в A1 - A5. Теперь, в B1, напишите это:

=CheckArray(A1:A5,3)

Вы должны получить результат "Диапазон теперь: 3, 3, 3, 4, 5", так как вы не дали макс. Вы также можете сделать:

=CheckArray(A1:A5,,3)

И это вернет «Диапазон теперь: 1, 2, 3, 3, 3»

Function CheckArray(ByVal cell_range As range, _
                    Optional ByVal min_value As Variant, _
                    Optional ByVal max_value As Variant)

Dim i As Long, j As Long
Dim vArray As Variant
Dim test As String
vArray = cell_range.Value

For i = 1 To UBound(vArray, 1)
    For j = 1 To UBound(vArray, 2)
        'Check the min. value
        If IsMissing(min_value) = False Then
            If vArray(i, j) < min_value Then
                vArray(i, j) = min_value
            End If
        End If
        'Check the max value
        If IsMissing(max_value) = False Then
            If vArray(i, j) > max_value Then
                vArray(i, j) = max_value
            End If
        End If
    Next
Next
' The function is done. The below is just to spit out a test result.
For i = 1 To UBound(vArray, 1)
    For j = 1 To UBound(vArray, 2)
        test = test & (", " & vArray(i, j))
    Next
Next

CheckArray = "The range is now: " & vbLf & Right(test, Len(test) - 2)

End Function
0 голосов
/ 02 августа 2011

Я действительно не понимаю, зачем вам нужен массив для этого, и вы можете сделать это без VBA!
Скажите, что ваш MIN равен 3, а ваш MAX равен 16, тогда =MAX(MIN(D6;16);3) сработает.
И, если вы действительно хотите, вы можете ввести это как формулу массива.

0 голосов
/ 02 августа 2011

Если вы хотите протестировать только свой vba, вы можете создать процедуру с жестко запрограммированным массивом .

Если это пользовательская функция, вы можете вызвать ее с диапазоном в качестве аргумента , но вам, вероятно, придется устанавливать точки останова, потому что UDF не отображает ошибки, как классические vba.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...