Страницы: 1
RSS
Быстрый способ копирования содержимого ячейки из одной таблицы в другую
 
Доброго времени суток!
Уважаемые, подскажите пожалуйста, есть ли какой нибудь быстрый способ копирования содержимого ячейки из одной таблицы в другую?
У меня есть две таблицы в одной 400000 записей, в другой 4000. Так же есть макрос: цикл который поочередно берет строку из таблицы где 4000 записей и ищет одинаковую запись в первой таблице, где 400000 записей, если находит одинаковую запись, берет и копирует из первой таблицы столбец 7,8,9 и вставляет во вторую таблицу в столбец 8,9,10.
Все это у меня сделано через цикл For.
Делает очень долго.
Вопрос: есть ли какие нибудь быстрые способы?

вот собственно сам код:
Код
Sub poisk()
'ссылка на первый лист
   Dim sheet1 As Worksheet
   Set sheet1 = ActiveWorkbook.Sheets(1)
'ссылка на второй лист
   Dim sheet2 As Worksheet
   Set sheet2 = ActiveWorkbook.Sheets(2)
'строка для хранения идентификатора строки первой таблицы
   Dim str1 As String
'строка для хранения идентификатора строки второй таблицы
   Dim str2 As String

'позиция курсора (номер строки) в первой таблице
   Dim i As Long
   i = 2
   Dim last_i As Long
   last_i = 2
'позиция курсора (номер строки) в первой таблице
   Dim j As Long
   j = 3
   Dim las_j As Long
   last_j = 3
'определяем последнюю значимую строку первой таблицы (последняя строка в 
первой колонке которой есть значение)
   For Each Cell In sheet1.Range("A:A")
   If Cell.Row > 2 Then
   If Cell.Value > " " Then
   last_i = Cell.Row
   Else
   Exit For
   End If
   End If
   Next Cell
'определяем последнюю значимую строку второй таблицы (последняя строка в 
первой колонке которой есть значение)
   For Each Cell In sheet2.Range("A:A")
   If Cell.Row > 2 Then
   If Cell.Value > " " Then
   last_j = Cell.Row
   Else
   Exit For
   End If
   End If
   Next Cell

'пробегаем по строкам второй таблицы (внешний цикл)
For j = 3 To last_j
   'определяем идентификатор текущей строки
   str1 = sheet2.Cells(j, 1).Value & "-" & sheet2.Cells(j, 2).Value & "-" & 
sheet2.Cells(j, 3).Value & "-" & sheet2.Cells(j, 4).Value & "-" & 
sheet2.Cells(j, 5).Value & "-" & sheet2.Cells(j, 6).Value
   'пробегаем по строкам первой таблицы (внешний цикл)
   For i = 2 To last_i
   'определяем идентификатор текущей строки
   str2 = sheet1.Cells(i, 1).Value & "-" & sheet1.Cells(i, 2).Value & "-" & 
sheet1.Cells(i, 3).Value & "-" & sheet1.Cells(i, 4).Value & "-" & 
sheet1.Cells(i, 5).Value & "-" & sheet1.Cells(i, 6).Value
   'сравниваем идентификаторы строк первой и второй таблицы
   If str1 = str2 Then
   'если совпадение найдено то записываем 7, 8, 9 из первой таблицы во 
вторую в строку с соответствующей ему ФИО и Датой рождения
   sheet2.Cells(j, 8).Value = sheet1.Cells(i, 7).Value
   sheet2.Cells(j, 9).Value = sheet1.Cells(i, 8).Value
   sheet2.Cells(j, 10).Value = sheet1.Cells(i, 9).Value
   Exit For
   'прекращаем внутренний цикл, переходим к следующей итерации внешнего 
цикла (к следующей записи второй таблицы)
   End If
   Next i
Next j
End Sub
Изменено: Joskii - 11.03.2019 08:50:28
 
Есть.
Используйте словарь, массивы и отключение обновления экрана.
Без примера вашего файла подробнее сказать тяжело.
 
  1. Я бы заранее создал отдельный столбец с идентификаторами для каждой таблицы
  2. Прошелся бы новому столбцу идентификаторов первой таблице for'ом, а по второй искал бы в столбце идентификаторов Find'ом
Вы пример бы приложили файла(-ов): так бы вам быстрее помогли.
Страницы: 1
Наверх