【问题标题】:String search with in the excel column values row wise在 excel 列值中逐行搜索字符串
【发布时间】:2012-12-09 15:22:54
【问题描述】:

我有一个包含 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 行收到任何错误提示“未设置对象变量”错误。

更新

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

选项显式

调暗 objExcel1,objWorkbook

暗淡 strPathExcel1

调暗 objSheet6,objSheet3

调暗 IntRow6,IntRow3

Dim IntClmn3

Dim DataCount,ParentColmnCount

昏暗的法格

调暗任务计数器

Dim r As Range 变暗变体

但我再次收到错误:“Dim r As Range”行中的预期语句结束”

【问题讨论】:

  • 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,ParentColmnCount)).Find(VMHArray(DataCount)) Nothing Then MsgBox("Hi") End If Next IntRow6=IntRow6+1 循环
  • @pete 但在上述代码的 Range 行出现任何错误,即“未设置对象变量”错误。

标签: vbscript


【解决方案1】:

查看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 实例)。

为了进一步证明,您已经在使用 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

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

您在该行收到“未设置对象变量”,因为您不能使用 &lt;&gt; 与对象进行比较。改行改为:

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

【讨论】:

  • 我希望在 VBScript 中实现此功能。您能否确认 Range 对象是否存在于 VBScript 中?
  • Find 方法是否只返回 True 或 False?我也可以得到匹配的列号吗?
  • 它返回一个Range 对象,它也可以是一个集合。您可以通过matched.Column 访问列号。有关详细信息,请参阅msdn.microsoft.com/en-us/library/office/…
  • 感谢您的帮助。我还有一个问题。您在下面的代码中提到 Set r = Sheet1.Range("2:2")。但在我的代码中,我使用 Loop 来访问每一行。所以我需要使用变量而不是常量值。那么这里也有什么想法吗?
  • 在你的代码中你说 Range("2:2"),但是我使用 while 循环来访问每一行。所以我不能使用常量,而是需要使用变量。但是如何框架有什么想法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-02
  • 2016-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多