按行在excel列值中进行字符串搜索

时间:2012-12-09 15:22:54

标签: vbscript

我有一张包含200列的Excel表格。现在行数是3500.所以我必须搜索一个字符串,如果它出现在每行的任何列中。现在为了让这个过程更加丰富,我正在寻找任何替代而不是循环技术。有没有这样的?

IntRow6 = 2
DataCount = 0

Do While objSheet6.Cells(IntRow6,1).Value <> ""
  For DataCount = 0 to UBound(VMHArray)
        IntClmn3 = 1        
        Do While 1 = 1
            If objSheet6.Cells(IntRow6,IntClmn3).Value = VMHArray(DataCount) Then
                objSheet6.Cells(IntRow6,IntClmn3+2).Value=objSheet6.Cells(IntRow6,IntClmn3+5).Value
                Exit Do
            End If
            IntClmn3 = IntClmn3 + 1
        Loop
    Next
    IntRow6 = IntRow6 + 1
Loop

上面花了很多时间,因此我正在寻找一个等效的VBScript代码,可以更快地搜索。

修改

ParentColmnCount=ParentColmnCount-1
IntRow6=2
DataCount=0

Do While objSheet6.Cells(IntRow6,1).Value <> ""
    For DataCount=0 to UBound(VMHArray)
        If objSheet6.Range(objSheet6.Cells(IntRow6,1),objSheet6.Cells(IntRow6,ParentColmnCo‌​unt)).Find(VMHArray(DataCount)) <> Nothing Then
            MsgBox("Hi")
        End If
    Next
    IntRow6=IntRow6+1
Loop

我收到任何错误,说上面代码的Range行中出现“Object variable not set”错误。

更新

我已根据您的建议更新了我的代码,并修改了变量声明,如下所示:

选项明确

Dim objExcel1,objWorkbook

Dim strPathExcel1

Dim objSheet6,objSheet3

Dim IntRow6,IntRow3

Dim IntClmn3

Dim DataCount,ParentColmnCount

Dim Falg

Dim TaskCounter

Dim r As Range Dim s As Variant

但是我又得到了错误:预期结束声明“在行中”Dim r As Range“

1 个答案:

答案 0 :(得分:2)

签出Range.Find(返回Range个对象)。它比循环更快。

示例:

Sub Test()
    Dim r As Range
    Dim matched As Range

    'Get the second row
    Set r = Sheet1.Range("2:2")
    Set matched = r.Find("myString")

    'Do stuff with matched
End Sub

<强> UDPATE:

假设您使用CreateObject("Excel.Application"),则Range对象将出现(因为CreateObject将返回包含Range个对象和功能的Excel实例。< / p>

为了进一步证明,您已经使用Range个对象(Cells is a Range object)循环遍历工作表。

<强>更新

这是一个更高级的例子。假设Sheet1上的以下数据:

fred    ethel   ricky   bobby   1   2   3   4
lucy    myrtle  fonzy   rickie  1   2   3   4
joanie  chachie donna   patty   1   2   3   4
selma   homer   lisa    bart    1   2   3   4

您可以像这样遍历范围:

Sub test()
    Dim r As Range
    Dim names(3) As String
    Dim s As Variant

    names(0) = "ethel"
    names(1) = "fonzy"
    names(2) = "patty"
    names(3) = "selma"

    For Each s In names
        For Each r In Sheet1.Cells.CurrentRegion.Find(s)
            r.Offset(0, 4).Value = r.Offset(0, 4).Value + 1000
        Next r
    Next s
End Sub

例行程序完成后,数据现在为:

fred    ethel   ricky   bobby   1   1002    3   4
lucy    myrtle  fonzy   rickie  1   2   1003    4
joanie  chachie donna   patty   1   2   3   1004
selma   homer   lisa    bart    1001    2   3   4

<强>更新 我刚看到您对您的问题的评论(并编辑了您的问题以包含更新的代码)。

您在该行上收到“未设置对象变量”,因为您无法使用<>与对象进行比较。将行更改为:

If Not objSheet6.Range(objSheet6.Cells(IntRow6,1),objSheet6.Cells(IntRow6,ParentColmnCo‌​unt)).Find(VMHArray(DataCount)) Is Nothing Then