当前位置: 首页 > 知识库问答 >
问题:

无法为VBA/Excel按行绘制折线图

齐阎宝
2023-03-14

在开始我的问题之前:我已经尝试了此社区中可用的公认解决方案(使用VBA excel(动态行、列)为每行创建折线图,并使用excel中的VBA宏为每行创建新图表)。对于这两种情况,我的图表都是用假设数据列的每一行创建的。

所以我有一个数据表,它通常具有从A1到F12的值。A列包含属性名称,如净利润、销售额、成本等,其时间进度图将被绘制。B2到F2行包含年份值。数据区域从B3到F12包含值。简而言之,每一行都是该特定属性的变化趋势。我想创建一个折线图来显示这种趋势(折线图中的每一行代表特定行中的值)。

我能够录制一个宏来做这件事

    Worksheets("CashFlow").Activate
    Range("B5:F7").Select
    ActiveSheet.Shapes.AddChart2(227, xlLineMarkers).Select
    ActiveChart.SetSourceData Source:=Range("'CashFlow'!$B$5:$F$7")
    ActiveSheet.Shapes("Chart 1").IncrementLeft -26.25
    ActiveSheet.Shapes("Chart 1").IncrementTop 133.5
    ActiveWindow.ScrollRow = 2
    ActiveWindow.SmallScroll Down:=5
    ActiveChart.Axes(xlCategory).Select
    ActiveChart.Axes(xlCategory).ReversePlotOrder = True
    Application.CommandBars("Format Object").Visible = False
    ActiveChart.SetElement (msoElementPrimaryValueAxisTitleAdjacentToAxis)
    ActiveChart.Axes(xlValue, xlPrimary).AxisTitle.Text = "Cash (In Cr)"
    Selection.Format.TextFrame2.TextRange.Characters.Text = "Cash (In Cr)"
    With Selection.Format.TextFrame2.TextRange.Characters(1, 12).ParagraphFormat
        .TextDirection = msoTextDirectionLeftToRight
        .Alignment = msoAlignCenter
    End With
    With Selection.Format.TextFrame2.TextRange.Characters(1, 4).Font
        .BaselineOffset = 0
        .Bold = msoFalse
        .NameComplexScript = "+mn-cs"
        .NameFarEast = "+mn-ea"
        .Fill.Visible = msoTrue
        .Fill.ForeColor.RGB = RGB(89, 89, 89)
        .Fill.Transparency = 0
        .Fill.Solid
        .Size = 10
        .Italic = msoFalse
        .Kerning = 12
        .Name = "+mn-lt"
        .UnderlineStyle = msoNoUnderline
        .Strike = msoNoStrike
    End With
    With Selection.Format.TextFrame2.TextRange.Characters(5, 8).Font
        .BaselineOffset = 0
        .Bold = msoFalse
        .NameComplexScript = "+mn-cs"
        .NameFarEast = "+mn-ea"
        .Fill.Visible = msoTrue
        .Fill.ForeColor.RGB = RGB(89, 89, 89)
        .Fill.Transparency = 0
        .Fill.Solid
        .Size = 10
        .Italic = msoFalse
        .Kerning = 12
        .Name = "+mn-lt"
        .UnderlineStyle = msoNoUnderline
        .Strike = msoNoStrike
    End With
    ActiveChart.ChartArea.Select
    ActiveChart.SetElement (msoElementChartTitleNone)
    Application.CutCopyMode = False
    Application.CutCopyMode = False
    ActiveChart.FullSeriesCollection(1).XValues = "='CashFlow'!$B$2:$F$2"

然而,当我通过宏调用(VBA)实际运行此程序时,它是按列绘制的。

类似地,当我使用它们的代码片段时,上面链接的两个答案也按列绘制了图表。如何编写VBA子过程,通过假设数据是按行的方式绘制折线图。

共有2个答案

狄河
2023-03-14

试试这个:

ActiveChart.SetSourceData Source:=Range("'CashFlow'!$B$5:$F$7"), PlotBy:=xlRows
李振国
2023-03-14

我还不能确定你的意图,但这里有一个例子。

Sub test()
    Dim Ws As Worksheet
    Dim rngDB As Range
    Dim rngX As Range, rngY As Range
    Dim i As Integer
    Dim l As Single, t As Single
    Dim w As Single, h As Single
    Dim objChart As ChartObject
    
    Set Ws = Sheets("CashFlow")
    
    For Each objChart In Ws.ChartObjects
        objChart.Delete
    Next objChart
    
    Set rngDB = Ws.Range("a2")
    
    l = 1 'left
    t = Ws.Range("a14").Top 'top
    w = 400 'width
    h = 200      'height
    
    For i = 1 To 10
        Set rngX = rngDB.Offset(0, 1).Resize(1, 5)
        Set rngY = rngDB.Offset(i, 1).Resize(1, 5)
        addmyCharts Ws, rngX, rngY, l, t, w, h
        t = t + h
    Next i
    
