Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel VBA宏,用于循环单元格、查找匹配项和复制相邻单元格_Excel_Vba_For Loop - Fatal编程技术网

Excel 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.

我希望有一个宏,当运行时,它将在两列(显示表上的m列和报告下载表上的a列)中查找匹配项,然后当有匹配项时,复制报告下载表上相邻的3个单元格(单元格B、C和D),并将它们分别粘贴到显示表的s、T和U单元格中

每个单元格只有一个匹配项。我曾尝试使用以前的一些vba代码来查找每个匹配的多个实例,但我认为我在这一点上太困惑了:(

任何帮助都将不胜感激

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(“报告下载”)
这样的长结构的一个短名称)当然,只有在代码中多次使用以这种方式描述的常量时,这才是受欢迎的。我相信在这种情况下,编写以冒号分隔的运算符是合理的。