2013-08-27 6 views
1

VBA новичок здесь. Я искал ответы, но я не мог найти ничего полезного. У меня есть диаграмма на вкладке Excel. Я хочу, чтобы ось Y диаграммы динамически обновлялась на основе параметров, которые я проходил, поэтому я написал простой макрос для этого в модуле VBA (у меня есть серия с нулями после определенной даты на графике, поэтому я могу " t просто дайте Excel выбрать автоматическую ось). Макрос отлично работает, когда я вызываю его вручную (например, с помощью кнопки), но я хочу, чтобы он вызывался каждый раз, когда пользователь выбирает вкладки «Стратегия заполнения» или «Отчет». Я использую код Worksheet_Activate (см. Ниже), но я застрял в бесконечном цикле из-за «Таблиц» («Стратегия заполнения»). Выберите «и» Таблицы («Отчет»). Выберите «зелья» в UpdateChartAxes «макрос (который по существу вызывает мой код Worksheet_Activate снова и снова). Как исправить эту проблему? Есть ли способ перепроектировать код «UpdateChartAxes», чтобы он не нуждался в операторах выбора? Любая помощь будет оценена по достоинству.Worksheet Activate Infinite Loop

код в "Fill стратегии" и "Отчет" закладках модули:

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

Вы не должны использовать '* .Select .. Активный ..' в макросах. Особенно не те, которые взаимодействуют с событиями «Активировать». – RBarryYoung

ответ

0

Вы можете избежать написания макроса, чтобы сделать это - просто основывайте свою диаграмму на динамических именованных диапазонах. Смотрите эту ссылку для получения дополнительной информации: http://www.ozgrid.com/Excel/DynamicRanges.htm

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