Страницы: 1
RSS
Создание итоговой таблицы из строк и столбцов с непустыми значениями, свобная таблица или формула
 
Здравствуйте. Помогите сформировать итоговую таблицу путем использования Сводных таблиц или формулы, чтобы выбирались строки и столбцы только с имеющимися значениями.

Пример исходной таблицы и необходимой прилагается.
Просьба, если удобно, при использовании сводной таблицы, приложить скрин или описание последовательности (что-куда) её формирования.
 
Небольшое уточнение, может ли быть такое, что ФИО будут повторяться, например будет два Смирнова М.М. и в товаре хлеб у одного будет 11, у второго 5, что с этим делать?
 
Здравствуйте.
Вариант здесь
 
Вариант макросом:
Код
Sub Макрос1()
    Dim n As Long, m As Long, k As Long, i As Long, sd As Object, lr As Long, lc As Long, ln As Long
    Set sd = CreateObject("Scripting.Dictionary")
    Set sd_t = CreateObject("Scripting.Dictionary")
    lr = Cells(Rows.Count, 2).End(xlUp).Row
    lc = Cells(2, Columns.Count).End(xlToLeft).Column
    arr = ActiveSheet.Range(Cells(1, 1), Cells(lr, lc))
    ln = 0
    For m = 1 To UBound(arr, 2)
        If arr(1, m) = "Товар" Then ln = m
        If ln > 0 Then
            sd_t.Add arr(2, m), 0
        End If
    Next
    k = 0
    For n = 3 To UBound(arr)
        If Not sd.Exists(arr(n, 2)) Then Set sd(arr(n, 2)) = CreateObject("Scripting.Dictionary")
        For m = ln To UBound(arr, 2)
            If arr(n, m) <> "" Then
                If sd_t(arr(2, m)) = 0 Then sd_t(arr(2, m)) = 1: i = i + 1
                If Not sd(arr(n, 2)).Exists(arr(2, m)) Then
                    sd(arr(n, 2)).Add arr(2, m), arr(n, m)
                Else
                    sd(arr(n, 2))(arr(2, m)) = sd(arr(n, 2))(arr(2, m)) + arr(n, m)
                End If
            End If
        Next
        If sd(arr(n, 2)).Count > 0 Then
            k = k + 1
        End If
    Next
    ReDim arr_rez(1 To k + 1, 1 To i + 1)
    m = 2
    arr_rez(1, 1) = "ФИО"
    For Each y In sd_t
        If sd_t(y) = 1 Then
            arr_rez(1, m) = y
            sd_t(y) = m
            m = m + 1
        End If
    Next
    n = 2
    For Each y In sd
        If sd(y).Count > 0 Then
            arr_rez(n, 1) = y
            For Each y1 In sd(y)
                m = sd_t(y1)
                arr_rez(n, m) = sd(y)(y1)
            Next
            n = n + 1
        End If
    Next
    Worksheets("Результат").Select
    Worksheets("Результат").UsedRange.Clear
    Worksheets("Результат").Cells(1, 1).Resize(UBound(arr_rez), UBound(arr_rez, 2)) = arr_rez
End Sub
Изменено: Msi2102 - 28.08.2026 13:59:03
 
Вариант с дополнительными столбцами.
 
Цитата
Msi2102 написал:
может ли быть такое, что ФИО будут повторяться
Нет. Если даже в будущем будут два полных тёзки, то в графу ФИО добавится символ или сокращение.

Цитата
gling написал:
Вариант здесь
Пример использовал один, но в данном случае другая задача - по итогу должна сформироваться таблица только с ФИО/товар (строками/столбцами), в которых имеются значения.

Цитата
Алексей Абраменко написал:
Вариант с дополнительными столбцами.
В настоящей таблице, где на листе идут подряд много пересчетных таблиц места нет, но я попробовал перенести дополнительные столбцы и строки с изменением формул, необходимый результат получается. Единственное, как я понял, порядковый номер надо выставлять с учетом всего количества возможных вариаций, иначе будет выводить результат с ограничением.

Цитата
Msi2102 написал:
Вариант макросом:
Красиво всё работает, но боюсь, что сам не смогу его редактировать. Каждый месяц новая таблица с разными исходными данными.

Однако, gling, Msi2102, Алексей Абраменко, спасибо.

Есть ли ещё варианты с формулами без дополнительных строк/столбцов?
 
Цитата
Есть ли ещё варианты с формулами без дополнительных строк/столбцов
пара вариантов в файле
 
Добрый день. Еще вариант для 2021+ с динам. массивами (ПавелW, варианты схожи, но честно не подглядывал  :) )
 
Цитата
Alex написал:
Красиво всё работает, но боюсь, что сам не смогу его редактировать. Каждый месяц новая таблица с разными исходными данными.
если у Вас шапка не будет меняться, то в принципе его редактировать не нужно. Главное, чтобы таблица начиналсь как у в вашем примере, ФИО было в столбце В, слово товар находился над первым товаром, количество товара вправо не важно. Можете попробовать добавить товары и запустить макрос. К сожалению не было понимания, какие будут таблицы, их размер, и т.п. можно было избрать более гибкий алгоритм ввода данных.
Ещё вариант сделать с помощью PQ. Может позже кто-нибудь поможет.
Изменено: Msi2102 - 28.08.2026 18:55:35
 
На основании Редизайнера таблиц создал файл под вашу задачу. Вставляете лист с новыми данными, выделяете таблицу с данными и запускаете макрос, или запускаете макрос, а он при работе запросит указать таблицу с данными. Указываете сверху одну строку и слева один столбец и данные на листе Табл обновятся. На основании этих данных на листе Сводная надо обновить сводную таблицу. Макрос из статьи изменен только под вашу задачу, собирает только те ячейки в которых есть данные. В диспетчере имен прописана формула динамического диапазона данных на листе Табл.
 
gling, Msi2102, Alex, ПавелW, Спасибо за помощь
Страницы: 1
Читают тему
Наверх