Воссоздайте исходные данные от кэша PivotTable

Законный: да, как объяснил Brian, компилятор знает, что имя для ожидания в списке инициализатора еще должно быть участником (или базовый класс), ничто.

Хороший стиль: скорее всего, не - для большого количества программистов (включая Вас, это кажется) результат не очевиден. Используя другое имя для параметра сохранит код законным и сделает его хорошим стилем одновременно.

я предпочел бы писать часть из:

class C {
  T a_;
public:
  C(T a): a_(a) {}
};


class C {
 T a;
 public:
 C(T value): a(value) {}
};
10
задан pnuts 15 September 2015 в 15:38
поделиться

2 ответа

К сожалению, похоже, что нет способа напрямую управлять PivotCache в Excel.

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

Я все еще хотел бы найти способ работы напрямую с PivotCache, но это выполняет свою работу.

Public Sub ExtractPivotTableData()

    Dim objActiveBook As Workbook
    Dim objSheet As Worksheet
    Dim objPivotTable As PivotTable
    Dim objTempSheet As Worksheet
    Dim objTempPivot As PivotTable

    If TypeName(Application.Selection) <> "Range" Then
        Beep
        Exit Sub
    ElseIf WorksheetFunction.CountA(Cells) = 0 Then
        Beep
        Exit Sub
    Else
        Set objActiveBook = ActiveWorkbook
    End If

    With Application
        .ScreenUpdating = False
        .DisplayAlerts = False
    End With

    For Each objSheet In objActiveBook.Sheets
        For Each objPivotTable In objSheet.PivotTables
            With objActiveBook.Sheets.Add(, objSheet)
                With objPivotTable.PivotCache.CreatePivotTable(.Range("A1"))
                    .AddDataField .PivotFields(1)
                End With
                .Range("B2").ShowDetail = True
                objActiveBook.Sheets(.Index - 1).Name = "SOURCE DATA FOR SHEET " & objSheet.Index
                objActiveBook.Sheets(.Index - 1).Tab.Color = 255
                .Delete
            End With
        Next
    Next

    With Application
        .ScreenUpdating = True
        .DisplayAlerts = True
    End With

End Sub
12
ответ дан 3 December 2019 в 22:01
поделиться

Перейдите в окно Immediate Window и введите

? Thisworkbook.PivotCaches (1) .QueryType

Если вы получите что-то другое, кроме 7 (xlADORecordset), то свойство Recordset не применяется к этому типу PivotCache и вернет эту ошибку.

Если вы получите ошибку в этой строке, значит, ваш PivotCache вообще не основан на внешних данных.

Если ваши исходные данные взяты из ThisWorkbook (т.е. данные Excel) , то вы можете использовать

? thisworkbook.PivotCaches (1) .SourceData

Для создания объекта диапазона и его циклического просмотра.

Если ваш QueryType равен 1 (xlODBCQuery), то SourceData будет содержать строку подключения и commandtext для создания и набора записей ADO, например:

Sub DumpODBCPivotCache()

    Dim pc As PivotCache
    Dim cn As ADODB.Connection
    Dim rs As ADODB.Recordset

    Set pc = ThisWorkbook.PivotCaches(1)
    Set cn = New ADODB.Connection
    cn.Open pc.SourceData(1)
    Set rs = cn.Execute(pc.SourceData(2))

    Sheet2.Range("a1").CopyFromRecordset rs

    rs.Close
    cn.Close

    Set rs = Nothing
    Set cn = Nothing

End Sub

Вам нужна ссылка ADO, но вы сказали, что у вас уже есть этот набор.

4
ответ дан 3 December 2019 в 22:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: