我不是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中的标记。
答案 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