Как найти первое и последнее вхождение строки в строке? - PullRequest
1 голос
/ 11 декабря 2019

У меня есть рабочая книга с несколькими тысячами строк, где мне нужно определить первое и последнее вхождение «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 действительно распознает длину значения каждой ячейки правильно, я мог бы построить из этого. Но я не уверен, как начать. Любая помощь будет оценена. Спасибо!

1 Ответ

0 голосов
/ 11 декабря 2019

Самый простой способ - создать небольшой цикл for, чтобы пройти через 8 столбцов данных (от AI до AP), найти первое и последнее вхождение «Y» и проверить, занимает ли это очень много времени. Но с выключенным ручным расчетом и обновлением экрана это не должно быть так долго. Ниже вы можете найти простой сабвуфер, готовый к тестированию.

Option Explicit

Sub test()
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual

    Dim t#: t = Timer
    Dim wbs As Worksheet
    Dim x As Long
    Dim col As Integer
    Dim startposition As Integer
    Dim endposition As Integer

    Set wbs = ActiveSheet


    With wbs
        For x = 1 To 7000
            startposition = 0
            For col = 35 To 42
                If .Range(.Cells(x, col), .Cells(x, col)).Value = "Y" And startposition = 0 Then
                    startposition = col
                ElseIf .Range(.Cells(x, col), .Cells(x, col)).Value = "Y" And startposition <> 0 Then
                    endposition = col
                End If
            Next col
        Next x
    End With

    Debug.Print Timer - t

    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
End Sub

Мой счет 0,57 с на пустом листе. Вы можете проанализировать этот код и, возможно, реализовать этот цикл. Для цикла x это просто симуляция ваших 7000 строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...