Объединять данные из одного листа в другой на основе критериев и заполнять только определенные ячейки c - PullRequest
0 голосов
/ 28 апреля 2020

У меня есть два источника данных для объединения sh.

Лист 1

Источник данных на Листе 1 содержит 2 столбца: AccountID и Cost. Источник находится в ячейках A3: B3 (строка данных начинается в A4) для записей от 1 до N. Вторичная ячейка содержит значение года для всех записей, которые будут использоваться в этом источнике. Он находится в ячейке D1.

Лист 2

Источник данных на Листе 2 содержит 6 столбцов и находится в диапазоне A1: F1 (данные начинаются со строки 2): Год, AccountID , Местоположение, номер телефона, тип электронной почты и стоимость. Данные продолжаются для записей от 1 до N.

I wi sh для объединения записей обеих таблиц на основе AccountID каждого диапазона данных (столбец Sheet1 A, столбец B Sheet2), где указан год (источник) на листе 1! D1) добавляется ко всем записям данных на листе 2, и записи сопоставляются по идентификатору учетной записи. Данные добавляются / добавляются к Листу 2 в последней доступной строке.

Пример # 1

AccountID "1234" находится на Листе 1, но не на Листе 2. Значение года (Sheet1! D1) содержит 2020. В конечный результат будет добавлена ​​новая строка с идентификатором AccountID «1234» в Sheet2, связанным значением Cost и годом 2020.

Пример # 2

AccountID "1234" находится на листе 1, а также на листе 2. Запись на Sheet2 имеет значение года 2019. Запись на Sheet1 имеет связанный с ней год 2020 (значение ячейки Sheet1! D1). Конечный результат будет иметь две строки данных для AccountID «1234» на Листе 2, одну для записи 2019 года и одну для записи 2020 года, как указано в источнике данных Sheet1. Последние не будут включать значения Location, Phone # или Email, поскольку они не указаны

Sheet1

Sheet2

Sheet2 после добавления данных Sheet1

1 Ответ

1 голос
/ 28 апреля 2020

Может быть, что-то вроде этого?

Sub test()
Set rng_ID = Sheets("Sheet2").Range("B:B") 'set ID range on sheet2
oYear = Sheets("Sheet1").Range("D1").Value 'get year value on sheet1
Set Rng = Sheets("Sheet1").Range("A4", Sheets("Sheet1").Range("A4").End(xlDown)) 'set ID range on sheet1

With Sheets("Sheet2")
For Each cell In Rng 'loop to each cell in ID range on sheet1
oCost = cell.Offset(0, 1).Value 'set the cost value
Set c = rng_ID.Find(cell.Value, lookat:=xlWhole) 'find if the cell value is in ID range on sheet2
    If Not c Is Nothing Then 'if found
    Set xCopy = .Range(c, c.Offset(0, 4)) 'set the range found to be copied
    c.Offset(1, 0).EntireRow.Insert 'insert entire row below the found cell
    xCopy.Copy Destination:=c.Offset(1, 0) 'copy the range above then paste
    c.Offset(1, -1).Value = oYear 'fill the year
    c.Offset(1, 4).Value = oCost 'file the cost
    Else 'if not found
    Set oFill = Sheets("Sheet2").Range("B500000").End(xlUp).Offset(1, 0) 'set the last blank cell in column B sheet2
    oFill.Offset(0, -1).Value = oYear 'fil the year
    oFill.Offset(0, 4).Value = oCost 'fill the cost
    oFill.Value = cell.Value 'fill the ID
    End If
Next cell
End With

'unmark the line below which one you want     
'Call SortByYearThenByID
'Call SortByIDThenByYear
End sub

Я пытаюсь добавить его с кодом сортировки, может быть, результат, как вы хотите

Sub SortByYearThenByID()
Set rngSort = Sheets("Sheet2").Range("A1", Range("F1").End(xlDown))

Sheets("Sheet2").Sort.SortFields.Clear
        rngSort.Sort Key1:=rngSort.Columns(1), Key2:=rngSort.Columns(2), Order1:=xlAscending, Header:=yes
End Sub

Sub SortByIDThenByYear()
Set rngSort = Sheets("Sheet2").Range("A1", Range("F1").End(xlDown))
Sheets("Sheet2").Sort.SortFields.Clear
        rngSort.Sort Key1:=rngSort.Columns(2), Key2:=rngSort.Columns(1), Order1:=xlAscending, Header:=yes
End Sub
...