2016-07-18 3 views
-1

Я использую функцию VBA Find(), но не могу заставить функцию поиска искать только в определенном диапазоне. Может ли кто-нибудь помочь мне с этим?Функция поиска VBA не может определить диапазон значений

Я получаю сообщение об ошибке времени выполнения «1004» приложения определить или объект определение ошибки на y = Sheets(i).Range(Cells(10, 1), Cells(frow, k)).Find(ID).Offset(0, 6).Value 'full soln max

Я пытаюсь определить диапазон между для моей функции находки для поиска внутри. . Его с 10-го ряда в любой строке текста «GLOBAL GROUP ПОКУПКИ» находится в

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

Sub highlightcases() 
    Application.ScreenUpdating = False 
    For i = 2 To Worksheets.Count 
    k = 2 * i - 1 
    For j = 13 To Sheets(1).Cells.Find("GLOBAL GROUP PURCHASES").Offset(-2, 0).Row 
     ID = Sheets(1).Cells(j, 1).Value 'case comparison stream name  
     frow = Cells.Find("GLOBAL GROUP PURCHASES").Row  
     x = Sheets(1).Cells(j, 1).Offset(0, 2).Value 'case comparison sheet activity 
     y = Sheets(i).Range(Cells(10, 1), Cells(frow, 1)).Find(ID).Offset(0, 6).Value 'full soln max  
     Z = Sheets(i).Range(Cells(10, 1), Cells(frow, 1)).Find(ID).Offset(0, 5).Value ' full soln min  

     If x = y And x <> 0 And y <> Z Then 'check max   
     Sheets(1).Cells(j, k).Interior.ColorIndex = 35 
     ElseIf x = Z And x <> 0 And y <> Z Then 'check min 
     Sheets(1).Cells(j, k).Interior.ColorIndex = 22 
     ElseIf y = Z And y <> 0 Then 'check fixed 
     Sheets(1).Cells(j, k).Interior.ColorIndex = 19 
     End If 

     If Sheets(1).Cells(j, k).Value <> 0 Then  
     Sheets(1).Hyperlinks.Add Anchor:=Sheets(1).Cells(j, k), Address:="", SubAddress:= _ 
       "'" & Sheets(i).Name & "'!" & Sheets(i).Range(Cells(10, 1), Cells(frow, 1)).Find(ID).Offset(0, 3).Address, TextToDisplay:=Sheets(1).Cells(j, k).Text 
     Else  
     Sheets(1).Hyperlinks.Add Anchor:=Sheets(1).Cells(j, k), Address:="", SubAddress:= _ 
       "'" & Sheets(i).Name & "'!" & Sheets(i).Range(Cells(10, 1), Cells(Cells.Find("GLOBAL GROUP PURCHASES").Row, 1)).Find(ID).Offset(0, 3).Address, TextToDisplay:="0" 
     End If 

    Next j 
    Next i 

    With Sheets(1).Cells  
    .Font.Color = vbBlack 
    .Font.Size = 8 
    .Font = Arial  
    End With 

    Application.ScreenUpdating = True 
End Sub 
+0

Разве вы уже не делаете этого при настройке 'y' и' Z'? – arcadeprecinct

+0

Да, это проблема. Это дает мне ошибку –

+0

Тогда вам нужно описать эту ошибку (точное сообщение об ошибке) и строку, в которой она встречается. – arcadeprecinct

ответ

1
y = Sheets(i).Range(Cells(10, 1), Cells(frow, 1)).Find(ID).Offset(0, 6).Value 

Вот ваша проблема: Cells(10, 1) относится к ячейке A10, очевидно. Но на каком листе? Поскольку вы не указали его, он занимает текущий активный лист, поэтому он по существу совпадает с ActiveSheet.Cells(10,1).

Ты правильно указать лист для .Range, но позже вы не укажете его в Cells так, если, скажем, Sheet(1) является активным листом и я = 2, ваша линия таким же, как

y = Sheets(2).Range(Sheets(1).Cells(10, 1), Sheets(1).Cells(frow, 1)).Find(ID).Offset(0, 6).Value 

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

With Sheets(i) 
    y = .Range(.Cells(10, 1), .Cells(frow, 1)).Find(ID).Offset(0, 6).Value 
End With 

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

+0

Спасибо! но я получаю Runtime Error 91: Object variable или с переменной блока, которая не установлена ​​"после использования вашего кода или кода RGA. Nvm моя ошибка: ошибка .find, которую я разрешил. –

+0

@MarcusChua yep, всегда сначала назначайте диапазон, а затем проверяйте, не является ли это 'Nothing', прежде чем получить его строку или столбец (или свойство) – arcadeprecinct

0

Вместо того, чтобы вызывать Find на клетки объект, вызовите его на определенном диапазоне вас хотите поискать. Поэтому, если вы хотите выполнить поиск в первом столбце, вызовите Sheets(1).Range("A:A").Find("GLOBAL GROUP PURCHASES").Offset(-2, 0).Row или даже Sheets(1).Columns(1).Find("GLOBAL GROUP PURCHASES").Offset(-2, 0).Row. Для именованного диапазона, определяемого переменной, используйте Sheets(1).Range(YourRangeVariableName).Find("GLOBAL GROUP PURCHASES").Offset(-2, 0).Row

Это может быть сделано для любого диапазона любой формы или размера

В ответ на ошибку, брошенной, при использовании листа и вызова диапазона, вам нужно снова укажите лист для ячеек, поэтому вместо y = Sheets(i).Range(Cells(10, 1), Cells(frow, k)).Find(ID).Offset(0, 6).Value вам необходимо позвонить y = Sheets(i).Range(Sheets(i).Cells(10, 1), Sheets(i).Cells(frow, k)).Find(ID).Offset(0, 6).Value. Это происходит потому, что любая ячейка или диапазон вызывается без указанного листа будет вызывать из активного листа, так что если Sheets(i) не активный листа, вы получите клетки, которые не могут быть в Sheets(i).Range()

+0

Спасибо! Но я не могу выполнить поиск по всему столбцу, потому что есть значения repesting –

+0

@MarcusChua, затем отрегулируйте указанный диапазон до нужного диапазона – RGA

+0

Да, это то, что я пытаюсь сделать. Но где «глобальные групповые покупки» - это изменения. –