【问题标题】:VBA Creat chart based on pass/fail criteriaVBA 根据通过/失败标准创建图表
【发布时间】:2014-07-24 20:59:41
【问题描述】:

我有创建散点图的代码(时间与一列数据)。第三列说明数据是“通过”还是“失败”(数据来自一组经过测试的样本)。

我想知道,是否有一种算法可以对第三列进行排序,并根据它是“通过”还是“失败”,将对应的时间和在同一行中偏移的数据单元格添加到一系列的?会有两个系列:一个代表通过,一个代表失败。 x 值是时间,y 值是数据。

我已经编写的代码如下,用于创建带有系列的图表以及它如何找到数据范围(动态变化):

Sub AddCharts()

Dim TSht As Worksheet
Dim Cht as Chart

With TSht

'Find last row in data
LRow = .Cells(.Rows.Count, 1).End(xlUp).Row

'Create Chart
Set Cht = .Shapes.AddChart.Chart
    With Cht
    .ChartType = xlXYScatter
    .SeriesCollection.NewSeries
        With .SeriesCollection(1)
        .XValues = TSht.Range(Cells(2, 6), Cells(LRow, 6))
        .Values = TSht.Range(Cells(2, 7), Cells(LRow, 7))
        End With
    End With
End With

End Sub

【问题讨论】:

  • 如果您提出一个与您一个小时前才提出的问题基本相同的新问题,也许您应该考虑删除第一个问题,或者至少放一个指向最新问题的指针...

标签: vba excel


【解决方案1】:

测试:

Sub AddCharts()

Dim TSht As Worksheet
Dim Cht As Chart, LRow As Long
Dim xP As Range, yP As Range, xF As Range, yF As Range
Dim rng As Range, c As Range

    Set TSht = ActiveSheet

    With TSht

    'Find last row in data
    LRow = .Cells(.Rows.Count, 1).End(xlUp).Row

    'e.g. Pass/Fail is in Col 5
    Set rng = .Range(.Cells(2, 5), .Cells(LRow, 5))
    For Each c In rng.Cells
        If c.Value = "Pass" Then
            AddTo xP, c.Offset(0, 1)
            AddTo yP, c.Offset(0, 2)
        End If
        If c.Value = "Fail" Then
            AddTo xF, c.Offset(0, 1)
            AddTo yF, c.Offset(0, 2)
        End If
    Next c

    'Create Chart
    Set Cht = .Shapes.AddChart.Chart
        With Cht
            .ChartType = xlXYScatter

            With .SeriesCollection.NewSeries
                .Name = "Pass"
                .XValues = xP
                .Values = yP
            End With

            With .SeriesCollection.NewSeries
                .Name = "Fail"
                .XValues = xF
                .Values = yF
            End With

        End With
    End With

End Sub

'utility sub for building up X and Y ranges
Sub AddTo(rng As Range, rngAdd As Range)
    If rng Is Nothing Then
        Set rng = rngAdd
    Else
        Set rng = Application.Union(rng, rngAdd)
    End If
End Sub

【讨论】:

  • 这正是我想要的,谢谢蒂姆。另外,我知道我发布了同样的问题,我应该只是编辑它或删除它,我对 stackoverflow 还很陌生,所以感谢您的提醒。只是觉得这种格式更容易理解我想要做什么
  • 没问题 - 通常最好编辑您的原始问题:这样就没有人会花时间尝试帮助解决在其他地方已经有答案的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-22
  • 1970-01-01
  • 2021-09-22
  • 2018-09-27
相关资源
最近更新 更多