首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何查找字符串在一行中的第一个和最后一个匹配项?

如何查找字符串在一行中的第一个和最后一个匹配项?
EN

Stack Overflow用户
提问于 2019-12-11 23:48:23
回答 1查看 143关注 0票数 1

我有一个有几千行的工作簿,我需要为每一行确定"Y“的第一次和最后一次出现。(这些字符根据它们所在的列绑定到特定的日期)。我必须找到这些字符的开始和停止,因为它会给我每个任务的开始和结束日期。到目前为止,我已经尝试过了:

代码语言:javascript
运行
复制
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“,但find遗漏了它,并在该行中拾取了"Y”的下一个实例。在7,000+行之外,这种情况只发生过几次,而且总是在第35列(但大多数时候,如果"Y“在该行的那一列,它就会找到它)。这显然打乱了我对这些行的日期。我不知道这会是什么。我已经尝试通过检查单元的长度和值来进行调试,其中"Y“表示缺少查找。但它返回的值为1,值为"Y“。我尝试在搜索值和公式之间切换,但也不起作用。

所以我需要找到一种新的方法来找到匹配项。我在想,因为我知道vba能够正确识别每个单元格的值的长度,所以我可以在此基础上进行构建。但我不确定该如何开始。任何帮助都将不胜感激。谢谢!

EN

Stack Overflow用户

发布于 2019-12-12 02:42:11

最简单的方法是创建小的for循环,遍历8列数据(从AI到AP),找到第一个和最后一个出现的"Y“,并检查这是否非常耗时。但在手动计算和屏幕更新关闭后,时间应该不会太长。下面你可以找到简单的sub,准备测试。

代码语言:javascript
运行
复制
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。您可以分析该代码,并可能实现该循环。For x循环只是对您的7000行的模拟。

票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59289437

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档