2015-07-22 9 views
0

В настоящее время я пытаюсь получить макрос, где он проходит через столбец D, и на основе его значения я хочу, чтобы он окрашивался в определенные несколько ячеек в этой конкретной строке, где это значение существует. Это должно произойти для каждой строки, где она соответствует определенным критериям, но я могу только заставить ее работать, когда активная ячейка выбрана не автоматическим процессом. Вот что я до сих пор:VBA Loop для таргетинга определенных ячеек на основе критериев

Sub Validate() 

Dim rng As Range 
Dim row As Range 
Dim cell As Range 

Set rng = Range("D4:D1000") 

For Each cell In rng 
    If cell.Value = "Building Blocks" Then 
     ActiveCell.Offset(, 16).Interior.ColorIndex = 7 

    ElseIf cell.Value = "Test" Then 
     cell.Interior.ColorIndex = 4 

    End If 
Next 
End Sub 

Любая помощь была бы оценена.

+0

три вещи: 1. Является ли лист вы хотите, чтобы это работало, когда вы запускаете макрос? Если вы просто используете «Range» («D4: D1000»), он предполагает, что «Activesheet» - это лист, который вы имеете в виду. 2. Если ваши ячейки говорят, например, «Building Blocks», они будут регистрироваться как ложные, поэтому вам может понадобиться сделать Trim. 3. Наконец, вы открыли свой макрос и проходили его шаг за шагом, нажав F8, наведя указатель мыши на 'cell.value' после следующей строки после того, как' If cell.value' подсвечивается, чтобы убедиться, что ячейка. ценность - это то, что вы ожидаете? – puzzlepiece87

+0

Благодарим вас за комментарий. – Nathan

+0

Линия ActiveCell.Offset использует другую ячейку, чем те, что находятся в вашем диапазоне. Используйте переменную ячейки, которую вы установили –

ответ

1

Я не хочу, чтобы переписать код для вас, поэтому я сделал несколько изменений:

Sub Validate() 

Dim rng As Range 
Dim row As Range 
Dim cell As Range 
Dim counter As Long 

Set rng = Range("D4:D1000") 
Range("D4").Select 

For Each cell In rng 


If cell.Value = "Building Blocks" Then 
    ActiveCell.Offset(counter, 16).Interior.ColorIndex = 7 



ElseIf cell.Value = "Test" Then 
    ActiveCell.Offset(counter, 16).Interior.ColorIndex = 4 


End If 
counter = counter + 1 

Next 
End Sub 

еще лучший способ, как было отмечено 3-14159265358979323846, было бы просто взять исходный код и изменить ActiveCell для Cell:

Sub Validate()

Dim rng As Range 
Dim row As Range 
Dim cell As Range 


Set rng = Range("D4:D1000") 


For Each cell In rng 


If cell.Value = "Building Blocks" Then 
    cell.Offset(, 16).Interior.ColorIndex = 7 



ElseIf cell.Value = "Test" Then 
    cell.Offset(, 16).Interior.ColorIndex = 4 


End If 


Next 
End Sub 
+0

Что такое «ячейка» в этом коде? : 0) Я имею в виду, конечно, 'ActiveCell' должен быть заменен' cell' в соответствии с моим ответом! –

+0

Я просто использовал код, который он предоставил. Все, что я сделал, это просто добавить «счетчик» и убедиться, что D4 был выбран до того, как он запустил код. Конечно, если бы я писал это с нуля, я бы сделал это по-другому. Case Statement, не отбирать ячейки вообще и т. Д. – rwilson

+0

@ rwilson Это было действительно полезно, спасибо, я очень понимаю сейчас. Я знаю, где я ошибся. – Nathan

0

Не уверен, что я понимаю. Это будет проходить через столбец D, если он найдет Building Blocks, он будет выглядеть в этой строке для второго Building Blocks. Если он найдет его, он будет окрасить ячейку в colorindex 7. Такая же идея с поиском. Не испытано.

Sub Validate() 

Dim rng As Range 
Dim row As Range 
Dim cell As Range 

Set rng = Range("D4:D1000") 


For Each cell In rng 


If cell.Value = "Building Blocks" Then 
    for i = 2 to 50 'Howverlong your row is, could go to the end too if dynamic 
     if cell(,i).value = cell.value then cell(,i).Interior.ColorIndex = 7 
    next 



ElseIf cell.Value = "Test" Then 
    for i = 2 to 50 'Howverlong your row is, could go to the end too if dynamic 
     if cell(,i).value = cell.value then cell(,i).Interior.ColorIndex = 4   
    next 


End If 

Next 
End Sub 
1

Вы обращаетесь к ActiveCell в следующей строке ...

ActiveCell.Offset(, 16).Interior.ColorIndex = 7 

То, что вы действительно хотите ...

cell.Offset(, 16).Interior.ColorIndex =7 
Смежные вопросы