2013-08-27 53 views
1

VBA新手在这里。我搜查了答复,但我找不到任何有用的东西。我在Excel选项卡中有一个图表。我希望图表的Y轴根据传入的参数进行动态更新,所以我在VBA模块中编写了一个简单的宏来实现这一点(我在图表中的某个日期后有一系列的零点,所以我可以'让Excel选择一个自动轴)。当我手动调用它(例如通过按钮)时,宏可以正常工作,但是我希望每次用户选择“填充策略”或“报告”选项卡时都会调用该宏。我使用了Worksheet_Activate代码(见下面),但由于“Sheets(”Fill Strategy“),我陷入了无限循环。选择”和“Sheets(”Report“)。选择”UpdateChartAxes “宏(实质上一​​次又一次地调用我的Worksheet_Activate代码)。我如何解决这个问题?有没有办法重新设计“UpdateChartAxes”代码,以便它不需要选择语句?任何帮助,将不胜感激。工作表激活无限循环

代码中的 “填充策略” 和 “报告” 选项卡模块:

Private Sub Worksheet_Activate() 
Call UpdateChartAxes 
End Sub 

代码开放模块:

Public Sub UpdateChartAxes() 
Application.ScreenUpdating = False 
Call ShowSheets 

'WorkforceReportChart 
    Dim WorkforceReportChartMin As Long 
    Dim WorkforceReportChartMax As Long 
    Sheets("Chart Data").Select 
    WorkforceReportChartMin = WorksheetFunction.min(Range("ReportGraphDataRangeExcludingHistoricSeries")) * 0.95 
    WorkforceReportChartMax = WorksheetFunction.Max(Range("ReportGraphDataRangeExcludingHistoricSeries")) * 1.05 
    Sheets("Report").Select 
    With ActiveSheet.ChartObjects("WorkforceReportChart").Chart 
     With .Axes(xlValue) 
      .MinimumScale = WorkforceReportChartMin 
      .MaximumScale = WorkforceReportChartMax 
     End With 
    End With 

'FillStrategyChart 
    Dim FillStrategyChartMin As Long 
    Dim FillStrategyChartMax As Long 
    Sheets("Chart Data").Select 
    FillStrategyChartMin = WorksheetFunction.min(Range("FillStrategyGraphDataRangeExcludingHistoricSeries")) * 0.95 
    FillStrategyChartMax = WorksheetFunction.Max(Range("FillStrategyGraphDataRangeExcludingHistoricSeries")) * 1.05 
    Sheets("Fill Strategy").Select 
    With ActiveSheet.ChartObjects("FillStrategyChart").Chart 
     With .Axes(xlValue) 
      .MinimumScale = FillStrategyChartMin 
      .MaximumScale = FillStrategyChartMax 
     End With 
    End With 

Call HideSheets 
End Sub 
+1

你不应该使用'*。选择..主动 ..'在宏。尤其不是那些与Activate事件交互的人。 – RBarryYoung

回答

0

试试这样说:

Public Sub UpdateChartAxes() 
Application.ScreenUpdating = False 
Call ShowSheets 
Dim curWs as Worksheet 

'WorkforceReportChart 
    Dim WorkforceReportChartMin As Long 
    Dim WorkforceReportChartMax As Long 
    'Sheets("Chart Data").Select 
    Set curWs = Sheets("Chart Data") 
    WorkforceReportChartMin = WorksheetFunction.min(Range(curWs.Name & "!ReportGraphDataRangeExcludingHistoricSeries")) * 0.95 
    WorkforceReportChartMax = WorksheetFunction.Max(Range(curWs.Name & "!ReportGraphDataRangeExcludingHistoricSeries")) * 1.05 
    'Sheets("Report").Select 
    Set curWs = Sheets("Report") 
    With curWs.ChartObjects("WorkforceReportChart").Chart 
     With .Axes(xlValue) 
      .MinimumScale = WorkforceReportChartMin 
      .MaximumScale = WorkforceReportChartMax 
     End With 
    End With 

'FillStrategyChart 
    Dim FillStrategyChartMin As Long 
    Dim FillStrategyChartMax As Long 
    'Sheets("Chart Data").Select 
    Set curWs = Sheets("Chart Data") 
    FillStrategyChartMin = WorksheetFunction.min(Range(curWs.Name & "!FillStrategyGraphDataRangeExcludingHistoricSeries")) * 0.95 
    FillStrategyChartMax = WorksheetFunction.Max(Range(curWs.Name & "!FillStrategyGraphDataRangeExcludingHistoricSeries")) * 1.05 
    'Sheets("Fill Strategy").Select 
    Set Sheets("Fill Strategy") 
    With curWs.ChartObjects("FillStrategyChart").Chart 
     With .Axes(xlValue) 
      .MinimumScale = FillStrategyChartMin 
      .MaximumScale = FillStrategyChartMax 
     End With 
    End With 

Call HideSheets 
End Sub