#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