End Sub


Private Sub addmyCharts(Ws As Worksheet, rngX As Range, rngY As Range, l As Single, t As Single, w As Single, h As Single)
    Dim shp As Shape
    Dim Cht As Chart
    Dim Srs As Series
    
    Set shp = Ws.Shapes.AddChart(xlLineMarkers, l, t, w, h)
    Set Cht = shp.Chart

    With Cht
        .HasLegend = True
        For Each Srs In .SeriesCollection
            Srs.Delete
        Next Srs
        
        Set Srs = .SeriesCollection.NewSeries
        With Srs
            .XValues = rngX
            .Values = rngY
        End With
        .Axes(xlCategory, xlPrimary).HasTitle = True
        .Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "Cash (In Cr)"
        .Axes(xlValue, xlPrimary).HasTitle = True
        .Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = "Cash (In Cr)"
    End With
    
End Sub

Sub testChart()
    Dim Ws As Worksheet
    Dim rngDB As Range, Rng As Range
    Dim rngX As Range, rngY As Range
    Dim shp As Shape
    Dim Cht As Chart
    Dim Srs As Series
    Dim l As Single, t As Single
    Dim w As Single, h As Single
    Dim objChart As ChartObject
  
    Set Ws = Sheets("CashFlow")
    
    For Each objChart In Ws.ChartObjects
        objChart.Delete
    Next objChart
    
    Set rngDB = Ws.Range("a3: a12")
    
    l = 1 'left
    t = Ws.Range("a14").Top 'top
    w = 400 'width
    h = 200      'height

    Set shp = Ws.Shapes.AddChart(xlLineMarkers, l, t, w, h)
    Set Cht = shp.Chart

    With Cht
        .HasLegend = True
        For Each Srs In .SeriesCollection
            Srs.Delete
        Next Srs
        
        For Each Rng In rngDB
            Set Srs = .SeriesCollection.NewSeries
            Set rngX = Ws.Range("b2").Resize(1, 5)
            Set rngY = Rng.Offset(0, 1).Resize(1, 5)
            With Srs
                .Name = Rng
                .XValues = rngX
                .Values = rngY
            End With
        Next Rng
        .Axes(xlCategory, xlPrimary).HasTitle = True
        .Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "Cash (In Cr)"
        .Axes(xlValue, xlPrimary).HasTitle = True
        .Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = "Cash (In Cr)"
    End With
End Sub
 类似资料:
  • 主要内容:示例可以使用类的方法在图像上绘制多段线。 以下是此方法的语法。 该方法接受以下参数 - mat - 表示要在其上绘制矩形的图像的对象。 pts - 包含类型的对象的对象。 isClosed - 指定折线的布尔型类型的参数是否为关闭的。 color - 表示矩形颜色的标量对象(BGR)。 thickness - 表示矩形厚度的整数; 默认情况下,厚度值为。 类的构造函数接受类的对象。 示例 以下程序演示

  • 我想创建一个包含三条线(男性、女性、未知)的折线图。这是我的数据示例: 是否有一个选项,在图中自动创建三行或我需要循环通过数据和创建三个跟踪自己?到目前为止,这是我的代码:

  • 主要内容:示例可以使用类的方法在图像上绘制凸多段线。 以下是此方法的语法。 该方法接受以下参数 - mat - 表示要在其上绘制矩形的图像的对象。 points - 一个对象,表示要在其间绘制凸多段线的点。 color - 表示矩形颜色的标量对象(BGR)。 类的构造函数接受类的对象。 示例 以下程序演示如何在图像上绘制凸多段线并使用JavaFX窗口显示它。 在执行上述程序时,您将得到以下输出 -

  • 本文向大家介绍Android绘制动态折线图,包括了Android绘制动态折线图的使用技巧和注意事项,需要的朋友参考一下 所谓动态折线图,就是折线图能随着手指的滑动进行动态绘制,这里很定会产生动画效果。基于这个效果,这里使用SurfaceView进行制图。 实现步奏如下: (1): 这里新建一个绘图ChartView,继承SurfaceView并实现SurfaceHolder.Callback ,

  • 问题内容: 在我的程序中,我想绘制一个简单的分数线图。我有一个文本文件,并且在每一行上是一个整数分数,我已阅读该分数,并希望将其作为参数传递给图形类。我在实现graph类时遇到了一些麻烦,我所看到的所有示例都将它们的方法和它们的main放在同一个类中,而我不会。 我希望能够将数组传递给对象并生成图形,但是在调用我的绘画方法时,它要求我提供Graphics g …这是到目前为止的内容: 现在,我已经

  • 我试图画一个三次线图,如下所示: 使用MPAndroid图表库。 我能画线,但不能画X轴和线之间的填充,如图所示。 已经经历了库和许多这样的问题。