Существует ли более быстрый способ циклически проходить через 2 листа, чтобы найти совпадение по 2 столбцам и ввести значения ячеек? - PullRequest
0 голосов
/ 15 мая 2019

У меня есть 2 листа в одной книге. Мне нужно сопоставить по 2 столбца в каждом листе и перенести данные из Листа2 в Лист1.

Лист1 (1–3 тыс. Строк)

  1. id1, name1
  2. id2, name2
  3. id3, name3

Лист 2 (строки от 1 до 10 тысяч)

  1. id1, name1, month1data1, month2data1, month3data1
  2. id2, name2, month1data2, month2data2, month3data2
  3. id3, name3, month1data3, month2data3, month3data3

Я уже написал код для этого, и он работает, но занимает очень много времени. Я сделал вложенный цикл для просмотра каждой строки и каждого столбца в Sheet1, а затем прошел цикл по Sheet2 (с 1k-5k строк) каждый раз. Я думаю, это то, к чему все это нужно. Может ли кто-нибудь помочь сделать это более эффективным?

table {
  font-family: arial, sans-serif;
  border-collapse: collapse;
  width: 100%;
}

th,
thead,
tfoot {
  font-family: arial, sans-serif;
  border: 1px solid #000000;
  text-align: left;
  padding: 8px;
}

td,
tr {
  border: 1px solid #000000;
  text-align: left;
  padding: 8px;
}
<h1>Sheet 1 with 1k-3k rows</h1>
<table>
  <tr>
    <th>A-id</th>
    <th>B-name</th>
    <th>C-month1</th>
    <th>D-month2</th>
    <th>E-month3</th>
  </tr>
  <tr>
    <td>id1</td>
    <td>name1</td>
    <td>insert from sheet2</td>
    <td>insert from sheet2</td>
    <td>insert from sheet2</td>
  </tr>
  <tr>
    <td>id2</td>
    <td>name2</td>
    <td>insert from sheet2</td>
    <td>insert from sheet2</td>
    <td>insert from sheet2</td>
  </tr>
  <tr>
    <td>id3</td>
    <td>name3</td>
    <td>insert from sheet2</td>
    <td>insert from sheet2</td>
    <td>insert from sheet2</td>
  </tr>
</table>

<h1>Sheet 2 with 1k-10k rows</h1>
<table>
  <tr>
    <th>A-id</th>
    <th>B-name</th>
    <th>C-month1</th>
    <th>D-month2</th>
    <th>E-month3</th>
  </tr>
  <tr>
    <td>id1</td>
    <td>name1</td>
    <td>insert to sheet1</td>
    <td>insert to sheet1</td>
    <td>insert to sheet1</td>
  </tr>
  <tr>
    <td>id2</td>
    <td>name2</td>
    <td>insert to sheet1</td>
    <td>insert to sheet1</td>
    <td>insert to sheet1</td>
  </tr>
  <tr>
    <td>id3</td>
    <td>name3</td>
    <td>insert to sheet1</td>
    <td>insert to sheet1</td>
    <td>insert to sheet1</td>
  </tr>
</table>
 For r = sheet1FirstRow To sheet1LastRow 
 DoEvents
    m = sheet1StartRow
        For c = sheet1FirstCol To sheet1LastCol
        DoEvents
            For i = sheet2FirstRow To sheet2LastRow
            DoEvents
                sheet1Id= Ws("Sheet1").Cells(r, sheet1Id_Col).Value
                sheet1Name = Ws("Sheet1").Cells(r, sheet1Name _Col).Value
                sheet2Id = Ws("Sheet2").Cells(i, sheet2Id_Col).Value
                sheet2Name = Ws("Sheet2").Cells(i, sheet2Name _Col).Value
                sheet2Data = Ws("Sheet2").Cells(i, m).Value
                If sheet1Id = sheet2Id And sheet1Name = sheet2Name Then
                    Ws("Sheet1").Cells(r, c) = sheet2Data
                    i = sheet2LastRow
                    m = m + 1
                End If
            Next i
        Next c
    Application.StatusBar = "Updating " & (r) & " of " & sheet1LastRow 
Next r

Вывод правильный, но при запуске 1k строк для sheet1 это заняло ~ 30 минут. Я бы хотел, чтобы это работало НАМНОГО быстрее ... надеюсь, через 5 минут. Это возможно?

...