3

選択内容に基づいて縦棒グラフをプログラムで生成したいと考えています。ただし、縦軸の値を選択範囲の最小値と最大値にしたいです。これはWorksheetFunction.Max(DataRange) 横軸を調整しているように見えますが、縦軸の値がどこから来ているのかわかりません。

たとえば、これが私が選択したデータである場合、ここに画像の説明を入力 以下のマクロによって作成されたチャートは次のようになります。

ここに画像の説明を入力

ただし、縦軸を 1 ~ 5、横軸を頻度の値 (つまり、その数が発生した回数) にしたいと考えています。どうすればいいですか?

また、私は Excel を初めて使用するので、他の場所で改善が見られた場合は、ご意見をお寄せいただければ幸いです。

Sub GenerateGraph()

    Dim MyChart As Chart
    Dim DataRange As Range
    Set DataRange = Selection

    Set MyChart = Charts.Add
    MyChart.SetSourceData Source:=DataRange
    ActiveChart.ChartType = xlBarClustered

    With ActiveChart.Axes(xlValue, xlPrimary)
        .MaximumScale = WorksheetFunction.Max(DataRange)
        .MinimumScale = WorksheetFunction.Min(DataRange)
        .MajorUnit = 1

    End With
4

2 に答える 2

3

Excel に Analysis Toolpak が読み込まれている場合は、グラフを作成する前にデータをヒストグラムに変換できます。

リボンの「データ」タブの「分析」パネルに「データ分析」があります。これをクリックして、リストからヒストグラムを選択します。

データ範囲、ビン範囲、および出力範囲を尋ねるウィザードが開始されます。ビンの範囲を事前に設定できますが、この場合は 1 ~ 5 の数字になります。データがより複雑になると、MINおよびMAXワークシート関数を使用してビンを決定できます。

ここに画像の説明を入力

上の図では、ビンの範囲が実際のデータの上に 1 つの空白セルで定義されていることがわかります。Excel にはこの余分な行が必要ですが、その理由はわかりません。 編集 空白行は、ビンに列見出しでラベルを付けることができるようにするためのものです。

出力 (緑色のセル) を取得したら、棒グラフとして簡単にプロットできます。

必要に応じて、これらすべてを vba コードで行うことができます (過去に行ったことがあります) が、いくつかの深刻な vba コーディングが必要です。プロセス全体を本当に自動化する必要がない限り、Excel の組み込み機能を使い続けることをお勧めします。

編集

コード プロジェクトの記事/ヒント/トリックがここにあり、ソリューションを自動化するためのほぼすべての方法を説明しています。

于 2013-05-31T20:37:38.623 に答える
0

後世のために、ビンの数 = 5 と仮定して、ヒストグラムを生成するマクロを作成しました (アンケートの質問への回答のように)。

' Make a histogram from the selected values.
' The top value is used as the histogram's title.
Sub MakeHistogramFinal()
Dim src_sheet As Worksheet
Dim new_sheet As Worksheet
Dim selected_range As Range
Dim title As String
Dim r As Integer
Dim score_cell As Range
Dim num_scores As Integer
Dim count_range As Range
Dim new_chart As Chart

    ' Add a new sheet.
    Set selected_range = Selection
    Set src_sheet = ActiveSheet
    Set new_sheet = Application.Sheets.Add(After:=src_sheet)
    title = InputBox(Prompt:="Enter Title for Histogram", _
          title:="Title Submission Form", Default:="Morning Session Summary")
    new_sheet.Name = title


    ' Copy the scores to the new sheet.
    new_sheet.Cells(1, 1) = "Data"
    r = 2
    For Each score_cell In selected_range.Cells
        new_sheet.Cells(r, 1) = score_cell
        r = r + 1
    Next score_cell
    num_scores = selected_range.Count


    'Creates the number of bins to 5
    'IDEA LATER: Make this number equal to Form data
    Dim num_bins As Integer
    num_bins = 5

    ' Make the bin separators.
    new_sheet.Cells(1, 2) = "Bins"
    For r = 1 To num_bins
        new_sheet.Cells(r + 1, 2) = Str(r)
    Next r

    ' Make the counts.
    new_sheet.Cells(1, 3) = "Counts"
    Set count_range = new_sheet.Range("C2:C" & num_bins + 1)

    'Creates frequency column for all counts
    count_range.FormulaArray = "=FREQUENCY(A2:A" & num_scores + 1 & ",B2:B" & num_bins & ")"

    'Make the range labels.
    new_sheet.Cells(1, 4) = "Ranges"
    For r = 1 To num_bins
        new_sheet.Cells(r + 1, 4) = Str(r)
        new_sheet.Cells(r + 1, 4).HorizontalAlignment = _
            xlRight
    Next r

    ' Make the chart.
    Set new_chart = Charts.Add()
    With new_chart
        .ChartType = xlColumnClustered
        .SetSourceData Source:=new_sheet.Range("C2:C" & _
            num_bins + 1), _
            PlotBy:=xlColumns
        .Location Where:=xlLocationAsObject, _
            Name:=new_sheet.Name
    End With

    With ActiveChart
        .HasTitle = True
        .HasLegend = False
        .ChartTitle.Characters.Text = title
        .Axes(xlCategory, xlPrimary).HasTitle = True
        .Axes(xlCategory, _
            xlPrimary).AxisTitle.Characters.Text = "Scores"
        .Axes(xlValue, xlPrimary).HasTitle = True
        .Axes(xlValue, xlPrimary).AxisTitle.Characters.Text _
 _
            = "Count"

        ' Display score ranges on the X axis.
        .SeriesCollection(1).XValues = "='" & _
            new_sheet.Name & "'!R2C4:R" & _
            num_bins + 1 & "C4"

    End With
    ActiveChart.SeriesCollection(1).Select
    With ActiveChart.ChartGroups(1)
        .Overlap = 0
        .GapWidth = 0
        .HasSeriesLines = False
        .VaryByCategories = False

    End With

    r = num_scores + 2
    new_sheet.Cells(r, 1) = "Average"
    new_sheet.Cells(r, 2) = "=AVERAGE(A1:A" & num_scores & _
        ")"
    r = r + 1
    new_sheet.Cells(r, 1) = "StdDev"
    new_sheet.Cells(r, 2) = "=STDEV(A1:A" & num_scores & ")"
End Sub
于 2013-06-17T16:28:45.587 に答える