如何根据搜索字符串选择先例和后代行.- X.

时间:2011-05-20 22:18:59

标签: excel-vba excel-2007 vba excel

我不是Excel VBA的新手,也不是专家。我有一个奇怪的问题,有人帮助我,我不能再思考了。

我的Excel故事: 我在电子表格中有大约40,000行。行的格式如下:

  

row1)来源> APPNAME1

     

row2)目的地>对应的值1

     

row3)目的地>对应的值2

     

row4)来源> AppName2

     

row5)目的地>对应的值3

     

row6)来源> AppName3

     

row7)目的地>对应的值1

现在,如果通过AppName搜索,我们将是AppName1,那么row2和row3应该与row1一起复制到下一个工作表。 如果我搜索Value1,那么应该将row1,row2,row3 row7和row6复制到下一个工作表。这意味着搜索字符串先例和后代的行应该复制到下一个工作表。

由于我的声誉点数小于10,我无法提供样本表。

是否有人可以指导和协助我我已经花了3天时间但没有得到任何结果。 我有一个非常关键的时间表来准备这个库存表我是手动完成的,它需要5-6天手动完成。我想过自动化但是卡住了。

这是我的代码无效:

Sub GenerateInventory()
On Error GoTo ErrHandler:
Set r = ActiveSheet.UsedRange
nLastRow = r.Rows.Count + r.Row - 1
Set r1 = Cells(2, 8)
For i = 2 To nLastRow Step 1
If InStr(Cells(i, 6), "CMRI") <> 0 Then
Set r1 = Union(r1, Cells(i, 1))
End If
Next
r1.EntireRow.Select
r1.EntireRow.Copy
Sheets("MS4Inventory").Select
Cells(100, 1).End(xlUp).Offset(1, 0).Select
ActiveSheet.Paste
Exit Sub
ErrHandler:
MsgBox Err.Number & ": " & Error.Description

End Sub

此代码未达到WIP中的标记。

2 个答案:

答案 0 :(得分:0)

您的示例数据和要求很难理解。

我已经修改了一些代码,这可能有助于你进步 如果您可以发布数据片段和所需结果,我们可以进一步推进

Sub GenerateInventory()
    Dim r As Range, r1 As Range, rMS4Inventory As Range
    Dim nLastRow As Long, i As Long
    Dim wb As Workbook, sh As Worksheet, shMS4Inventory As Worksheet

    On Error GoTo ErrHandler:

    Set wb = ActiveWorkbook
    Set sh = wb.ActiveSheet
    Set shMS4Inventory = wb.Worksheets("MS4Inventory")

    Set r = sh.UsedRange
    nLastRow = r.Rows.Count + r.Row - 1
    Set r1 = sh.Cells(2, 8)
    For i = 2 To nLastRow Step 1
        If InStr(sh.Cells(i, 6), "CMRI") <> 0 Then
            Set r1 = Union(r1, sh.Cells(i, 1))
        End If
    Next
    Set rMS4Inventory = shMS4Inventory.Cells(100, 1).End(xlUp).Offset(1, 0).EntireRow
    r1.EntireRow.Copy rMS4Inventory
Exit Sub
ErrHandler:
    Resume
    MsgBox Err.Number & ": " & Error.Description

End Sub

答案 1 :(得分:0)

在进行编码之前,让我们抓住问题....

您要搜索工作表中的任何内容,并返回属于搜索到达的“段落”的三行

假设所有段落都是TRIPLES,标记“段落”开头的所有行都具有相同的属性:rownumber modulo 3具有相同的常量值。因此,无论你的搜索是什么rownumber,你都需要回去,直到rownumber modulo 3等于你的常数值。到达那里后,你会播放3行 - 然后停止

现在编码应该变得非常简单....你通过其他方式触发搜索或将光标“置于某处”,并触发Sub Grab()

Sub Grab3Rows()
Dim Idx As Long
    Idx = Selection.Row

    'find start of paragraph
    Do While Idx Mod 3 <> 2 ' change this constant as per your sheet
        Idx = Idx - 1
    Loop

    'select the 3 cells at the start of paragraph
    Selection.Offset(Idx - Selection.Row, 0).Resize(3, 1).Select

    'do the rest
End Sub

假设段落是n元组并且在第一行包含字符串“Source”,你可以做类似的事情:无论你的搜索到了什么,你都会一行一行地返回,直到你到达包含字符串的行“来源“,从那里你开出行直到你再次到达包含”源“的行

Sub GrabByTextString()
Dim Idx As Long
    Idx = Selection.Row

    'find start of paragraph
    Do While Left(Selection.Offset(Idx - Selection.Row, 0), 6) <> "Source"
        Idx = Idx - 1
    Loop

    'select the the start of paragraph
    Selection.Offset(Idx - Selection.Row, 0).Select

    'expand selection until we reach next paragraph start
    Idx = 1

    Do While Left(Selection(1, 1).Offset(Idx, 0), 6) <> "Source"
        Idx = Idx + 1
        Selection.Resize(Idx, 1).Select
    Loop

    'do the rest
End Sub