在我的test_workbook上你的宏工作正常。 宏在「A12」中定位圖表的左上角單元格和數據透視表取值範圍「A3:B10」,所以一切正常。
回答第二個問題。 首先,當您更改數據透視表中的值/字段時,您必須使用工作表事件(將更新代碼直接放入sheet1)以更新圖表的位置。 例如:
Private Sub Worksheet_PivotTableUpdate(ByVal Target As PivotTable) update_position... End sub
其次,在VBA中必須使用上和左屬性來定位對象。但是,您可以使用對象寬度和高度屬性來更正圖表的位置。 正如我之前所說的你的宏工作正常,可能是名稱錯誤(正如你所說的樞軸表位置不是常量也可能是名稱),它對應於表中的其他對象,所以它工作,但不正確。 假設表(左上)位置由您的宏給出的,你只需要添加到您的代碼,這樣的事情:
Private Sub Worksheet_PivotTableUpdate(ByVal Target As PivotTable)
Sheets("sheet1").ChartObjects("InsuranceChart").Top = Sheets("sheet1").PivotTables("pvtReport").TableRange1.End(xlDown).Offset(2).Top
Sheets("sheet1").ChartObjects("InsuranceChart").Left = Sheets("sheet1").PivotTables("pvtReport").TableRange1.Left
Sheets("sheet1").ChartObjects("InsuranceChart").Width = Sheets("sheet1").PivotTables("pvtReport").TableRange1.Left + Sheets("sheet1").PivotTables("pvtReport").TableRange1.Width
End Sub
,如果你不想改變圖表的寬度可能是一個問題,因爲當您的表格將在A列中時,圖表可能會不在屏幕上。 反正快速的解決方案是在這裏:
Private Sub Worksheet_PivotTableUpdate(ByVal Target As PivotTable)
If Sheets("sheet1").PivotTables("pvtReport").TableRange1.Left = 0 And Sheets("sheet1").ChartObjects("InsuranceChart").Left = 0 Then GoTo Ender
Sheets("sheet1").ChartObjects("InsuranceChart").Left = Sheets("sheet1").PivotTables("pvtReport").TableRange1.Left + Sheets("sheet1").PivotTables("pvtReport").TableRange1.Width - Sheets("sheet1").ChartObjects("InsuranceChart").Width
Sheets("sheet1").ChartObjects("InsuranceChart").Top = Sheets("sheet1").PivotTables("pvtReport").TableRange1.End(xlDown).Offset(2).Top
Ender:
End Sub
它檢查哪裏是表的右邊緣和減去圖表的寬度。 如果圖表和表格處於打開狀態,我添加了失效保護功能列宏終止以避免減去左側圖表位置。
請注意我的Sheets方向是從右到左。當紙張方向是從左到右時,這確實有效。你的答案是錯誤的! – mgae2m
你知道整張紙的寬度是多少? – mgae2m