У меня есть рабочая книга с несколькими тысячами строк, где мне нужно определить первое и последнее вхождение «Y» для каждой строки. (Эти символы привязаны к конкретным датам в зависимости от столбца, в который они попадают). Я должен найти начало и конец этих символов, потому что это даст мне даты начала и окончания каждого задания. До сих пор я пробовал это:
Public Sub import_gbs()
Dim wb As Workbook
Dim gbs_wb As Workbook
Dim gbs_bg As Worksheet
Dim gbs_drivers As Worksheet
Dim bg As Worksheet
Dim dict As Scripting.Dictionary
Dim date_array() As String
Dim x As Long
Dim i As Long
Dim switch As Integer
Dim start_position As Integer
Dim stop_position As Integer
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Application.EnableEvents = False
Application.Calculation = xlCalculationManual
Application.TransitionNavigKeys = False
Set wb = ThisWorkbook
Set bg = wb.Sheets("Current EDGE")
Application.AutomationSecurity = msoAutomationSecurityForceDisable
Set gbs_wb = Workbooks.Open("C:\SOME PATH HERE\")
Application.AutomationSecurity = msoAutomationSecurityByUI
Set gbs_bg = gbs_wb.Sheets("CC Input")
Set gbs_drivers = gbs_wb.Sheets("Drivers")
Set dict = New Scripting.Dictionary '''
dict.Add "SU YN Start", gbs_drivers.Cells(9, 5).Value
dict.Add "SU YN Stop", gbs_drivers.Cells(9, 6).Value
dict.Add "EPMP1 YN Start", gbs_drivers.Cells(10, 5).Value
dict.Add "EPMP1 YN Stop", gbs_drivers.Cells(10, 6).Value
dict.Add "EPMP2 YN Start", gbs_drivers.Cells(11, 5).Value
dict.Add "EPMP2 YN Stop", gbs_drivers.Cells(11, 6).Value
dict.Add "RC YN Start", gbs_drivers.Cells(12, 5).Value
dict.Add "RC YN Stop", gbs_drivers.Cells(12, 6).Value
dict.Add "ON YN Start", gbs_drivers.Cells(13, 5).Value
dict.Add "ON YN Stop", gbs_drivers.Cells(13, 6).Value
dict.Add "FU YN Start", gbs_drivers.Cells(14, 5).Value
dict.Add "FU YN Stop", gbs_drivers.Cells(14, 6).Value
dict.Add "DB Lock YN Start", gbs_drivers.Cells(15, 5).Value
dict.Add "DB Lock YN Stop", gbs_drivers.Cells(15, 6).Value
dict.Add "CO/Reporting YN Start", gbs_drivers.Cells(16, 5).Value
dict.Add "CO/Reporting YN Stop", gbs_drivers.Cells(16, 6).Value
i = 2
For x = 3 To 9543
If gbs_bg.Cells(x, 25).Value > 0 Then
start_position = gbs_bg.Range("AI" & x & ":" & "AP" & x).Find(what:="Y", lookat:=xlWhole, searchdirection:=xlNext).Column
stop_position = gbs_bg.Range("AI" & x & ":" & "AP" & x).Find(what:="Y", lookat:=xlWhole, searchdirection:=xlPrevious).Column
Select Case start_position
Case 35
gbs_bg.Cells(x, 65).Value = dict("SU YN Start")
Case 36
gbs_bg.Cells(x, 65).Value = dict("EPMP1 YN Start")
Case 37
gbs_bg.Cells(x, 65).Value = dict("EPMP2 YN Start")
Case 38
gbs_bg.Cells(x, 65).Value = dict("RC YN Start")
Case 39
gbs_bg.Cells(x, 65).Value = dict("ON YN Start")
Case 40
gbs_bg.Cells(x, 65).Value = dict("FU YN Start")
Case 41
gbs_bg.Cells(x, 65).Value = dict("DB Lock YN Start")
Case 42
gbs_bg.Cells(x, 65).Value = dict("CO/Reporting YN Start")
End Select
Select Case stop_position
Case 35
gbs_bg.Cells(x, 66).Value = dict("SU YN Stop")
Case 36
gbs_bg.Cells(x, 66).Value = dict("EPMP1 YN Stop")
Case 37
gbs_bg.Cells(x, 66).Value = dict("EPMP2 YN Stop")
Case 38
gbs_bg.Cells(x, 66).Value = dict("RC YN Stop")
Case 39
gbs_bg.Cells(x, 66).Value = dict("ON YN Stop")
Case 40
gbs_bg.Cells(x, 66).Value = dict("FU YN Stop")
Case 41
gbs_bg.Cells(x, 66).Value = dict("DB Lock YN Stop")
Case 42
gbs_bg.Cells(x, 66).Value = dict("CO/Reporting YN Stop")
End Select
i = i + 1
End If
Next x
Так что это работает для меня большую часть времени. В нескольких строках есть несколько действительно странных экземпляров, где в столбце 35 присутствует буква «Y», но поиск пропускает ее и выбирает следующий экземпляр «Y» в этой строке. Из более чем 7 000 строк это происходит только несколько раз и всегда в столбце 35 (но большую часть времени он находит «Y» в этом столбце этой строки, если он там есть). Это очевидно портит мои даты для этих строк. Я понятия не имею, что это может быть. Я попытался отладить, проверив длину и значение ячейки, где "Y", что поиск отсутствует. Но это возвращается как 1 и со значением «Y». Я пробовал переключаться между поиском по значениям и формулам, что тоже не работает.
Так что мне нужно найти новый способ найти происшествия. Я думал, что, поскольку я знаю, что vba действительно распознает длину значения каждой ячейки правильно, я мог бы построить из этого. Но я не уверен, как начать. Любая помощь будет оценена. Спасибо!