Excel VBA宏,用于循环单元格、查找匹配项和复制相邻单元格
我希望有一个宏,当运行时,它将在两列(显示表上的m列和报告下载表上的a列)中查找匹配项,然后当有匹配项时,复制报告下载表上相邻的3个单元格(单元格B、C和D),并将它们分别粘贴到显示表的s、T和U单元格中 每个单元格只有一个匹配项。我曾尝试使用以前的一些vba代码来查找每个匹配的多个实例,但我认为我在这一点上太困惑了:( 任何帮助都将不胜感激Excel VBA宏,用于循环单元格、查找匹配项和复制相邻单元格,excel,vba,for-loop,Excel,Vba,For Loop,我希望有一个宏,当运行时,它将在两列(显示表上的m列和报告下载表上的a列)中查找匹配项,然后当有匹配项时,复制报告下载表上相邻的3个单元格(单元格B、C和D),并将它们分别粘贴到显示表的s、T和U单元格中 每个单元格只有一个匹配项。我曾尝试使用以前的一些vba代码来查找每个匹配的多个实例,但我认为我在这一点上太困惑了:( 任何帮助都将不胜感激 Sub Display() Dim ws1 As Worksheet, ws2 As Worksheet Set ws1 = ThisWorkbook.
Sub Display()
Dim ws1 As Worksheet, ws2 As Worksheet
Set ws1 = ThisWorkbook.Sheets("DISPLAY")
Set ws2 = ThisWorkbook.Sheets("REPORT_DOWNLOAD")
Dim arr_1 As Variant, arr_2 As Variant, arr_result As Variant
arr_1 = ws1.Range("K2:K" & ws2.Range("D" & ws2.Rows.Count).End(xlUp).Row).Value2
arr_2 = ws2.Range("A2:L" & ws2.Range("A" & ws2.Rows.Count).End(xlUp).Row).Value2
ReDim arr_result(LBound(arr_2) To UBound(arr_2), 1 To 3)
Dim i As Long, j As Long
For i = LBound(arr_1, 1) To UBound(arr_1, 1)
For j = LBound(arr_2, 1) To UBound(arr_2, 1)
If arr_1(i, 1) = arr_2(j, 1) Then
arr_result(i, 1) = arr_2(j, 6)
arr_result(i, 2) = arr_2(j, 7)
arr_result(i, 3) = arr_2(j, 8)
End If
Next j
Next i
ws1.Cells(2, 17).Resize(UBound(arr_result, 1), 3).Value2 = arr_result
End Sub
这通常是这样做的:
Sub updateDisplayList()
Rem Just define work sheets:
Dim wsSource As Worksheet: Set wsSource = Worksheets("REPORT_DOWNLOAD")
Dim wsTarget As Worksheet: Set wsTarget = Worksheets("DISPLAY")
Rem
Dim rSearch As Range, rWhat As Range, rBase As Range, oCell As Range
Dim vVar As Variant
Rem Column A of source sheet:
Set rSearch = Application.Intersect(wsSource.UsedRange, wsSource.Columns(1)).Offset(1, 0)
Rem 3 first cells in columns which will be copied
Set rBase = wsSource.Range("B1:D1")
Rem Range with data to search: used part of column M
Set rWhat = Application.Intersect(wsTarget.UsedRange, wsTarget.Range("M:M"))
For Each oCell In rWhat
If Not IsEmpty(oCell) Then
vVar = Application.Match(oCell.Value, rSearch, 0)
If Not IsError(vVar) Then
rBase.Offset(vVar, 0).Copy Destination:=oCell.Offset(0, 6)
Rem If you want to clear target cells when value not found in source sheet:
Else
oCell.Offset(0, 6).Resize(1, 3).ClearContents
End If
End If
Next oCell
End Sub
(不确定M列-在代码中使用K列的值)我不认为在一行中创建和分配变量是一种好的做法。虽然这样做当然是可能的,但我认为它作为VBA的可读性不是很好。@horst您当然是对的-如果一个变量在一个过程中多次更改其值,那么每个新的分配都必须用一行新代码显示。但是,如果一个变量e只定义一次,然后用作常量(是的,常量只是像
ThisWorkbook.Worksheets(“报告下载”)
这样的长结构的一个短名称)当然,只有在代码中多次使用以这种方式描述的常量时,这才是受欢迎的。我相信在这种情况下,编写以冒号分隔的运算符是合理的。