I use this code to dynamically change the size of a chart and its position on the sheet. As I add a new line of data daily, I shift a bunch of charts down on the page to line up with the new last row. What I DON’T understand is why I need the sheet with the charts on it to be activated in order for this to work properly.
Before anyone asks, my lastrow
value is being retrieved explictly, so none of my values are being interpreted from an ActiveSheet
. However, I still have this issue… Here is my subroutine that takes some arguments to adjust a specific chart:
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
Here’s an example of how I call it:
'Worksheets("main chart").Activate
'Change chart position
Call FitChart(Worksheets("main chart"), "Chart 92", "W", "AH", -30, -1, lastrow)
With the Activate
line commented out, the charts line up unevenly – note the red line is what I want lining up with my lastrow
of data:
But when I un-comment out the Activate
line:
It lines up perfectly – What gives??? This is very minor but the functionality of it is driving me nuts. I also have 50 + sheets that are using this code, if I’m running in sequence that’s a lot of unnecessary activating…
As identified in the question Comments, this is a bug when the sheet is both A) Not Active and B) Not set to 100% Zoom.
The zoom of the sheet that is Active is irrelevant – 100%, 200%, 50%, the same as the sheet with the Chart on: none of that matters.
This following code will take a SheetName as string, and let you change the Zoom without changing ActiveSheet. It will, however, select and unselect sheets.
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
Answer:
Just to mark this question as “solved”, this has been confirmed to be a bug – There is no way to have this work without activating or selecting the worksheets. I’m sticking to the solution of using Worksheet().Activate
to get my intended result.
Tags: excelexcel