ChartObjects和TableRange中不同的beetwin Left属性是什么?

时间:2017-07-15 09:16:01

标签: vba excel-vba excel

我使用下面的代码设置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的右侧等于数据透视表的右侧? 我的数据透视表位置不是一成不变的,并且宏观会改变企业情况。

有谁知道这是整张纸宽度?

3 个答案:

答案 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

enter image description here

答案 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.LeftChartObject().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属性将此值指定到数据透视图的左下角。