проверка ячеек и массивов

#arrays #validation #vba #elements

#массивы #проверка #vba #элементы

Вопрос:

два вопроса, во-первых, не могли бы вы напомнить мне, как опрашивать многомерный массив при его назначении? Я всегда делаю это с помощью цикла for и как статически это сделать, кажется, ускользает от меня?

Но то, что я действительно хочу сделать, это использовать массив для проверки содержимого ячеек. однако в приведенном ниже примере я хочу использовать только первый элемент во 2-м измерении.

т.е.
0,0
1,0
2,0
3,0
4,0

Есть ли какой-либо способ обновить .Добавить строку типа:=xlValidateList, Formula1:=Join(ary, «,»), чтобы она возвращала только эти 5 значений из массива размером 5 на 4?

Приветствия

аарон

 Sub test()


Dim ary As Variant
ReDim ary(5,4)


ary = Array("Value1", "Value2", "Value3", "test", "test2", "test3", "test4")

With ActiveSheet.Cells(1, 1).Validation
    .Delete
    .Add Type:=xlValidateList, Formula1:=Join(ary, ",")
    .IgnoreBlank = False
    .InCellDropdown = True
    .InputTitle = ""
    .ErrorTitle = ""
    .InputMessage = ""
    .ErrorMessage = ""
    .ShowInput = True
    .ShowError = True
End With
End Sub
 

Комментарии:

1. Зачем вам здесь нужен многомерный массив? Если вы на самом деле заполняете его из диапазона, вы можете просто присвоить диапазону имя, а затем использовать это имя при проверке.

2. массив содержит данные в следующем формате: 0,0 = описание, 0,1 = начальная позиция, 0,2 = конечная позиция. Я хочу, чтобы ячейки проверялись только в описании. Массив actulay заполняется во время выполнения. и имеет размер x на 3. Я знаю, что мог бы извлечь описания в отдельный массив, но это кажется iniffecnet

Ответ №1:

Изменение размера 2D-массива до 1D происходит быстро

Приведенный ниже код заполняет ваш массив размером 5 * 4 образцами данных, затем второй цикл извлекает только первое измерение в новый одномерный массив с той же длиной строки, что и ваш исходный массив

 Sub test()

    Dim ary As Variant
    Dim X As Variant
    Dim lngRow As Long
    Dim lngCol As Long

    ReDim ary(1 To 5, 1 To 4)
    ReDim X(1 To UBound(ary, 1))

    For lngRow = 1 To UBound(ary, 1)
        For lngCol = 1 To UBound(ary, 2)
            ary(lngRow, lngCol) = "I am row " amp; lngRow amp; "  and dimension " amp; lngCol
        Next
    Next

    For lngRow = 1 To UBound(ary, 1)
    X(lngRow) = ary(lngRow, 1)
    Next

    With ActiveSheet.Cells(1, 1).Validation
        .Delete
        .Add Type:=xlValidateList, Formula1:=Join(X, ",")
        .IgnoreBlank = False
        .InCellDropdown = True
        .ShowInput = True
        .ShowError = True
    End With
End Sub
 

Комментарии:

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

2. Я в это не верю, я никогда не видел ярлыка для метода 2D-1D. Тем не менее, циклические массивы очень эффективны по времени, даже если это кажется неэффективным кодированием. Я подумал, что мой подход, описанный выше, может быть полезен в зависимости от вашего существующего стиля, если нет, то можно его игнорировать. Приветствия.

3. Я преклоняюсь перед вашим опытом, я совершенно потрясен, увидев, что вы не можете просто извлечь значения одной строки / столбца из массива. Ie блокирует все измерения, начиная с одного. Я полагаю, что это то, что вы часто делаете в сети, применяя маски, чтобы ограничить то, что может и не может измениться. Что очень помогло в вашем коде, так это использование UBound для многомерных массивов. Поскольку это что-то, что мне нужно использовать 🙂 Спасибо за помощь и комментарии.