У меня есть цикл For, вложенный в другой цикл For, который выполняет итерацию для каждой строки в электронной таблице.
Вложенный ниже цикл for проверяет текущую строку, а затем проходит по каждой строке в электронной таблице, чтобы увидеть,соответствует критериям оператора If.Если это так, он изменяет bool на True и выходит из вложенного цикла.
Этот метод занимает слишком много времени.Электронная таблица состоит из 1000 строк и 27 столбцов, и на маленьком ПК, который я использую, будет работать вечно.
Код:
Sub Check_Errors()
Dim x As Integer
Dim lastRow As Long
Dim duplicateData As Boolean
Set Data = ThisWorkbook.Sheets("Data") 'Worksheet with Raw data
Set Errors = ThisWorkbook.Sheets("Errors") 'Where any flagged rows are copied to.
x = 2
lastRow = Data.Cells(Data.Rows.Count, "A").End(xlUp).Row
duplicateData = False
'Copies the headings from Data worksheet to Error worksheet
For j = 1 To 26
Errors.Cells(1, j).Value = Data.Cells(1, j).Value
Next j
Errors.Cells(1, 27).Value = "Error Type"
For i = 2 To lastRow
wrongSpeciality = False
For j = 2 To 300
If ((Data.Cells(i, 19) < Data.Cells(j, 19) + (Data.Cells(j, 20) / 1440) + (Data.Cells(j, 21) / 1440) _
And Data.Cells(i, 19) >= Data.Cells(j, 19)) _
Or _
(Data.Cells(i, 19) + (Data.Cells(i, 20) / 1440) + (Data.Cells(i, 21) / 1440) <= Data.Cells(j, 19) + (Data.Cells(j, 20) / 1440) + (Data.Cells(j, 21) / 1440) _
And Data.Cells(i, 19) + (Data.Cells(i, 20) / 1440) + (Data.Cells(i, 21) / 1440) > Data.Cells(j, 19))) _
_
And Data.Cells(i, 18) = Data.Cells(j, 18) _
And Data.Cells(i, 22) = Data.Cells(j, 22) _
And Not i = j Then
duplicateData = True
Exit For
End If
Next j
'If true then copy flagged row to Error worksheet and add additional column with reason row was flagged.
If duplicateData Then
For j = 1 To 26
Errors.Cells(x, j).Value = Data.Cells(i, j).Value
Next j
Errors.Cells(x, 27).Value = "Time overlapping"
x = x + 1
End If
Next i
Данные
ClinicalTime и AdminTime указаны в минутах и должны быть разделены на 1440 перед добавлением в Time, чтобы получить правильное время окончания.
Джеймс видит кого-то в 13:00 12 января и заканчивает в 13:30.Но это также показывает, что он увидел кого-то в 13:25, что было невозможно, поскольку он был с кем-то в течение этого времени.
Приведенный выше код изменит duplicateData
на True для обеих этих строк, но приметочень много времени для этого в тысячах таких случаев.
Columns 18 19 20 21 22
Date Time ClinicalTime AdminTime Clinician
12/01/18 13:00 20 10 James
12/01/18 13:25 10 20 James
12/01/18 14:30 40 0 James
14/01/18 10:00 20 20 Samantha
Стоит отметить, что время окончания может совпадать с временем начала, поэтому Джеймс мог видеть пациента в 11:00, а финиш в 11: 30, и имейте время начала для следующего пациента в 11:30, и не было бы необходимости отмечать эти два.