Версии VLookup для VBA

#excel #vba #worksheet-function

Вопрос:

Приношу извинения, если я пропустил это в существующем вопросе.

В основном то, чего я хочу достичь, это:

  • Верните последние два значения Pass/Fail для соответствующей области
  • Если я использую Area1 в качестве примера, я верну: «FAILFAIL»

Пример таблицы, которую я заполняю

Таблица такая же, как и выше:

  • КОЛА = Счетчик для подсчета вхождений области (текущая формула)
  • COLB = Фактическое имя области (добавлено с помощью VBA)
  • COLC = Уровень аудита (добавлен с VBA)
  • ХОЛОДНЫЙ = Пустой
  • COLE = Дата (добавляется с VBA)
  • COLF = Передача/Сбой (добавлено с VBA)
  • COLG = Решение продвигать или нет, основанное на оценке последних двух значений «пройдено/не пройдено».
  • COLH = Дает новый Lvl, зависящий от G

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

Поэтому, в конечном счете, я хочу автоматизировать колонку G amp; H.

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

 res1 = [RESULT1]
res2 = [RESULT2]

        
If res1 amp; res2 = "PASSPASS" Then
        Action = "Promote"
  ElseIf res1 amp; res2 = "FAILFAIL" Then
        Action = "Demote"
  Else
        Action = "Retest"
End If
 

Комментарии:

1. Очень трудно понять вашу текущую формулу, пожалуйста, добавьте скриншот, который также содержит заголовки столбцов и строк. также укажите, в какую ячейку вводится ваша формула и работает ли она должным образом. Кроме того, текущее содержимое столбца «пройти или не пройти», похоже, не соответствует описанному вами правилу, пожалуйста, опубликуйте последовательный пример

2. Это просто опечатка, что части строки, начинающиеся с Area двух последних строк столбца A, не сопровождаются пробелом , т. Е. Area1 - .." instead of областью 1 — 1`, как в первой строке? @Уильям Джарвис

Ответ №1:

Используйте объект словаря для хранения последнего значения Pass/Fail для сравнения.

 Option Explicit
Sub process()
    Dim wb As Workbook, ws As Worksheet
    Dim dict As Object, key As String
    Dim iLastRow As Long, r As Long
    Dim PassFail As String, Action As String, n As Long

    Set dict = CreateObject("Scripting.Dictionary")

    Set wb = ThisWorkbook
    Set ws = wb.Sheets("Sheet1") ' sheet to process
    iLastRow = ws.Cells(Rows.Count, "B").End(xlUp).Row

    For r = 2 To iLastRow
        key = Trim(ws.Cells(r, "B")) ' area name
        PassFail = UCase(Trim(ws.Cells(r, "F")))
    
        If dict.exists(key) Then
            ' second or more occurance of area name
            If dict(key) = PassFail Then
                 ' same at last time
                If dict(key) = "PASS" Then
                    Action = "Promote"
                Else
                    Action = "Demote"
                End If
            Else
                ' different to last time
                Action = "Retest"
            End If

            ' update col G
            ws.Cells(r, "G") = Action

            ' store pass/fail for next occurance
            dict(key) = PassFail

        Else
            ' first occurance of area name
            dict.Add key, PassFail
            Action = ws.Cells(r, "G")
        End If

        ' update col H
        Select Case Action
            Case "Promote": n = 1
            Case "Demote": n = -1
            Case Else : n = 0
        End Select
        ws.Cells(r, "H") = ws.Cells(r, "C")   n '

    Next
    MsgBox iLastRow - 1 amp; " rows processed", vbInformation
End Sub
 

Ответ №2:

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

     LastArea = Application.WorksheetFunction.CountIf(ws.Range("B:B"), AuditForm.Area1.Value)

last1 = AuditForm.Area1.Value amp; "-" amp; LastArea
last2 = AuditForm.Area1.Value amp; "-" amp; LastArea - 1
results = Application.WorksheetFunction.VLookup(last1, Sheet2.Range("A2:F2000"), 5, False) amp; Application.WorksheetFunction.VLookup(last2, Sheet2.Range("A2:F1000"), 5, False)
lev1 = Application.WorksheetFunction.VLookup(last1, Sheet2.Range("A2:F1000"), 3, False)
lev2 = Application.WorksheetFunction.VLookup(last2, Sheet2.Range("A2:F1000"), 3, False)

If lev1 = lev2 And results = "PASSPASS" Then
        action1 = "Promote"
    ElseIf lev1 = lev2 And results = "FAILFAIL" Then
        action1 = "Demote"
    Else
        action1 = "Retest"
End If

If action1 = "Promote" Then
       lvl = lvl   1
  ElseIf action1 = "Demote" Then
       lvl = lvl - 1
  ElseIf action1 = "Retest" Then
       lvl = lvl
End If