_更改用于移动数据透视表的事件过程

时间:2017-07-12 21:26:42

标签: vba excel-vba excel

_Change sheet的活动是怎么回事? 我在_Change事件过程中有下列问题,而这段代码真正适用于其他子程序。

这个宏写的是移动数据透视图。

Microsoft Excel将关闭并遇到此错误: Microsoft Excel遇到问题,需要关闭。我们对造成的不便很抱歉。并将关闭。

Private Sub Worksheet_Change(ByVal Target As Range)
Application.ScreenUpdating = False
Sheets("sheet1").PivotTables("pvtReport").TableRange2.Cut
Cells(Sheets("sheet1").ListObjects("tblReport").Range.Rows.Count + 2, 13).Select
Sheets("sheet1").Paste
ActiveSheet.PivotTables("PvtReport").PivotSelect "", xlDataAndLabel, True
Selection.End(xlDown).Select
Cells(Selection.Row + 2, Selection.Column).Select

Sheets("sheet1").ChartObjects("InsuranceChart").Cut
Sheets("sheet1").Paste
End Sub

请注意,此代码在Sheets("sheet1").ChartObjects("InsuranceChart").Cut行中遇到错误。

2 个答案:

答案 0 :(得分:3)

我建议只保留Worksheet_Change事件中的基本内容,并将其余的逻辑,对象和代码放在常规模块中的Sub中。

要移动数据透视表,您可以使用Top的{​​{1}}和Left属性。

代码中的更多解释作为评论。

Worksheet_Change 代码(内部工作表模块)

ChartObject

Sub MovePivotTable (常规模块)

Private Sub Worksheet_Change(ByVal Target As Range)

Application.ScreenUpdating = False
Application.EnableEvents = False

MovePivotTable Target.Parent ' call the reugular Sub and pass the Worksheet object

Application.ScreenUpdating = True
Application.EnableEvents = True

End Sub

答案 1 :(得分:0)

感谢朋友的指导,我专门针对从右到左的表格找到了合适的答案:

似乎TableRange1.LeftChartObject().Left计算之间存在很大差异。

实际上TableRange1.Left与工作表Direction相关,而ChartObject().Left与工作相关,并从工作表的左侧计算。

在下面的代码中解决了问题,并在之后添加了解释。

Private Sub Worksheet_Change(ByVal Target As Range)

If ActiveSheet.Name = "Sheet1" Then
    Application.ScreenUpdating = False
    Application.EnableEvents = False

    Dim ChartLeft, SheetWidth As Double

    SheetWidth = Worksheets("sheet1").Cells.Width

    ChartLeft = SheetWidth - _
    (Sheets("Sheet1").ChartObjects("InsuranceChart").Width + _
    Sheets("Sheet1").PivotTables("pvtReport").TableRange1.Left)

    Sheets("Sheet1").ChartObjects("InsuranceChart").Top = _
    Sheets("Sheet1").PivotTables("pvtReport").TableRange1.End(xlDown).Offset(2).Top
    Sheets("Sheet1").ChartObjects("InsuranceChart").Left = ChartLeft

    Application.ScreenUpdating = True
    Application.EnableEvents = True
End If

End Sub

说明:

我们使用工作表的宽度来计算工作表左下角的数据透视图左侧之间的距离,从右到左的工作表;从数据透视表右角到工作表右侧的距离。

请注意,TableRange1.Left是数据透视表右角与WorkSheet右侧的距离(从右到左工作表方向),ChartObject().Left是数据透视图左下角与工作表左侧的距离(在WorkSheets方向)。

由于数据透视图位置和数据透视表之间的关系,我们希望数据透视图位置对各自的数据透视表起作用,因此从右侧计算数据透视表的左侧,以及其Width和WorkSheets宽度,然后分配这个数据透视图的ChartObject().Left属性为数据透视图左下角的值。