2015-03-09 3 views
1

Я сделаю все возможное, чтобы попытаться объяснить мою проблему, но это все еще немного нечеткое в моей голове, поэтому это может быть не так ясно, как должно быть, за что я заранее извиняюсь ,VBA: Синтаксис для динамических диапазонов CountIf

Вот часть моего кода у меня возникают проблемы с:

If Application.WorksheetFunction.countif(Range("D:D"), Cells(x, firstcolumn).Value) _ 
    And Application.WorksheetFunction.countif(Range("F:F"), Cells(x, firstcolumn).Value) _ 
    And Application.WorksheetFunction.countif(Range("H:H"), Cells(x, firstcolumn).Value) Then 

Идея этого проекта, чтобы проверить, если значения в «Cells (х, firstcolumn)» присутствуют в столбцах D, F и H одновременно, а затем вставьте значения где-то еще. Однако количество столбцов для проверки значений «Ячейки (x, firstcolumn)» может быть изменено, поэтому значения должны быть проверены в любом количестве столбцов (2, 10 и т. Д.). Мой код отлично работает для указанных диапазонов, но если он отсутствует или больше добавлен, он перестает работать.

Столбцы, подлежащие проверке, всегда смещаются на 2 из первого столбца, а firstcolumn всегда B, он будет проверяться на D, F, H и т. Д., В то время как столбцы C, E, G и т. Д. Имеют другие данные, не относящиеся к эта часть.

Моя догадка иметь COUNTIF Изменяется динамически изменяться, но я в недоумении, когда и как это должно быть сделано ...

Может кто мне точку в правильном направлении, чтобы достичь этого ? При необходимости я могу опубликовать полный код.

Cheers!

+0

Просто примечание стороны, ваше 'условие If' хак, нет логического выражения что VBA объединяет результат «WorksheetFunction.CountIf» в 'Boolean', поэтому ваш код вводит блок« Then »только тогда, когда все числа больше 0 - изменение кода для чтения« If Application.WorksheetFunction ». CountIf (...)> 0 И ... Тогда' сделает намерение более ясным. –

ответ

2

Вам нужно извлечь функцию здесь. Что-то вроде этого:

Private Function IsPresentInRange(ByVal source As Range, ByVal value As Variant) As Boolean 
    IsPresentInRange = Application.WorksheetFunction.CountIf(source, value) > 0 
End Function 

И тогда вам нужен способ, чтобы выяснить, какие диапазоны должны дать его для параметра source - что может быть функцией самостоятельно, или вы можете жестко закодировать их куда-нибудь; в основном вы хотите иметь понятие группы диапазонов вызвать эту функцию с - это было бы самым простым:

Private Function GetSourceRanges() As Collection 
    Dim result As New Collection 

    result.Add Range("D:D") 
    result.Add Range("F:F") 
    result.Add Range("H:H") 
    'maintain this list here 

    Set GetSourceRanges = result 
End Function 

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

И тогда вы можете просто перебирать эти диапазоны и определить, если вы получаете счетчик> 0 для всех из них:

Dim sources As Collection 
Set sources = GetSourceRanges 

Dim result As Boolean 
result = True 

Dim sourceRange As Range 
For Each sourceRange In sources 
    result = result And IsPresentInRange(sourceRange, Cells(x, firstcolumn).Value) 
Next 

If result Then 
    ' whatever you had in that If block 
End If 
+0

Очень интересный Мат, спасибо, что нашли время, чтобы ответить на мой вопрос. Я попробую вашу идею и отчитаю! – vlad88667

+0

Хорошо, я попробовал вашу идею, и она работает блестяще, пока заполнены столбцы данных, заданные как GetSourceRanges. Однако, если столбец (например, H: H) не существует, функция ничего не вернет. Я предполагаю, что функция GetSourceRanges должна создать список диапазонов до того, как остальная часть кода будет работать на основе доступных столбцов данных. – vlad88667

Смежные вопросы