Массив циклов и изменение значения - PullRequest
0 голосов
/ 13 мая 2019

С помощью приведенного ниже кода я зацикливаю массив и, если выполняется условие для изменения значения массива.Я получаю сообщение об ошибке 424 на линии изменения значения.Есть идеи?

sub test()

    Dim arrAccSof As Variant

    arrAccSof = .Range(.Cells(3, 1), .Cells(MaxRowAccSof, 4))

    For j = LBound(arrAccSof) To UBound(arrAccSof)

        If IsEmpty(arrAccSof(j, 3)) Then
            arrAccSof(j, 3).Value = 0
        End If
        If IsEmpty(arrAccSof(j, 4)) Then
            arrAccSof(j, 4).Value = 0
        End If

    Next j

end sub

1 Ответ

3 голосов
/ 13 мая 2019

Элемент массива не имеет .Value, оно должно быть arrAccSof(j, 3) = 0. Если вы читаете значения в массив как

arrAccSof = .Range(.Cells(3, 1), .Cells(MaxRowAccSof, 4))

это то же самое, что и

arrAccSof = .Range(.Cells(3, 1), .Cells(MaxRowAccSof, 4)).Value

и массив представляет только значения диапазона, но не объект диапазона.

Обратите внимание, что если вы измените значения в массиве, они не будут автоматически изменены в ячейках, если вы не напишите значения массива обратно в ячейки в конце:

.Range(.Cells(3, 1), .Cells(MaxRowAccSof, 4)).Value = arrAccSof

Для сравнения, если вы делаете

Dim AccSof As Range
Set AccSof = .Range(.Cells(3, 1), .Cells(MaxRowAccSof, 4))

затем AccSof является ссылкой на фактический объект диапазона, который может использоваться как сам диапазон:

AccSof(j, 3).Value = 0

Это немедленно изменяет значение ячейки .

Но обратите внимание, что первый подход с использованием массива быстрее. Я добавил это только для того, чтобы объяснить разницу.

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