Страницы: 1
RSS
Строку в массив
 
Уважаемые форумчане!

Подскажите пожалуйста, как верно загнать значения строки в массив?
Код
Sub Макрос1()

    With ThisWorkbook.Sheets("1")
        AcheckArray = Array(Split(.Range("B2"), " + ")) 'массив из строки
    End With
    
    ArrDim = UBound(AcheckArray) 'первая размерность массива в зависимости от количества элементов
        
    With ThisWorkbook.Sheets("2")
        For a = LBound(AcheckArray) To UBound(AcheckArray)
                Set iAcheck = .Range("Таблица1[Check]").Find(AcheckArray(a)) 'поиск в строке по элементу массива
                ReDim ar(1 To ArrDim, 1 To 3) 'размер для массива
                i = i + 1
                ar(i, 1) = iAcheck.Offset(, 1)
                ar(i, 2) = iAcheck.Offset(, 2)
                ar(i, 3) = iAcheck.Offset(, 3)
        Next a
    End With
    
End Sub
Через Locals Window наблюдаю что массив собрался из строки AcheckArray = Array(Split(.Range("B2"), " + ")).
Однако не показывает количество элементов в массиве, ну и соответственно цикл не работает.

Спасибо.
 
Код
Sub Макрос1()

    With ThisWorkbook.Sheets("1")
        AcheckArray = Split(.Range("B2"), " + ") 'массив из строки
    End With
    
    ArrDim = UBound(AcheckArray) 'первая размерность массива в зависимости от количества элементов
        
    With ThisWorkbook.Sheets("2")
        ReDim ar(1 To ArrDim, 1 To 3) 'размер для массива
        For a = LBound(AcheckArray) To UBound(AcheckArray) - 1
                Set iAcheck = .Range("Таблица1[Check]").Find(AcheckArray(a)) 'поиск в строке по элементу массива
                i = i + 1
                ar(i, 1) = iAcheck.Offset(, 1)
                ar(i, 2) = iAcheck.Offset(, 2)
                ar(i, 3) = iAcheck.Offset(, 3)
        Next a
    End With
    
End Sub
 
Jungl, спасибо. Увидел что задатчик размерности в цикле стоял. Но подскажите почему количество элементов определяет как 3, хотя их 4?
И первая сборка ar(...) почему то неверные значения собирает.
 
Цитата
ac1-caesar написал:
определяет как 3
Потому что отчет элементов в массиве начинается с нуля. Теперь считайте: 0 это 1, а 3 это ?.
Насчет значений не разбирался. Но судя по всему, вам нужно это LookAt:=xlWhole. Почитайте про метод Find.
Обратите внимание, что есть исправление в этом месте:
Код
AcheckArray = Split(.Range("B2"), " + ")
 
Jungl, да увидел это исправление тоже. Метод Find немного известен с использованием LookAt:=xlWhole. Но там поиск по всему столбцу идет, а этот вариант удобнее так как работает с диапазонами таблиц.
Исправил строки
Код
ReDim ar(1 To ArrDim + 1, 1 To 3) 'размер для массива
        For a = LBound(AcheckArray) To UBound(AcheckArray)
Теперь три вхождения ar(2), ar(3), ar(4) верно отрабатывают. Почему то первое ar(1) неверно, берет значения из последней строки, хотя из первой должны быть.
 
Jungl, хотя извиняюсь. Ваша подсказка была в верном направлении.
Изменил в этой строчке и все отработало как надо. Спасибо еще раз.
Код
Set iAcheck = .Range("Таблица1[Check]").Find(What:=AcheckArray(a), LookIn:=xlFormulas, LookAt:=xlWhole) 
 
Цитата
ac1-caesar написал:
Почему то первое ar(1) неверно, берет значения из последней строки, хотя из первой должны быть.
Потому что без LookAt:=xlWhole у вас вместо A1 ищет в A10, понимаете разницу?
Страницы: 1
Читают тему
Наверх