更改图表位置的代码需要激活我的目标工作表?

时间:2018-03-26 14:17:07

标签: excel vba excel-vba

我使用此代码动态更改图表的大小及其在工作表上的位置。当我每天添加一行新数据时,我会在页面上向下移动一堆图表以与新的最后一行对齐。我不明白的是为什么我需要激活它上面的图表才能使其正常工作。

在有人要求之前,我的lastrow值正在被明确检索,因此我没有从ActiveSheet解释我的任何值。但是,我仍然有这个问题......这是我的子程序,需要一些参数来调整特定的图表:

Private Sub FitChart(mainsheet As Worksheet, mainchart As String, firstcol As String, secondcol As String, topoffset As Integer, bottomoffset As Integer, lastrow As Long)
'This sub is used to line up the charts with the lastrow of data on each sheet

mainsheet.ChartObjects(mainchart).Chart.Parent.Height = mainsheet.Range(firstcol & lastrow + topoffset & ":" & secondcol & lastrow + bottomoffset).Height
mainsheet.ChartObjects(mainchart).Chart.Parent.Width = mainsheet.Range(firstcol & lastrow + topoffset & ":" & secondcol & lastrow + bottomoffset).Width
mainsheet.ChartObjects(mainchart).Chart.Parent.Top = mainsheet.Range(firstcol & lastrow + topoffset & ":" & secondcol & lastrow + bottomoffset).Top
mainsheet.ChartObjects(mainchart).Chart.Parent.Left = mainsheet.Range(firstcol & lastrow + topoffset & ":" & secondcol & lastrow + bottomoffset).Left

End Sub

以下是我如何称呼它的一个例子:

'Worksheets("main chart").Activate

'Change chart position
Call FitChart(Worksheets("main chart"), "Chart 92", "W", "AH", -30, -1, lastrow)

Activate行注释掉后,图表排列不均匀 - 请注意红线是我想要与lastrow数据排成一行的方式:

Image1

但是,当我取消评论Activate行:

Image2

完美排队 - 什么给了???这是非常小的,但它的功能让我疯了。我还有50张正在使用此代码的工作表,如果我按顺序运行则会进行大量不必要的激活......

2 个答案:

答案 0 :(得分:1)

如问题评论中所述,当工作表 A)非活动且 B)未设置为100%缩放时,这是一个错误。

活动的工作表的缩放是无关紧要的 - 100%,200%,50%,与图表上的工作表相同:无关紧要。

以下代码将SheetName作为字符串,让您在不更改ActiveSheet的情况下更改Zoom。然而,选择和取消选择工作表。

Sub ChangeZoom(ResetSheet As String, Optional NewZoom As Double = 100)
    Dim CurrentZoom As Variant, CurrentSheet As String
    CurrentZoom = ActiveWindow.Zoom 'Store current Zoom
    CurrentSheet = ActiveSheet.Name 'Store current Sheet
    ThisWorkbook.Sheets(Array(CurrentSheet, ResetSheet)).Select 'Select current sheet and Sheet to Zoom
    ActiveWindow.Zoom = NewZoom 'Change Zoom
    ThisWorkbook.Sheets(CurrentSheet).Select 'Select just the current sheet
    ActiveWindow.Zoom = CurrentZoom 'Restore the original Zoom
End Sub

答案 1 :(得分:1)

只是将这个问题标记为“已解决”,这已经被证实是一个错误 - 没有激活或选择工作表就无法完成这项工作。我坚持使用Worksheet().Activate来获得我想要的结果的解决方案。