Задать диапазон для указанного столбца c в выпуске сводной таблицы - PullRequest
0 голосов
/ 04 мая 2020

enter image description here

Я создал сводную таблицу в VBA и хотел бы скопировать только определенные столбцы в новую таблицу. Первый раздел кода работает нормально, когда я копирую все столбцы строки, но мой синтаксис неверен, когда я пытаюсь скопировать только указанные столбцы данных c. Я добавил изображение для более простого объяснения.

Моя сводная таблица выглядит следующим образом:

Строки : содержит 8 столбцов

Значения : 1 столбец («Количество сайтов»)

Столбцы : 1 («МС»). Который имеет 7 значений, но может быть больше в будущем. Меня интересует только тот, который показывает "4". и затем общий итог.

Я только хочу скопировать DatabodyRange столбца "4" и DatabodyRange "Count of Site" (который является общим итогом столбца)

Итак, 2-й и 3-я часть не работает (отмечено в коде).

2-я часть копирует только 7 заголовков в разделе "MS" и вставляет их во весь набор таблиц, который я установил. Следует копировать данные только из одного заголовка («4»).

3-я часть копирует все данные в столбцах значений. Таким образом, все данные под заголовками, упомянутыми выше, волнуют, а не только диапазон данных "Общая сумма".

    Dim rng As Range
    Dim CopyRange As Range
    Set rng = wsPivot.PivotTables("PvtSDCdata").RowRange
    Set CopyRange = rng.Offset(2, 0).Resize(rng.Rows.Count - 2, rng.Columns.Count)

'THIS PART WORKS
    With CopyRange
        wb.Worksheets("Number of Stores Ranged").ListObjects("Table_Number_of_Stores_Ranged").DataBodyRange.Cells(1, 1).Resize(CopyRange.Rows.Count, CopyRange.Columns.Count).Value = .Value
    End With

'2ND PART THAT DOESN'T WORK    
    Set rng = wsPivot.PivotTables("PvtSDCdata").PivotFields("MS").DataRange
    With rng
        wb.Worksheets("Number of Stores Ranged").ListObjects("Table_Number_of_Stores_Ranged").ListColumns("Number of Stores Ranged").DataBodyRange.Cells(1, 1).Resize(CopyRange.Rows.Count, CopyRange.Columns.Count).Value = .Value
    End With

'3RD PART THAT DOESN'T WORK    
    Set rng = wsPivot.PivotTables("PvtSDCdata").PivotFields("Count of Site").DataRange
    With rng
        wb.Worksheets("Number of Stores Ranged").ListObjects("Table_Number_of_Stores_Ranged").ListColumns("Total Number of Stores : In Province").DataBodyRange.Cells(1, 1).Resize(CopyRange.Rows.Count, CopyRange.Columns.Count).Value = .Value
    End With

Я занимался этим часами, но не могу найти решение онлайн. Я пробовал различные методы, но не знаю достаточно о сводных таблицах и о том, как они работают в коде VBA.

Любая помощь будет оценена.

РЕДАКТИРОВАТЬ:

Я получил 2-ую часть на работу, с помощью комментариев. Мне пришлось добавить PivotItem и изменить размер диапазона, к которому он добавлялся.

Третья часть все еще не работает. Он все еще копирует весь диапазон данных Value, когда я использую «Count of Sites». Это ошибка, когда я пытаюсь использовать PivotItem("Grand total") или PivotItem("Row Grand Total")

Обновленный код выглядит следующим образом:

    Dim rng As Range
    Dim CopyRange As Range
    Set rng = wsPivot.PivotTables("PvtSDCdata").RowRange
    Set CopyRange = rng.Offset(2, 0).Resize(rng.Rows.Count - 2, rng.Columns.Count)

'1ST PART WORKS
    With CopyRange
        wb.Worksheets("Number of Stores Ranged").ListObjects("Table_Number_of_Stores_Ranged").DataBodyRange.Cells(1, 1).Resize(CopyRange.Rows.Count, CopyRange.Columns.Count).Value = .Value
    End With

'2ND PART WORKS
    Set rng = wsPivot.PivotTables("PvtSDCdata").PivotFields("MS").PivotItems("4").DataRange
    With rng
        wb.Worksheets("Number of Stores Ranged").ListObjects("Table_Number_of_Stores_Ranged").ListColumns("Number of Stores Ranged").DataBodyRange.Value = .Value
    End With

'3RD PART NOT WORKING
    Set rng = wsPivot.PivotTables("PvtSDCdata").PivotFields("Count of Site").DataRange
    With rng
        wb.Worksheets("Number of Stores Ranged").ListObjects("Table_Number_of_Stores_Ranged").ListColumns("Total Number of Stores : In Province").DataBodyRange.Value = .Value
    End With

Я предполагаю, что проблема заключается в том, как сослаться на столбец "Общий итог"? Но я не могу понять, какой код VBA видит заголовок столбца, поскольку он не принимает методы, упомянутые выше.

Ответы [ 3 ]

1 голос
/ 04 мая 2020

Если вы хотите получить общие итоги, тогда это должно сработать:

Set lo = wb.Worksheets("Number of Stores Ranged") _
           .ListObjects("Table_Number_of_Stores_Ranged")
Set pt = wsPivot.PivotTables("PvtSDCdata")

With pt.DataBodyRange
    Set rng = .Columns(.Columns.Count) 'last column = Grand totals
