2016-06-03 6 views
1

У меня проблема. Для некоторой таблицы я хочу узнать позицию (только столбец) значения, меньшего порога (далее называется maxt). Я должен решить это в VBA, поскольку мне они нужны на другом листе, чтобы выдать накопленные числа.VBA: соответствие диапазона значений

Я могу получить max меньше порога, но функция совпадения vba возвращает ошибку, которая не может быть найдена. Однако, если значение maxt копируется в ячейку, и я использую функцию нормального соответствия на листе с ячейкой, содержащей maxt, как условие (= MATCH (ячейка maxt; range)), она работает без каких-либо проблем.

проблема (я только от а до с заполнены в моем примере, не имеет значения, как он не работает только на нескольких созвездий)

ABC

8 5 6 -> не работает (Error: 1004)

.

5 6 7 -> работы

7 6 7 -> работает

4 8 5 -> работает

Ниже приведен код.

Dim myVar As Double 
Dim myVarAdress As Long 

For I = 1 To 10 
myVar = Evaluate("=MAX(IF(A" & I & ":M" & I & "<6, A" & I & ":M" & I & "))") 
myVarAdress = Application.WorksheetFunction.Match(myVar, Range("A" & I & ":M" & I)) 

Next I 

End Sub 

Заранее спасибо

ответ

0

Изменение myVarAdress = Application.WorksheetFunction.Match(myVar, Range("A" & I & ":M" & I))
к myVarAdress = Application.WorksheetFunction.Match(myVar, Range("A" & I & ":M" & I), 0)
Это "0" означает, что вы ищете точное соответствие. Также вы должны добавить conditon, который будет пропускать значение 0 вашей переменной myVar. Например:

If myVar > 0 Then 
    myVarAdress = Application.WorksheetFunction.Match(myVar, Range("A" & i & ":M" & i), 0) 
End If 
0

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

1) Вы пытаетесь оценить функцию MAX(), которая имеет только один аргумент. Функция IF() вернет значение меньше 6 или FALSE (0). Таким образом, либо ваша функция MAX() не имеет значения, ваша функция IF() не имеет значения, либо вы оставили один или несколько аргументов для любой из этих функций. В любом случае не существует определенного поведения для того, что делать, если в строке нет элемента меньше 6. Это повышает вероятность того, что myVar равен 0, что может привести к ошибочным результатам, поскольку:

2) Вы оставили третий аргумент в функции MATCH(). Поскольку ваш диапазон (в настоящее время) больше, чем ваш набор данных, когда вы оставите третий аргумент для MATCH(), он будет терпеть неудачу в любое время, когда данные будут организованы неправильно. Это особенно проблематично, когда вы возвращаете FALSE из вашей функции IF() (обрабатывается как 0 MAX()), потому что MATCH() сопоставляется с пробелами в ваших данных. Это означает, что размер вашего набора данных делает вопрос. Если бы у вас было все 13 строк, ваша первая строка (вероятно) не потерпит неудачу, но на самом деле она не будет соответствовать 5, которые вы хотите, если бы были значения НИЖЕ, чем 5 справа от столбца B. Кроме того, это потенциально приводит к сбою некоторых других строк, если вдруг в любом из столбцов и нет никаких значений, но для MATCH() нет пробелов, чтобы найти и обработать как 0.

Все, что сказано, без дальнейшего разъяснения того, как вы хотите очистить эти проблемы, предлагается предлагаемое решение (предполагающее, что вы хотите, чтобы первое вхождение вашего максимального значения было меньше 6, независимо от того, сколько вхождений там):

Sub MatchSub() 

Dim myVar As Double 
Dim myVarAdress As Long 

Dim rngMaxT As Range 

Dim wsFindMax As Worksheet 
Set wsFindMax = ActiveSheet 

For i = 1 To 10 
    myVar = Evaluate("=IF(A" & i & ":M" & i & "<6, A" & i & ":M" & i & ")") 
    Set rngMaxT = wsFindMax.UsedRange.Rows(i) 
    If rngMaxT(1, 1).Value = myVar Then 
     myvaraddress = 1 
    Else 
     Set rngMaxT = rngMaxT.Find(myVar, , xlValues, xlWhole, xlByRows, xlNext, False) 
     If rngMaxT Is Nothing Then 
      'There is no value in the row less than 6 
     Else 
      myVarAdress = rngMaxT.Column 
     End If 
    End If 

Next i 

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