Страницы: 1
RSS
Объединение таблиц по опорному столбцу
 
Здравствуйте. Надо срочно решить вопрос. Посмотрел кучу видео и почитал подобные темы, но так и не понял как решить свой.

Имеем 2 таблицы (в разных файлах или листах) с различающимися столбцами. Одинаковый у них только 1 столбец с уникальным кодом, в данном примере фамилией. По разным причинам фамилия может повторяться (при разных данных в других столбцах) или вообще пустая ячейка. Надо все объединить в одну таблицу опираясь на этот одинаковый столбец. И чтобы все несовпадающие строки сохранились.

P.S. Как я понял сводные таблицы не подходят потому что они больше для всяких подсчетов сумм и пр. Пробовал в Access  через запросы но там в любом из трех типов объединения теряются данные в одной из таблиц. В запросах excel все еще печальнее получается. Функция консолидация просто сообщает что не получилось (наверное из-за пустых ячеек). В общем любой способ не давал желаемого результата.

В реальных таблицах естественно столбцов и данных гораздо больше. Здесь приведен упрощенный пример чтобы понять как действовать. Просьба дать не просто конечный результат, а описать как действовать для его получения.

Используется лицензионный Office365, Windows10
 
тупо в лоб макросом
Код
Option Explicit

Sub qwert()
    Dim r, i, lr, f, o, m1, m2, u, rz, slf: Set slf = CreateObject("Scripting.Dictionary")
    Dim slo: Set slo = CreateObject("Scripting.Dictionary")
    With Worksheets("1")
        lr = .UsedRange.Rows.Count
        m1 = .Cells(1, 1).Resize(lr, 2).Value
    End With
    With Worksheets("2")
        lr = .UsedRange.Rows.Count
        m2 = .Cells(1, 1).Resize(lr, 2).Value
    End With
    For r = 2 To UBound(m2)
        f = m2(r, 2)
        If Len(f) > 0 Then
            slf(f) = m2(r, 1)
        Else
            slo(m2(r, 1)) = r
        End If
    Next r
    ReDim rz(1 To UBound(m1) + UBound(m2), 1 To 3)
    rz(1, 1) = "имя"
    rz(1, 2) = "отчество"
    rz(1, 3) = "фамилия"
    For r = 2 To UBound(m1)
        rz(r, 1) = m1(r, 1)
        f = m1(r, 2)
        If slf.exists(f) Then
            rz(r, 2) = slf(f)
            slf.Remove f
        End If
        rz(r, 3) = m1(r, 2)
    Next r
    If slf.Count > 0 Then
        u = slf.keys
        For i = 0 To UBound(u)
            rz(r, 3) = u(i)
            rz(r, 2) = slf(u(i))
            r = r + 1
        Next i
    End If
    If slo.Count > 0 Then
        u = slo.keys
        For i = 0 To UBound(u)
            rz(r, 2) = u(i)
            r = r + 1
        Next i
    End If
    Worksheets.Add
    Cells(1, 1).Resize(UBound(rz), UBound(rz, 2)) = rz
    Cells(1, 1).Resize(UBound(rz), UBound(rz, 2)).Columns.AutoFit
End Sub
Изменено: Александр Моторин - 27.11.2022 01:15:43 (перезалил файл)
 
Александр Моторин, извиняюсь, а ваш пример(1) чем отличается от моего? Макроса в нем не вижу. Макрос выдает какую-то ошибку. Кроме того опять у меня редактор макросов на иероглифах (уже забыл как бороться с этим). Ну и главное а если столбцов десятки? Есть какой-либо универсальный способ из стандартных?
 
pq:
Код
let
    a = Table.NestedJoin(Table.SelectRows(Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content], (x)=> x[фамилия] <> null), {"фамилия"}, Table.SelectRows(Excel.CurrentWorkbook(){[Name="Таблица2"]}[Content], (x)=> x[фамилия] <> null), {"фамилия"}, "q", JoinKind.FullOuter),
    b = Table.ExpandTableColumn(a, "q", {"отчество", "фамилия"}, {"отчество", "q"}),
    c = Table.CombineColumns(b, {"фамилия", "q"}, (x)=> x{0}??x{1}, "фамилия") & Table.SelectRows(Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content], (x)=> x[фамилия] = null) & Table.SelectRows(Excel.CurrentWorkbook(){[Name="Таблица2"]}[Content], (x)=> x[фамилия] = null)
in
    c
 
Цитата
alevlaka написал:
Кроме того опять у меня редактор макросов на иероглифах (уже забыл как бороться с этим)
копировать макрос сперва переключившись на русскую раскладку клавиатуры. Т.е. сперва переключаем раскладку, а потом делаем Ctrl+C и в редакторе Ctrl+V
Изменено: New - 28.11.2022 03:07:55
Страницы: 1
Наверх