使用for循环和数组比较来自不同工作表的两个单元格

时间:2016-03-17 14:04:12

标签: arrays excel vba excel-vba

我在工作表上有一个单元格A1到lastrow的列表"在这里输入"我在"字符串列表"上有一个完整的字符串值列表。单元格A1到A692上的工作表,我已经存储在数组svr上。我想要发生的是宏来检查工作表上的A列上的所有值"输入这里"并将它与数组svr内的值逐一比较,直到找到它匹配为止,当它发生匹配时,它将从工作表中复制一系列单元格" String List"到工作表"在这里输入"。我已经尝试了下面的代码,我认为它需要更多的工作。

Sub Main_SvrLst()

Dim inp As Worksheet
Dim lst As Worksheet
Dim svr(691) As String

Set inp = ThisWorkbook.Sheets("Input Here")
Set lst = ThisWorkbook.Sheets("String List")

lr = inp.Cells(Rows.Count, 1).End(xlUp).Row

For svrctr = 0 To 691
    svr(svrctr) = lst.Range("A2").Offset(svrctr, 0).Value
Next svrctr

For a = 2 To lr
If inp.Cells(a, 1) = svr(a) Then

    Worksheets("String List").Activate
    lst.Range(Cells(a, 2), Cells(a, 8)).Copy
    inp.Cells(Rows.Count, 2).End(xlUp).Offset(1, 0).PasteSpecial
    Worksheets("Input Here").Activate

End If
Next a



End Sub

2 个答案:

答案 0 :(得分:3)

您可以使用"输入此处"中的公式,而不是使用VBA代码。片:

B2

=""&IFERROR(INDEX('String List'!$A:$H, MATCH($A2, 'String List'!$A:$A, 0), COLUMN()), "")

将此公式复制到H2的右侧,并将所有内容复制到您的输入中。

答案 1 :(得分:-1)

为了更清晰的识别,我更改了一些命名。

同时关闭设置Array以获取引用正确的数字

 Sub Main_SvrLst()

      Dim inp As Worksheet
      Dim lst As Worksheet
      Dim svr(691) As String

      Set inp = ThisWorkbook.Sheets("Input Here")
      Set lst = ThisWorkbook.Sheets("String List")

      Dim LastRowOfInputHere As Long
      LastRowOfInputHere = inp.Cells(Rows.Count, 1).End(xlUp).Row

      Dim svrctr As Long
      'Made it 2 to 691 to off set your Header Row
      'This way the Array position and the row number are the same
      For svrctr = 2 To 691
           svr(svrctr) = lst.Cells(svrctr, "A").Value
      Next svrctr

      Dim InputHereRowReference As Long
      Dim StringListArrayReference As Long

      'With your original text it was comparing a two row offset between the "Input" and "String" Sheets
      For InputHereRowReference = 2 To LastRowOfInputHere

           For StringListArrayReference = 2 To 691

                If inp.Cells(InputHereRowReference, 1) = svr(StringListArrayReference) Then

                     lst.Activate
                     lst.Range(Cells(StringListArrayReference, 2), Cells(StringListArrayReference, 8)).Copy
                     inp.Activate
                     inp.Cells(InputHereRowReference, 2).PasteSpecial

                End If

           Next StringListArrayReference

      Next InputHereRowReference

 End Sub