2016-05-03 3 views
0

Использования мудрости one of my previous questions, я пишу заявление, что:логические операции Loop - Имея Осложнения

  • Для каждой действительной Flt проверки, если AC находятся между данными числами
  • Для каждого диапазона AC номера, проверьте Bkd в течение заданного количества
  • Если условия будут выполнены, изменить цвет шрифта/ячейки, иначе пропустите

Примечание

  • AC - столбец F; Bkd - столбец H; Flt является Колонка G
  • AC и Bkd подобраны для каждой группы, как показано на каждой строке If ниже

В настоящее время это порождает либо ошибки 91, «С блок не установлен» или «Тип Ошибка несоответствия. Я просмотрел свои предыдущие вопросы и взял большую часть этого из полностью функционирующего кода, но не могу заставить его работать. Предложения?

LastRow = Range("G" & Rows.Count).End(xlUp).Row 
AC = Range("F9:F" & LastRow) 
Bkd = Range("H9:H" & LastRow) 

With ActiveSheet.Columns("G").SpecialCells(xlCellTypeConstants, xlNumbers) 
    If (AC > "199" And AC < "500" And Bkd > "145") Or _ 
     (AC > "499" And AC < "600" And Bkd > "130") Or _ 
     (AC > "599" And AC < "700" And Bkd > "100") Or _ 
      (AC > "699" And AC < "800" And Bkd > "115") Then 
     .Font.Color = vbWhite 
     .Interior.Color = vbBlack 
    End If 
End With 

Это другой код кода попытки, указанный в моем комментарии ниже.

Dim AC, Bkd, Flt As Range 

LastRow = Range("G" & Rows.Count).End(xlUp).Row 
AC = Range("F9:F" & LastRow) 
Bkd = Range("H9:H" & LastRow) 

For Each Flt In ActiveSheet.Columns("G").SpecialCells(xlCellTypeConstants, xlNumbers) 
    With Flt 
     If (AC > "199" And AC < "500" And Bkd > "145") Or _ 
      (AC > "499" And AC < "600" And Bkd > "130") Or _ 
      (AC > "599" And AC < "700" And Bkd > "100") Or _ 
       (AC > "699" And AC < "800" And Bkd > "115") Then 
      .Font.Color = vbWhite 
      .Interior.Color = vbBlack 
     End If 
    End With 
Next Flt 
+0

В ответ на ваш предыдущий вопрос существует цикл 'Для каждой ячейки в ...'. Тебе нужен такой же подход. – OldUgly

+0

Я пробовал итерацию, которая имела «для каждой ячейки в ActiveSheet.Columns (« G ») ... и тег« Next Cell », но также генерирует ошибку несоответствия типа. Я сделал редактирование, чтобы включить другой блок с попыткой кода выше. – UserUnknown

ответ

0

Я вижу несколько «красных флажков» в вашем коде.

  1. Ваше объявление AC и Bkd не объявляет их как Диапазоны. Это может привести к неожиданному поведению.
  2. В листе определения рабочего диапазона вы не указываете рабочий лист. Это означает, что если активный лист отличается от листа с данными при запуске вашего макроса, вы получите неожиданные результаты.
  3. Вы сравниваете, например, "199" вместо 199. Я предполагаю, что ячейка будет содержать число 199, а не текстовую строку «199». Если это действительно текстовая строка, то в приведенном ниже коде вам следует изменить, например, на CLng(Flt) > 199
  4. Ваш код написан так, как вы предполагаете, вы можете оценить/сравнить большой диапазон значений, как вы можете оценить/сравните одно значение. Это не относится к VBA - поэтому у вас должен быть цикл для оценки каждой отдельной ячейки.
  5. Использование .SpecialCells(xlCellTypeConstants, xlNumbers) в конечном итоге повлияет на весь рабочий лист. Он должен быть устранен.

Вы не представили конкретные данные испытаний с ожидаемыми результатами. Я достиг этих результатов ...

enter image description here

...из этого кода, рассмотрев вышеизложенные вопросы ...

Sub test() 
Dim AC As Range, Bkd As Range, ClrRng As Range 
Dim Flt As Range 
Dim mySht As Worksheet 
Dim LastRow As Long 

Set mySht = Worksheets("Sheet1") ' <- change this to the sheet you want to use 
LastRow = mySht.Range("G" & mySht.Rows.Count).End(xlUp).Row 
Set AC = mySht.Range("F9:F" & LastRow) 
Set Bkd = mySht.Range("H9:H" & LastRow) 
Set ClrRng = mySht.Range("G9:G" & LastRow) 

For Each Flt In AC 
    If (Flt > 199 And Flt < 500 And Bkd(Flt.Row - 8, 1) > 145) Or _ 
     (Flt > 499 And Flt < 600 And Bkd(Flt.Row - 8, 1) > 130) Or _ 
     (Flt > 599 And Flt < 700 And Bkd(Flt.Row - 8, 1) > 100) Or _ 
     (Flt > 699 And Flt < 800 And Bkd(Flt.Row - 8, 1) > 115) Then 

     With ClrRng(Flt.Row - 8, 1) 
      .Font.Color = vbWhite 
      .Interior.Color = vbBlack 
     End With 

    End If 
Next Flt 

End Sub 
0

Было бы проще узнать, в какой строке возникает ваша ошибка.

Используйте этот код, чтобы определить диапазоны:

Set LastRow = Range("G" & Rows.Count).End(xlUp).Row 
Set AC = Range("F9:F" & LastRow) 
Set Bkd = Range("H9:H" & LastRow) 
+0

Я добавил «набор» для определений диапазона. Кроме того, Type Mismatch появляется для блока, начинающегося с 'If' и заканчивающегося на' Then'. Ошибка 91 появится на строке 'Bkd ='. – UserUnknown

+0

Это то место, где вам нужен цикл. Не зацикливание через ColumnG, но цикл через AC и Bkd для определения/сравнения значений в каждой ячейке и форматирования. – OldUgly

+0

Моя работа прислала меня для обучения, извините за задержку. @OldUgly Спасибо, что указали на проблему цикла. Я вижу, где мои ошибки зацикливались на неправильных столбцах и после очень незначительного изменения вашего принятого ответа код работает отлично! – UserUnknown

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