3

さて、私の目標は、約 90 の異なる駅名があるため、チャート作成マクロを作成することです。各ステーションには独自のチャートが必要です。

使用したい複数のシリーズは、推定 CFS、シミュレートされた CFS、ストレス期間番号 (番号)、およびステーション名です。No. 値が x 範囲になり、est:CFS と sim:CFS の両方が y 範囲になり、2 つのかなり単純な線を作成する単純な xy 散布線グラフを作成しようとしています。

今、私の問題は単純です:Niobrara River Stationチャートのチャートでシリーズのデータ​​の受信を停止し、Snake Riverステーションチャートの次のデータの使用を開始することを認識できるように、VBAでコードを設計するにはどうすればよいですか? 90 ほどのチャートすべてをループするまで、これを繰り返します。

ループしてステーション名列を読み取り、そのステーションに対応するすべての行がそれに属していることを理解し、それが1つに必要なすべてのデータであることを理解するコマンドをどのように表現するかについて、私は困惑しています駅が変わったら次へ移ってほしい。

次の図は、ワークシート上のデータがどのように配置されているかを示しています。

ワークシート

質問をより明確にするために提供できる情報が他にあるかどうかを理解するのが少し難しい場合は、お詫び申し上げます。さらに投稿させていただきます。

4

1 に答える 1

3

Stations()以下のコードを使用すると、ワークシートからすべての一意のステーション名を取得して、文字列配列に入れることができます。

Dim TopRowOfData As Integer
Dim StationNameColumn As Integer    
Dim Stations() As String

Sub GetUniqueChartNames()

    Dim rngTmp As Range
    Dim outRange As Range

    'Select the first data cell of the Station name column.
    Cells(TopRowOfData, StationNameColumn).Select
    'Select the rest of the data in the column.
    Range(Selection, Selection.End(xlDown)).Select
    'Assign this data to a range variable.
    Set rngTmp = Selection
    'Find a row that occurs below the area of the range data.  This will be used
    'to paste the filtered values into temporarily.
    outRow = rngTmp.Row + rngTmp.Rows.Count + 10 '10 is arbitrary, could be any number.
    Set outRange = Cells(outRow, 1)
    'Filter the data values by unique values and paste the results into the outRange area.
    rngTmp.AdvancedFilter Action:=xlFilterCopy, CopyToRange:=outRange, Unique:=True
    'Get the output results of the filter operation and store them in a range object.
    'outRow contains the heading of the filtered column.  outRow + 1 is where the data starts.
    Cells(outRow + 1, 1).Select
    Range(Selection, Selection.End(xlDown)).Select
    Dim rngFinal As Range
    Set rngFinal = Selection
    'Add the output results into the Stations array.
    ReDim Stations(rngFinal.Rows.Count - 1)
    Dim i As Integer
    For i = 0 To rngFinal.Rows.Count - 1
        Stations(i) = Cells(rngFinal.Row + i, rngFinal.Column).Value
    Next

    'Delete the temporary range.
    rngFinal.Clear

End Sub

変数はまさにそれTopRowOfDataであり、データが始まる一番上の行が何であるかをコードに伝える整数です。 StationNameColumnステーション名(A = 1、B = 2など)を含む列の番号です。

ステーション名の配列を取得したら、ステーション名の列をステップダウンして、配列内の各アイテムに関連付けられているすべてのデータ値を取得できます。次に、そのデータに基づいて個々のグラフを作成します。

または、ステーション名列の値をステップ実行して、現在のステーション名に関連付けられている最初と最後の行のアドレスを取得し、そのデータに基づいてグラフを作成することもできます。以下のコードは、すべての同一のステーション名がグループ化されるようにデータがステーション名で並べ替えられていると仮定して、これを実行します。

Sub FindRowsAssociatedWithStationName()

    Dim i As Integer
    Dim j As Integer
    Dim rng As Range
    'Temp variables to store the first and last row numbers.
    Dim first As Integer
    Dim last As Integer

    'Loop through all of the station names.
    For i = 0 To UBound(Stations)
        'Select the first data cell of the station names column.
        Cells(TopRowOfData, StationNameColumn).Select
        'Select the rest of the data in the column.
        Range(Selection, Selection.End(xlDown)).Select
        'Assign this data to a range variable.
        Set rng = Selection

        'Initialize both of the row number variables to 0.
        first = 0
        last = 0

        'Loop through all the data rows.
        For j = 0 To rng.Rows.Count - 1
            If Cells(rng.Row + j, StationNameColumn).Value = Stations(i) Then
                'Set the first variable.
                If first = 0 Then
                    first = rng.Row + j
                End If
                'Set the last variable.
                last = rng.Row + j
             End If
        Next

        'Call a method to create the actual charts, passing in the first and last row associated with the current Station name.
        Call CreateChart(first, last)

    Next
End Sub

実際のグラフを作成するコードは、最初と最後(行)の値を使用して、それらの行に適切なデータを取得できます。

于 2012-09-04T21:33:08.327 に答える