0

特定の選択が与えられた場合に、ヒストグラムを生成するマクロを作成しました。マクロのコードは次のようになります

Sub HistogramHelper(M As Range)
Dim src_sheet As Worksheet
Dim new_sheet As Worksheet
Dim selected_range As Range
Dim r As Integer
Dim score_cell As Range
Dim num_scores As Integer
Dim count_range As Range
Dim new_chart As Chart


    Set selected_range = M
    Set src_sheet = ActiveSheet
    Set new_sheet = Application.Sheets.Add(After:=src_sheet)
    title = selected_range.Cells(1, 1).Value
    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
        If Not IsNumeric(score_cell.Text) Then
            'MsgBox score_cell.Text
        Else
            new_sheet.Cells(r, 1) = score_cell
        End If
        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 = xlBarClustered
        .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 _
 _
            = "Out of " & num_scores & " responses"

        ' 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

現在、次のような WorkBook を使用しています。 ここに画像の説明を入力

最終的には、各列を自動的に繰り返し、各列でヒストグラム ヘルパー関数を呼び出し、複数のワークシートで複数のヒストグラムを生成するマクロを作成したいと考えています。今のところ、次のように、2 つの範囲を HistogramHelper に入れることをテストしようとしています。

Sub GenerateHistograms()

    HistogramHelper Range("D3:D30")
    HistogramHelper Range("E3:E30")

End Sub

しかし、マクロを実行すると、エラー番号のダ​​イアログ ボックスが表示400され、シートの 1 つはワークシート タイトル Speaker で正常に作成され、別のシートは数値タイトルでコンテンツなしで作成されます。

何が起こっている?

編集: 問題のワークブック: https://docs.google.com/file/d/0B6Gtk320qmNFbGhMaU5ST3JFQUE/edit?usp=sharing

編集 2 - メジャー WTF? :

デバッグの目的で、最初の FOR ブロックをこれに切り替えました。

For Each score_cell In selected_range.Cells
        If Not IsNumeric(score_cell.Text) Then
            MsgBox score_cell.Address 'Find which addresses don't have numbers
        Else
            new_sheet.Cells(r, 1) = score_cell
        End If
        r = r + 1
Next score_cell

これを実行するたびに、2 番目のマクロ呼び出し (この場合は E3:E30) として配置した範囲に関係なく、プログラムは各セル $E$3 ~ $E$30 が非テキスト文字であることを出力します。なぜああなぜ?

4

1 に答える 1

2

これいらない?

Sheets(title).Activate

ヒント: この種の再帰的な実装では、多くの作成/削除が行われ、毎日ますます複雑になるため、「アクティブな」要素 (ワークシート、範囲など) に依存することはありませんが、特定の要素 (sheets("なんでも」)) 問題を回避し、デバッグを容易にします。

- - - - - - - - - - - - アップデート

いいえ、明らかに、それは必要ありません。selected_range.Cells(1, 1).Value次に、新しいワークシートごとに異なる値を取るように更新します。これがエラーを引き起こしているためです。同じ名前の 2 つのワークシートを作成しています。

------------------------ 更新 2 (スプレッドシートのダウンロード後)

問題は私が考えたものでした.2つのワークシートが同じ名前で作成されました(まあ...正確ではありません:スプレッドシートの1つはnull変数の後に呼び出されることを意図していました)。そして、この問題の理由、私も考えたのは、「アクティブな要素」に依存していることです。しかし、問題は ActiveSheet の使用中ではなく、引数の受け渡し中にありました。範囲はスプレッドシートなしで指定され、最後に作成されたスプレッドシートから取得されました。したがって、解決策:

HistogramHelper Sheets("Sheet1").Range("D3:D30")
HistogramHelper Sheets("Sheet1").Range("E3:E30")

結論: 複雑な状況では、「アクティブ」/適切に定義されていない要素に依存しないでください。

于 2013-06-17T20:28:01.103 に答える