2016-11-17 4 views
-1

Я вроде как создаю вид панели, который будет иметь форматирование, определяемое другими листами в файле.Excel VBA: сравнение двух листов excel и условного форматирования основано на дополнительных данных из листа 2

На панели мониторинга будет установлен флажок, который указывает, с какого листа он будет считываться. Я все еще работаю над первым листом.

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

Я пытаюсь написать что-то, что в основном сравнивает диапазон имен с списком имен на листе 2, если имена совпадают, я хочу, чтобы он читал номер рядом с именем на листе 2 и вычислял затем формат имя на листе 1. Здесь приведен пример кода

Dim processes As Range 
Dim applications As Range 
Dim appCount As Range 
Dim k As Integer 

Set process = Worksheets("Dashboard").Range("A4:F17") 
Set applications = Worksheets("Application").Cells(2, 1) 
Set appCount = Worksheets("Application").Cells(2, 2) 

k = 0 

For I = 1 To process.Rows.Count 
    For j = 1 To process.Columns.Count 
     If process.Cells(I, j) = applications.Offset(k, 0) Then 
      If appCount.Offset(k, 0) >= 40 Then 
       process.Cells(I, j).Interior.ColorIndex = 37 
      Else 
       If appCount.Offset(k, 0) >= 20 Then 
        process.Cells(I, j).Interior.ColorIndex = 32 
       Else 
        If appCount.Offset(k, 0) <= 19 Then 
         process.Cells(I, j).Interior.ColorIndex = 27 
        End If 
       End If 
      End If 
     End If 
     k = k + 1 
    Next j 
Next I 

в основном я хочу, чтобы соответствовать именам и сравнить значение в следующей ячейке над на листе 2, чтобы определить форматирование для имени на листе 1.

Спасибо всем, кто может помочь. Я продолжаю получать сообщение об ошибке, когда пытаюсь запустить это. Ошибка времени выполнения «438»: объект не поддерживает это свойство или метод.

+0

Пожалуйста, используйте ** indenting ** при отправке кода, если вы ожидаете, что люди его прочитают. Также укажите, какая строка выдает ошибку. –

+0

Я использовал тег кода. Извините, я исправил именование и больше код ошибки. теперь он просто окрашивает неправильные поля. – InternGrant

+0

Вставьте [Option Explicit] (https://msdn.microsoft.com/en-us/library/office/gg278855.aspx) в верхней части модуля (перед самой первой строкой кода). 'process' в настоящее время ** не ** объявлен в вашем коде. – Ralph

ответ

2

Я бы предложил использовать условное форматирование, например:

enter image description here

формулы вам нужно следующие:

=40<IFERROR(INDEX($AB$1:$AB$2,MATCH($A1,$AA$1:$AA$2,0)),"Other") 
=20<IFERROR(INDEX($AB$1:$AB$2,MATCH($A1,$AA$1:$AA$2,0)),"Other") 
=0<IFERROR(INDEX($AB$1:$AB$2,MATCH($A1,$AA$1:$AA$2,0)),"Other") 

Пожалуйста, обратите внимание, что порядок правил имеет важное значение, вы должны начать с начала, начиная с = 40 <.

+0

привет, спасибо за ответ, я еще не пробовал этого, но я собирался идти условным путем форматирования, но я планирую иметь больше условий и планирую нормализовать каждый из критериев, чтобы иметь возможность объединить и изменить цвет если нужно. Это был пробный раунд, чтобы проверить, могу ли я запустить начальный код. Я планирую иметь панель инструментов с несколькими флажками сверху, и они будут отформатироваться в соответствии с проверенным. поэтому, если установлены флажки 1 и 2. они будут вытягивать нормализованный балл от каждого и создавать новый номер для форматирования. Я сделаю это. Благодарю. – InternGrant

0

Ну, если вы хотите использовать VBA, то обратите внимание, что основная проблема с вашим кодом не зависит от языка, но что вы не получили алгоритм правильно. В настоящее время вы сравниваете процесс 1 1 только с приложением 1, затем обрабатываете 1 2 только с применением 2, ... процесс m n с применением 14 × m + n. Для того, чтобы держать думает просто, вы должны иметь третий цикл для перебора всех строк приложений, например:

Private Sub Worksheet_Activate() ' Or Private Sub Worksheet_Change(ByVal Target As Range) 
    Dim processes As Range 
    Dim applications As Range 
    Dim appCount As Range 
    Dim k As Integer 

    Set process = Worksheets("Dashboard").Range("A4:F17") 
    Set applications = Worksheets("Application").Cells(2, 1) 
    Set appCount = Worksheets("Application").Cells(2, 2) 

    For i = 1 To process.Rows.Count 
     For j = 1 To process.Columns.Count 
      For k = 0 To applications.End(xlDown).Row - 2 
       If process.Cells(i, j) = applications.Offset(k, 0) Then 
        If appCount.Offset(k, 0) >= 40 Then 
         process.Cells(i, j).Interior.ColorIndex = 37 
        ElseIf appCount.Offset(k, 0) >= 20 Then 
         process.Cells(i, j).Interior.ColorIndex = 32 
        ElseIf appCount.Offset(k, 0) <= 19 Then 
         process.Cells(i, j).Interior.ColorIndex = 27 
        End If 
       End If 
      Next k 
     Next j 
    Next i 
End Sub 

Как вы можете видеть, что я положил его в обработчик событий. Таким образом, он будет обновлять цвета при каждом повороте на рабочий лист. Кроме того, вы можете привязать его к Worksheet_Change, поэтому он будет обновляться всякий раз, когда что-то изменяется на вашей странице процесса (более частые обновления, но требует большего времени процессора).

Не считайте, что для больших наборов данных этот алгоритм не является оптимальным, но вы должны использовать двухфазный подход: (1) Соберите все пары приложений-приложенийCount или даже пары инструкций форматирования в Scripting.Dictionary и (2) итерацию все ячейки процесса, искать приложение в словаре и применять форматирование в соответствии с ним. Это было бы более эффективно, поскольку время, необходимое для поиска в словарях, пропорционально журналу (приложениям), а не приложениям.

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