0

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

上記のコードの範囲行に「オブジェクト変数が設定されていません」というエラーが表示されます。

アップデート

私はあなたの提案に従ってコードを更新し、変数の宣言を以下のように変更しました:

オプション明示

薄暗いobjExcel1、objWorkbook

薄暗いstrPathExcel1

薄暗いobjSheet6、objSheet3

Dim IntRow6、IntRow3

Dim IntClmn3

Dim DataCount、ParentColmnCount

薄暗いファルグ

薄暗いTaskCounter

Dim r As Range Dim s As Variant

しかし、私は再びエラーを受け取ります:「DimrAsRange」の行の「Expectedendofstatement」

4

1 に答える 1

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を含むExcelのインスタンスが返されRangeます)。

Rangeさらに証明するために、オブジェクト(CellsRangeオブジェクト)を使用してワークシートを既にループしています。

アップデート:

より高度な例を次に示します。次のデータを想定します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
于 2012-12-09T15:31:01.800 に答える