在Excel VBA中绘制图形时自动识别数据范围
我有一个生成两列数据的VBA代码。重复此分析以在相同列中生成更多数据,但条件不同,并将此数据放在第一次迭代的输出下面。如何让代码在生成的每个数据块旁边生成一个XY散点和平滑线?我的尝试如下,但我遇到了三个问题:1)在调试停止宏之前,它只生成一个图形;2)它生成一个条形图而不是散点图;3)如何将生成的每个图形按比例放置在它从中绘制的数据旁边,以便获得一列图形在Excel VBA中绘制图形时自动识别数据范围,excel,graph,vba,Excel,Graph,Vba,我有一个生成两列数据的VBA代码。重复此分析以在相同列中生成更多数据,但条件不同,并将此数据放在第一次迭代的输出下面。如何让代码在生成的每个数据块旁边生成一个XY散点和平滑线?我的尝试如下,但我遇到了三个问题:1)在调试停止宏之前,它只生成一个图形;2)它生成一个条形图而不是散点图;3)如何将生成的每个图形按比例放置在它从中绘制的数据旁边,以便获得一列图形 Sub TestExample() Dim NoIteration As Integer Dim Iteration
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
ChartObject
放在某张纸上,您可以用一种稍微不同的方式。此外,默认情况下,新图表为条形图样式。为了避免将其更改为散线(我想这会导致一些异常),请尝试使用以下代码(而不是在某些方面):
Dim c As Chart
==>变为Dim c As Shape
Set c=Activeworkbook.Charts.Add
直到以
结尾替换为以下代码:
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
'setting position
With c
.Left = Range("M10").Offset(0,1).Left
.Top = Range("M10").Offset(0,1).Top
End With
但是不要将数据范围的引用放在
范围(“M10”)
中。此代码在列中查找代码,并在指定范围内绘制图形。当第一个代码通过循环时,它会偏移查找和打印
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
这正是我所需要的,但我遇到的基本问题是查找数据以绘制图表。当原始代码打印按空间分隔的数据块时,它将得到一个代码,当第一个代码通过循环时,该代码将查找每个块并在其旁边绘制一个图形。我确实有一个问题,如果我在上面的代码中插入下面的代码,它就可以正常工作。然而,如果我“呼叫”它,它不会。不知道为什么。因为下面的代码只是一个更大的代码(它绘制了几个图表)的一部分,调用它会很有用。是的,谢谢-我已经在下面列出了解决方案,请参阅srs.Xvalues/srs.Values部分。然而,尚不清楚为什么它在通话中不起作用。