2017-07-15 46 views
-1

我用下面的代码来设置TableChart的位置和它的相关数据透视表的位置。我的纸张方向是从右到左。beetwin在ChartObjects和TableRange中的左边属性有什么不同?

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!运行第二行后,数据透视图被隐藏了。

我如何做数据透视图的右侧比数据透视表的右侧平等的吗? 我的数据透视表位置不是恒定的,并且在宏观上企业情况发生变化。

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

回答

0

似乎TableRange1.LeftChartObject().Left计算之间有很大的不同。

其实TableRange1.Left有关表单方向,和ChartObject().Left是不相关的,并从表的左侧计算。

TableRange1.Left是数据透视表右侧距WorkSheet右侧(从右到左工作表方向)和ChartObject()之间的距离。Left是数据透视图左侧距工作表左侧的距离(在两个WorkSheet方向)。

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) 

我们可以从它的右侧计算数据透视表的左侧;以及其宽度和工作表宽度,然后将此值分配给数据透视图的左侧角落ChartObject().Left属性。

0

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

它检查哪里是表的右边缘和减去图表的宽度。 如果图表和表格处于打开状态,我添加了失效保护功能列宏终止以避免减去左侧图表位置。

+0

请注意我的Sheets方向是从右到左。当纸张方向是从左到右时,这确实有效。你的答案是错误的! – mgae2m

+0

你知道整张纸的宽度是多少? – mgae2m

0

如果我正确地理解了您的问题,则该位置是相对于从右到左的工作簿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

+0

似乎你的答案不适合我的问题。 'Set mychart = mychart.Location(其中:= xlLocationAsObject,Name:= destenationsheet)'有错误:'对象'_Chart'的方法'位置'失败,所以你的回答,不是我的问题,我有一个数据透视表,有一些事件发生时,宏有变化我需要设置数据透视图的右侧等于数据透视表的右侧,并且数据透视表的位置不是常量,使用静态范围我需要一种方法来达到我的数据透视图的右侧属性值。如何知道整个表格宽度? – mgae2m

+0

我已经更新了我的答案超过39分钟前... – jonathana

+0

以上'范围'和数据透视表的范围是什么关系?我想使用它的数据透视表坐标设置数据透视图位置。你能呈现'范围'的数据透视表? – mgae2m

相关问题