Нахождение одного значения в динамически созданном массиве - PullRequest
0 голосов
/ 31 мая 2019

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

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

Я уже проверял этот сайт и другие, и не могу найти объяснение. Возможно, люди называют действия как-то иначе.

Sub get_val()

'get the number of rows
Dim id As Worksheet
Set id = ThisWorkbook.Sheets("ID Sheet")
rc = id.Range("B:B").Find(What:="*", After:=id.Range("B1"), LookIn:=xlValues, SearchOrder:=xlByRows, SearchDirection:=xlPrevious).row

'Find which ones have "yes" in column Q and create an array
Dim memcache As Variant
Dim x As Integer
x = 1
ReDim memcache(x)
For i = 3 To rc
    If id.Cells(i, 17).Value = "Yes" Then
        ReDim Preserve memcache(x)
        memcache(x) = id.Range("A" & i & ":M" & i)
        x = x + 1
    End If
Next i

«Здесь я сталкиваюсь с проблемами. «Если я хочу скопировать один из диапазонов в другой диапазон на листе, это прекрасно работает

id.Range("A50:M50").Value = memcache(2) 'this works

'Однако, если я хочу просто найти значение одной ячейки в диапазоне, это не сработает. Это приводит к ошибке «Требуется объект».

Debug.Print memcache(2).Cells(1, 2).Value 

'Для сравнения будет работать один диапазон

Dim cellrange As Variant

Set cellrange = id.Range("A9:M19")


Debug.Print cellrange.Cells(1, 2).Value ' this will work


End Sub

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

1 Ответ

0 голосов
/ 31 мая 2019

Массивы и диапазоны - разные вещи в VBA. Массив - это просто массив значений, а диапазон - это ссылка на группу ячеек на рабочем листе. В этом случае Memcache - это массив, но вы пытаетесь рассматривать его как диапазон. Memcache не имеет никаких ячеек, просто есть значения.

То, что вы хотите, это заменить Debug.Print memcache(2).Cells(1, 2).Value на Debug.Print memcache(2).

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

Dim memcache() As String '(or integer, or whatever type of data you're putting into it)
Dim cellrange As Range
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...