2017-07-15 47 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

相關問題