在我的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