0

次のようなスプレッドシートがあります。

A     1/1/2013     100
A     2/1/2013     200
A     3/1/2013     300
B     1/1/2013     150
B     2/1/2013     175
B     3/1/2013     200

3 つの列は固定ですが、各シリーズ (最初の列) のエントリ数は異なります。

VBA を使用して、2 番目の列を X 値に、3 番目の列を Y 値に使用して、最初の列の各一意の値を散布図の系列として自動的に追加したいと思います。たとえば、上記のシリーズ A の場合、範囲 B1:B3 と C1:C3 を動的に確認する必要があります。

記録したマクロを使用して系列をチャートに追加するためのコードを生成したので、実際の障害は各系列の範囲を見つけることです。関連するシリーズの名前 (最初の列) を保持する必要があり、フィルターの使用を避けたいと考えています。

4

1 に答える 1

1

私は最終的に、それを解決するやや回りくどい方法を考えました。私の元の質問のレイアウトに合わせた、興味のある人のためのコードは次のとおりです。

Sub Example()
    ' Variable Definitions
    Dim y As Integer
    Dim Name(73) As String
    Dim Mins(73) As Integer
    Dim Maxs(73) As Integer

    ' Loop Through Name Column (Series)
    For Each x In Range("A4:A" & Cells(Rows.Count, "A").End(xlUp).Row)

        ' Add Values to Arrays, If Not Preexisting
        If IsInArray(x.Value(), Name) = False Then
            Name(y) = x.Value()
            Mins(y) = x.Row()
            Maxs(y) = x.Row()
            y = y + 1
        Else
            Maxs(y - 1) = x.Row()
        End If

    Next x

    ' Add to Chart
    ActiveSheet.ChartObjects("Chart 1").Activate
    ActiveChart.SeriesCollection.NewSeries
    ActiveChart.FullSeriesCollection(1).Name = Name(0)
    ActiveChart.FullSeriesCollection(1).XValues = "=Data!$B$" & Mins(0) & ":$B$" & Maxs(0)
    ActiveChart.FullSeriesCollection(1).Values = "=Data!$C$" & Mins(0) & ":$C$" & Maxs(0)
End Sub

' Array Function from @JimmyPena
' http://stackoverflow.com/a/11112305/2141501
Function IsInArray(stringToBeFound As String, arr As Variant) As Boolean
  IsInArray = (UBound(Filter(arr, stringToBeFound)) > -1)
End Function
于 2013-03-07T09:41:57.363 に答える