2016-06-17 2 views
0

Я начинаю с VBA и ищу помощь по моему вопросу. Я пытаюсь сделать следующее:Возвращение объекта диапазона с использованием оператора IF в VBA

  1. Loop через колонку в моей таблице, чтобы найти строку, соответствующую два комбинацию из двух значений
  2. Затем цикл по строке, соответствующей этой комбинации происходит по горизонтали, чтобы вернуть диапазон всех значений, которые передают if-statement (> 40) (набор чисел, которые передают оператор if, всегда последователен & только один набор в строке, т. е. (15, 34, 32, 42, 45, 56, 67, 56 , 43, 39, 23, 14)
  3. Я хотел бы также вернуть номер столбца первого и последнего значений, которые передают оператор if, чтобы иметь возможность извлекать диапазон дат в другой строке

В псевдокоде это будет что-то вроде этого:

For r = 1 To 10000 'Loop through 10000 rows to find the correct ACV field 
       If WkSht.Range("B" & r).Value = "%ACV" And WkSht.Range("C" & r) = bp_upc Then 
        'For column in row(r) 
         'If column > 40 add cell address to range object to be returned 
        'Next Column 
       'End If 

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

Любая помощь или советы были бы высоко оценены.

ответ

1
public sub test 
    dim res as range 
    dim i as long 

    for i = 1 to 10000 
    if WkSht.cells(i, 2).value = "%ACV" and WkSht.cells(i, 3) = bp_upc then 
     dim numbers_range as range 
     with application.intersect(WkSht.rows(i), WkSht.usedrange) 
     set numbers_range = WkSht.range(WkSht.cells(i, 4), .cells(.cells.count)) 
     end with 

     if res is nothing then 
     set res = Get40Range(numbers_range) 
     else 
     dim current_res as range 
     set current_res = Get40Range(numbers_range) 

     if not current_res is nothing then set res = application.union(res, current_res) 
     end if 
    end if 
    next 

    'use res 
    'e.g. print res.address, do res.select or loop over res.areas 
end sub 

private function Get40Range(byval row as range) as range 
    dim c as range, start40 as range, end40 as range 

    for each c in row 
    if c.value > 40 then 
     if start40 is nothing then set start40 = c 
     set end40 = c 
    elseif c.value <= 40 and not start40 is nothing then 
     exit for 
    end if 
    next 

    if end40 is nothing and not start40 is nothing then 
    set end40 = row.cells(row.cells.count) 
    end if 

    if not start40 is nothing then set Get40Range = start40.resize(, end40.column - start40.column + 1) 
end function 
+0

Wowza - это большая работа для небольшого псевдо-кода. Надеюсь, это оценено! – dbmitch

+0

@GSerg Спасибо за быстрый ответ. Код, который вы предоставили, делает именно то, что мне нужно, так что это было очень полезно. Мне пришлось искать несколько функций, которые вы использовали, но это начинает иметь смысл. Еще раз спасибо! –