У меня есть таблица данных Excel со следующим содержимым:
1-я строка: заголовки таблицы
A2: даты события A50001
B2: номера B50001 (CRITERIA 1)
C2: номера C50001 (CRITERIA 2)
E2: целевые ячейки E50001 (FLAG 1)
D2: целевая дата D50001 1
G2: G50001 целевые ячейки (FLAG 2)
F2: F50001 целевая дата 2
примечание: A2: G50001 может содержать ячейки с ошибками или пробелами
Я хотел бы выполнить обычное задание например, когда значение критериев 2 было больше, чем значение критериев 1, а значение критериев 1 было больше, чем значение критериев 1 предыдущей строки, тогда добавьте «FLAG 1» в ячейку той же строки в столбце E, когда значение критериев 2 было меньше, чем равный значению критерия 1 и значение критерия 1 было меньше, чем равное значению критерия 1 предыдущей строки, затем добавьте «FLAG 2» в ячейку той же строки в столбце G
Здесь я написал MACRO для этого
Sub add_flag_with_criteria_1_2()
Dim i As Integer
Dim Dt As Long 'this line added
Dim Cr1 As Long
Dim Cr2 As Long
Dim flag1 As Long
Dim flag2 As Long
Dim F1date As Long
Dim F2date As Long
Dim F1roof As Long
Dim F2roof As Long
Dim LR As Long 'this line added
Dim ws As Worksheet
Set ws = Worksheets("CRITERIA")
LR = Application.WorksheetFunction.CountA(ws.Range("A1:A50001")) 'this line added
Dt = Application.WorksheetFunction.Match("Date", ws.Range("1:1"), 0) 'this line added
Cr1 = Application.WorksheetFunction.Match("CRITERIA1", ws.Range("1:1"), 0)
Cr2 = Application.WorksheetFunction.Match("CRITERIA2", ws.Range("1:1"), 0)
flag1 = Application.WorksheetFunction.Match("flag1", ws.Range("1:1"), 0)
flag2 = Application.WorksheetFunction.Match("flag2", ws.Range("1:1"), 0)
F1date = Application.WorksheetFunction.Match("F1date", ws.Range("1:1"), 0)
F2date = Application.WorksheetFunction.Match("F2date", ws.Range("1:1"), 0)
For i = 2 To LR
F1roof = Application.WorksheetFunction.Max(ws.Range(Cells(2, 4), Cells(i, 4))) 'this line added
F2roof = Application.WorksheetFunction.Max(ws.Range(Cells(2, 6), Cells(i, 6))) 'this line added
If Cells(i, Cr2) > Cells(i, Cr1) And Cells(i, Cr1) > Cells(i - 1, Cr1) And Not F2roof < F1roof Then Cells(i, F1date).Value = Cells(i, Dt).Value
If Cells(i, Cr2) > Cells(i, Cr1) And Cells(i, Cr1) > Cells(i - 1, Cr1) And Not F2roof < F1roof Then Cells(i, flag1).Value = "FLAG1"
If Cells(i, Cr2) <= Cells(i, Cr1) And Cells(i, Cr1) <= Cells(i - 1, Cr1) And Not F1roof < F2roof Then Cells(i, F2date).Value = Cells(i, Dt).Value
If Cells(i, Cr2) <= Cells(i, Cr1) And Cells(i, Cr1) <= Cells(i - 1, Cr1) And Not F1roof < F2roof Then Cells(i, flag2).Value = "FLAG2"
Next
End Sub
У меня есть 2 основных вопроса здесь.
* 10 27 *
мои данные с числами могут достигать только строки 3XXXX или чего-то еще, ячейки ниже последней строки с номерами могут быть оставлены как ошибки или пробелы. Должен ли я справиться с этим с помощью application.worksheetfunction.counta и заменить последнюю строку (50001) на переменную?
Я хотел бы сделать вхождение флага 1 и флага 2 альтернативным. Т.е., если флаг 1 появляется последовательно перед следующим флагом 2, второй флаг 1 не будет добавлен (как, если флаг 1 произошел в 3/3/2020 и 5/3/2020, в то время как флаг 2 произошел в 2/3/2020 и 8 / 3/2020, флаг 1 не будет добавлен к 3/3/2020). Какой код я должен добавить для этой логи c?
Спасибо.