我使用下面的代码设置TableChart与其相关的数据透视表位置的位置。我的床单方向是从右到左。
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
问题出在第二行,返回两个Left属性的值。 (我用Msgbox
检查了这两个)左边一个用于ChartObjects,返回884565.76,右边一个用于TableRange1返回843.75!并且在运行第二行之后隐藏了数据透视图。
如何让PivotChart的右侧等于数据透视表的右侧? 我的数据透视表位置不是一成不变的,并且宏观会改变企业情况。
有谁知道这是整张纸宽度?
答案 0 :(得分:1)
如果我正确理解了您的问题,则该位置是相对的,从右到左的工作簿Range("xer11:xee29")
将位于Range("z11:m29")
的右到左工作簿上。
测试它,它的工作原理。
Private Sub CommandButton1_Click()
Dim rngchart As Range
Set rngchart = Range("xer11:xee29")
Dim chrt As ChartObject
Set chrt = Sheets("sheet1").ChartObjects("InsuranceChart")
chrt.Top = rngchart.Top
chrt.Left = rngchart.Left
chrt.Width = rngchart.Width
chrt.Height = rngchart.Height
End Sub
答案 1 :(得分:0)
在我的test_workbook上你的宏工作正常。 宏位于图表的左上角" A12"单元格和数据透视表采用范围" A3:B10",所以一切正常。 的
回答第二个问题。 首先,当您更改数据透视表中的值/字段时,您必须使用工作表事件(将更新代码直接放到sheet1)来更新图表的位置。 例如:
Private Sub Worksheet_PivotTableUpdate(ByVal Target As PivotTable)
update_position...
End sub
其次,在vba中必须使用top和left属性来定位对象。但是,您可以使用对象宽度和高度属性来更正图表的位置。 正如我之前所说,你的宏工作得很好,可能是某些东西出了问题(如你所说的枢轴表位置不是常数也可能是名字。)对象并且它对应于表中的其他对象,所以它可以工作,但不正确。 假设您的宏给出了表(左侧和顶部)位置,您只需要向您的代码添加类似的内容:
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
它检查表的右边缘并减去图表的宽度。 如果图表和表格已打开,我也添加了故障安全功能A列宏终止以避免减去左图表位置。
答案 2 :(得分:0)
似乎TableRange1.Left
和ChartObject().Left
计算之间存在很大差异。
实际上TableRange1.Left
与工作表的方向相关,ChartObject().Left
不相关,并从工作表的左侧计算。
TableRange1.Left
是数据透视表右下角与工作表右侧(从右到左工作表方向)和ChartObject()的距离。左边是数据透视图左下角与工作表左侧的距离(在两个WorkSheets方向)。
Sheets("Sheet1").ChartObjects("InsuranceChart").Top = _
Sheets("Sheet1").PivotTables("pvtReport").TableRange1.End(xlDown).Offset(2).Top
Sheets("Sheet1").ChartObjects("InsuranceChart").Left = _
Worksheets("Sheet1").Cells.Width - _
(Sheets("Sheet1").ChartObjects("InsuranceChart").Width + _
Sheets("Sheet1").PivotTables("pvtReport").TableRange1.Left)
我们可以从右侧计算数据透视表的左侧;及其Width和WorkSheets宽度,然后通过PivotChart的ChartObject().Left
属性将此值指定到数据透视图的左下角。