End With
lo.ListColumns("Total Number of Stores : In Province").DataBodyRange.Value = rng.Value

Возможно, стоит добавить строку, чтобы убедиться, что итоги действительно отображаются.

1 голос
/ 04 мая 2020

Я публикую свой ответ, поскольку он отличается от предложенных ответов. Хотя оба вышеперечисленных варианта будут работать (и, скорее всего, будут лучшим решением для большинства людей с той же проблемой), я получил более короткую версию, которая отлично подходит для моей ситуации.

Мне очень странно, что вы не можете напрямую ссылаться на поле общего итога, как на другие поля или элементы сводной таблицы ...

Но я решил просто удалить поле "MS" из столбца (или я просто переместил его в поле страницы ), а затем используйте databodyrange для получения значений столбца «Общий итог».

    Dim rng As Range
    Dim CopyRange As Range
    Set rng = wsPivot.PivotTables("PvtSDCdata").RowRange
    Set CopyRange = rng.Offset(2, 0).Resize(rng.Rows.Count - 2, rng.Columns.Count)

'1ST CODE PART
    With CopyRange
        wb.Worksheets("Number of Stores Ranged").ListObjects("Table_Number_of_Stores_Ranged").DataBodyRange.Cells(1, 1).Resize(CopyRange.Rows.Count, CopyRange.Columns.Count).Value = .Value
    End With

'2ND CODE PART    
    Set rng = wsPivot.PivotTables("PvtSDCdata").PivotFields("MS").PivotItems("4").DataRange
    With rng
        wb.Worksheets("Number of Stores Ranged").ListObjects("Table_Number_of_Stores_Ranged").ListColumns("Number of Stores Ranged").DataBodyRange.Value = .Value
    End With

'3RD CODE PART    
    With wsPivot.PivotTables("PvtSDCdata")
        With .PivotFields("MS")
            .Orientation = xlPageField
            .Position = 1
        End With
    End With


    Set rng = wsPivot.PivotTables("PvtSDCdata").DataBodyRange
    With rng
        wb.Worksheets("Number of Stores Ranged").ListObjects("Table_Number_of_Stores_Ranged").ListColumns("Total Number of Stores : In Province").DataBodyRange.Value = .Value
    End With
1 голос
/ 04 мая 2020

Отредактируйте приведенный ниже код, чтобы он соответствовал вашим именам диапазонов.

Sub GetRowItems()

Dim pf As Range
ThisWorkbook.Worksheets("Sheet2").Activate

Set pt = ActiveSheet.PivotTables(1)

For i = 1 To pt.TableRange1.Columns.Count
    Set pf = pt.TableRange1.Columns(i)

    ThisWorkbook.Worksheets("Sheet2").ListObjects("Table2"). _
        ListColumns("Column" & i).DataBodyRange.Cells(1, 1). _
        Resize(pf.Rows.Count - 1, pf.Columns.Count).Value = _
        pf.Offset(2, 0).Resize(pf.Rows.Count - 1, 1).Value

Next
End Sub

Если вы хотите скопировать указанный c именованный сводный столбец (согласно вашему комментарию ниже), произнесите "Rame sh" в этот случай.

Sub GetRowItems()

Dim pf As Range
ThisWorkbook.Worksheets("Sheet2").Activate

Set pt = ActiveSheet.PivotTables(1)

'for "Ramesh" Column number wiil be
x = pt.TableRange1.Rows(2).Find("Ramesh").Column - pt.TableRange1.Column + 1
Debug.Print x
    Set pf = pt.TableRange1.Columns(x)

    ThisWorkbook.Worksheets("Sheet2").ListObjects("Table2"). _
        ListColumns("Column" & x).DataBodyRange.Cells(1, 1). _
        Resize(pf.Rows.Count - 1, pf.Columns.Count).Value = _
        pf.Offset(2, 0).Resize(pf.Rows.Count - 1, 1).Value

End Sub

enter image description here

Итак, ваш код будет выглядеть примерно так (Пожалуйста, отметьте)

'2ND PART WORKS
    x = wsPivot.PivotTables("PvtSDCdata").TableRange1.Rows(2).Find("4").Column _
        - wsPivot.PivotTables("PvtSDCdata").TableRange1.Column + 1
    Set rng = wsPivot.PivotTables("PvtSDCdata").TableRange1.Columns(x)
    With rng
        wb.Worksheets("Number of Stores Ranged").ListObjects("Table_Number_of_Stores_Ranged"). _
        ListColumns("Number of Stores Ranged").DataBodyRange.Cells(1, 1). _
        Resize(rng.Rows.Count - 1, rng.Columns.Count).Value = _
        rng.Offset(2, 0).Resize(rng.Rows.Count - 1, 1).Value
    End With

'3RD PART NOT WORKING
    x = wsPivot.PivotTables("PvtSDCdata").TableRange1.Rows(2).Find("Grand Total").Column _
        - wsPivot.PivotTables("PvtSDCdata").TableRange1.Column + 1
    Set rng = wsPivot.PivotTables("PvtSDCdata").TableRange1.Columns(x)

    With rng
        wb.Worksheets("Number of Stores Ranged").ListObjects("Table_Number_of_Stores_Ranged"). _
        ListColumns("Total Number of Stores : In Province").DataBodyRange.Cells(1, 1). _
        Resize(rng.Rows.Count - 1, rng.Columns.Count).Value = _
        rng.Offset(2, 0).Resize(rng.Rows.Count - 1, 1).Value
    End With
...