2013-04-02 5 views
0

У меня есть код VBA, который генерирует два количества данных. Этот анализ повторяется, чтобы генерировать больше данных в тех же столбцах, но для разных условий и помещает эти данные ниже результата первой итерации. Как получить код для генерации XY Scatter с плавными линиями рядом с каждым блоком данных? Моя попытка ниже, но я столкнулся с тремя проблемами: 1) Он генерирует только один график до того, как отладка остановит макрос, 2) он генерирует барьер, а не разброс 3) Как получить каждый граф, который генерируется для масштабирования рядом с данными, которые он рисует, так что я получаю столбец графов?Автоматическое распознавание диапазона данных при построении графика Excel VBA

Sub TestExample() 

    Dim NoIteration As Integer 
    Dim Iteration As Integer 
    NoIteration = Range("N26").Value 

    Dim YieldIteration As Integer 
    Dim NoOfJumps As Long 
    Dim minyield As Long 
    Dim maxyield As Long 
    Dim jump As Long 
     NoOfJumps = Range("Q24").Value 
     minyield = Range("Q25").Value 
     maxyield = Range("Q26").Value 
     jump = Range("Q27").Value 

    Dim xaxis As Range 
    Dim yaxis As Range 
     Dim c As Chart 
     Dim Sh As String 
     Sh = ActiveSheet.Name 


    Range("M29:T1000").Select 
    Selection.Clear 

    For jump = 0 To NoOfJumps 


     For Iteration = 0 To NoIteration 
        'Print Intervals 
        Range("M30").Offset(NoIteration + Iteration + 4, 0).Value = Range("V19").Value * Iteration 

        'Solve weights for minimum Spot SD for each given interval 
        SolverReset 
        SolverOk SetCell:="$T$18", MaxMinVal:=2, ValueOf:="0", ByChange:="$O$20:$R$20" 
        SolverAdd CellRef:="$T$17", Relation:=2, FormulaText:=Range("M30").Offset(NoIteration + Iteration + 4, 0).Value 
        SolverAdd CellRef:="$T$20", Relation:=2, FormulaText:=1 
        SolverAdd CellRef:="$T$7", Relation:=1, FormulaText:=minyield + jump 'State min required yield 
        SolverAdd CellRef:="$T$7", Relation:=3, FormulaText:=maxyield + jump 'State max required yield 
        SolverAdd CellRef:="$O$20:$R$20", Relation:=3, FormulaText:="0" 
        SolverSolve UserFinish:=True 
        SolverFinish KeepFinal:=1 

        'Print Income Return, SD 
        Range("N30").Offset(Iteration + jump * 50, 0).Value = Range("T7").Value 
        Range("O30").Offset(Iteration + jump * 50, 0).Value = Range("T8").Value 

        'Print Spot Return, SD 
        Range("N30").Offset(NoIteration + Iteration + 4 + jump * 50, 0).Value = Range("T17").Value 
        Range("O30").Offset(NoIteration + Iteration + 4 + jump * 50, 0).Value = Range("T18").Value 


        'Print Total Return, SD 
        Range("N30").Offset(NoIteration * 2 + Iteration + 8 + jump * 50, 0).Value = Range("AC17").Value 
        Range("O30").Offset(NoIteration * 2 + Iteration + 8 + jump * 50, 0).Value = Range("AC18").Value 


     Next Iteration 

     Set yaxis = Range(Range("N30").Offset(Iteration + jump * 50, 0), Range("N30").End(xlDown)) 
     Set xaxis = Range(Range("O30").Offset(Iteration + jump * 50, 0), Range("$O30").End(xlDown)) 


Set c = ActiveWorkbook.Charts.Add 
ActiveChart.Location Where:=xlLocationAsObject, Name:=Sh 
'Set c = c.Location(Where:=xlLocationAsObject, Name:="Sheet1") 
With c 
    .ChartType = xlXYScatterLines 
    ' set other chart properties 
End With 

Dim s As Series 
Set s = c.SeriesCollection.NewSeries 
With s 
    .Values = yaxis 
    .XValues = xaxis 

End With 


    Next jump 
End Sub 

ответ

0
  1. Там может быть много о проблемах, которые трудно анализировать, когда у нас нет данных, с которыми вы работаете. Однако см. Следующие моменты, которые могут быть полезны и решить 1-й выпуск.

  2. Если вы, наконец, разместите свою диаграмму как ChartObject на каком-то листе, вы можете сделать это несколько иначе. Более того, по умолчанию новая диаграмма - стиль бара. Для того, чтобы избежать его изменений в ScatterLines то (который я предполагаю, вызывает некоторые исключения), попробуйте использовать следующий код (вместо вашего в некоторых областях):

    Dim c As Chart ==> Изменение в Dim c as Shape

Всего раздел начиная с: Set c=Activeworkbook.Charts.Add до End With заменить следующий код:

Set c = Sheets(Sh).Shapes.AddChart(xlXYScatterLines, 10, 10, 200, 200) 

Dim s As Series 
Set s = c.Chart.SeriesCollection.NewSeries 
With s 
    .Values = yaxis 
    .XValues = xaxis 

End With 
  1. Чтобы установить позицию вашего Диаграмма попытаться использовать аналогичное решение до конца цикла:

    'setting position 
    With c 
        .Left = Range("M10").Offset(0,1).Left 
        .Top = Range("M10").Offset(0,1).Top 
    End With 
    

но вместо Range("M10") поставить ссылку на ваш диапазон данных.

+0

Это то, что мне было нужно, но существенной проблемой, с которой я столкнулся, был поиск данных для построения графика. Поскольку исходный код печатает блоки данных, разделенных пробелом, он должен был получить код, который просматривает каждый блок и намечает график рядом с ним, поскольку первый код проходит через цикл. Одна из проблем, которые возникают у меня, заключается в том, что если я вставляю код ниже в приведенный выше код, он отлично работает. Однако, если я «позвоню», это не так. Идея почему. Поскольку приведенный ниже код является лишь частью более крупного кода (который отображает несколько графиков), вызов будет полезен. – Mary

+0

Итак, значит ли это, что проблема решена ?? –

+0

Да, спасибо. Я поставил решение ниже, см. Раздел srs.Xvalues ​​/ srs.Values. Однако непонятно, почему он не работает под Call. – Mary

1

Этот код просматривает код в столбцах и отображает график в указанном диапазоне. Он смещает поиск и построение графика, когда первый код проходит через цикл.

Dim srs As Series 

Set cht = ActiveChart 
'GRAPH 1 
    Set rng1 = ActiveSheet.Range(Range("W30").Offset(jump * 50, 0), Range("AA40").Offset(jump * 50, 0)) 


With ActiveSheet.ChartObjects.Add(Left:=rng1.Left, Width:=rng1.Width, Top:=rng1.Top, Height:=rng1.Height) 
'(Left:=100, Width:=375, Top:=75, Height:=225) 
    .Chart.ChartType = xlXYScatterLines 

    Set srs = .Chart.SeriesCollection.NewSeries 
    srs.Name = "Graph1" ' 
    srs.XValues = Range(Range("O30").Offset(jump * 50, 0), Range("O30").Offset(jump * 50, 0).End(xlDown)) 
    srs.Values = Range(Range("N30").Offset(jump * 50, 0), Range("N30").Offset(jump * 50, 0).End(xlDown)) 

End With 
    End With 
Смежные вопросы