#excel #vba #excel-formula
Вопрос:
У меня есть задание, в котором у меня есть два листа. У меня есть значения в первом столбце первого листа, давайте назовем это списком. Мне нужно скопировать все строки со второго листа на вновь созданный лист, содержащий любое из заданных значений списка в первом столбце. Для каждого значения в первом столбце второго листа существует несколько вхождений. Кто-нибудь может мне помочь, пожалуйста? Я боюсь, что формулы здесь не сработают.
Первый лист:
COL1 | COL2 |
---|---|
1234 | текст |
2345 | текст |
второй лист:
COL1 | COL2 | COL3 | COL4 |
---|---|---|---|
1234 | 43534 | 53534 | 78678 |
1234 | 44565 | 4523 | 3443 |
1234 | 54456 | 277575 | 65655 |
8654 | 426 | 3433 | 10013 |
2345 | 87654 | 443 | 76565 |
2345 | 565756 | 25264 | 74435 |
Ответ №1:
Создайте отчет (Поиск с совпадением)
- Следующее является промежуточным, не столь эффективным решением. Он попытается сопоставить каждое значение в столбце
A
(sCol
) исходного рабочего листа с каждым значением в столбцеA
(lCol
) рабочего листа поиска. При совпадении текущая ячейка (sCell
) на Исходном листе будет добавлена (объединена) в Объединенный диапазон (crg
). Наконец, все строки соответствующих ячеек (Объединенного диапазона) будут скопированы на целевой лист. - Предполагается, что данные (таблицы) во всех листах начинаются с ячейки
A1
и имеют одну строку заголовков. - Отрегулируйте значения в разделе константы.
Option Explicit
Sub createReport()
' Lookup
Const lName As String = "Sheet1"
Const lCol As Long = 1
' Source
Const sName As String = "Sheet2"
Const sCol As Long = 1
Dim wb As Workbook: Set wb = ThisWorkbook ' workbook containing this code
Dim lrg As Range ' Lookup Range
With wb.Worksheets(lName).Range("A1").CurrentRegion.Columns(lCol)
Set lrg = .Resize(.Rows.Count - 1).Offset(1)
'Debug.Print lrg.Address
End With
Dim crg As Range ' Combined Range
Dim srg As Range ' Source Lookup Range
With wb.Worksheets(sName).Range("A1").CurrentRegion
Set crg = .Cells(1) ' Headers
'Debug.Print crg.Address
Set srg = .Columns(sCol).Resize(.Rows.Count - 1).Offset(1)
'Debug.Print srg.Address
End With
Dim sCell As Range ' Current cell in Source Lookup Range
For Each sCell In srg.Cells
If IsNumeric(Application.Match(sCell.Value, lrg, 0)) Then
Set crg = Union(crg, sCell)
'Debug.Print crg.Address
End If
Next sCell
Dim dCell As Range ' Destination First Cell (Range)
Set dCell = wb.Worksheets.Add(After:=wb.Sheets(wb.Sheets.Count)).Range("A1")
crg.EntireRow.Copy dCell
End Sub