Законный: да, как объяснил Brian, компилятор знает, что имя для ожидания в списке инициализатора еще должно быть участником (или базовый класс), ничто.
Хороший стиль: скорее всего, не - для большого количества программистов (включая Вас, это кажется) результат не очевиден. Используя другое имя для параметра сохранит код законным и сделает его хорошим стилем одновременно.
я предпочел бы писать часть из:
class C {
T a_;
public:
C(T a): a_(a) {}
};
class C {
T a;
public:
C(T value): a(value) {}
};
К сожалению, похоже, что нет способа напрямую управлять 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
Перейдите в окно 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, но вы сказали, что у вас уже есть этот набор.