プロが教えるわが家の防犯対策術!

我流でVBAを勉強し、マクロを作っている者です
あるデータの度数分布を調べるマクロをつろうとしていますが、うまくいきません。
FREQUENCY関数のデータ範囲の指定で変数を使いたい(元のデータが日を追う毎に増えていくので・・・)のですが、エラーになります。どこが変でしょうか?
よろしくお願いします。

Sub データ最終行を調べる()
Dim 総件数 As Long
Dim 値 As Integer
総件数 = 100000
Sheets("データシート").Select
Range("d2").Select

For G = 1 To 総件数
値 = ActiveCell.Value
If 値 = 0 Then
Exit For
Else
ActiveCell.Offset(1, 0).Activate
End If
Next G
gyou = ActiveCell.Row
dataHANI = Range("d2:d" & gyou)
End Sub

Sub 度数分布を調べる()
データ最終行を調べる
Sheets("度数分布").Select
Range("B2:B21").Select
Selection.FormulaArray = "=FREQUENCY(dataHANI,a2:a21)"

End Sub

A 回答 (4件)

こんにちは。


私の回答は、VBAに関するのみになりますが、エラーになる理由からですが、

Sub 度数分布を調べる()
データ最終行を調べる '1
Sheets("度数分布").Select
Range("B2:B21").Select
Selection.FormulaArray = "=FREQUENCY(dataHANI,a2:a21)" '2
End Sub

1. データ最終行を調べる
で、せっかく範囲は取れていても、その範囲を「度数分布を調べる」の次の行に渡していないのです。こういう場合は、別のプロシージャでは、モジュールレーベルの変数を取るか、引数にして参照渡ししなければなりません。(少し、難しくなります)

2.
式の中は、文字列です。文字列の中に、変数を入れても、ただの文字だけです。範囲をアドレスに換えて、文字列にしなければなりません。

それで、総合的に、このマクロをそのまま達成しようとすると、難しいコードになってしまいます。そして、最終的に、数式に渡すのは、文字列ですから、せっかく、Rangeオブジェクトで範囲をとっても、それ自体は活かしきれません。

今のままのコードを換えてみると、以下のようになるかと思います。
With ステートメントで括られていますが、同じ文字の繰り返しになるので、見易さのために、使いました。(「.」の位置にご注意)

Sub 度数分布を求める2()
Dim dataHANI As String
 With Sheets("データシート")
  .Select
  dataHANI = .Range("d2", .Range("d2").End(xlDown)).Address
  dataHANI = .Name & "!" & dataHANI
 End With
 Sheets("度数分布").Select
 Sheets("度数分布").Range("B2:B22").FormulaArray = _
   "=FREQUENCY(" & dataHANI & ",a2:a21)"
End Sub
    • good
    • 1
この回答へのお礼

ありがとうございました。思い通りに動作しました。
まだまだ勉強不足だと痛感しました。本当にありがとうございました。

お礼日時:2005/05/31 16:41

こんにちは。



VBAを使うときは質問のコードのように式をセルに代入するのではなくて、直接計算結果を入れた方がベターだと思います。

--------------------------------------------------
Sub 度数分布を求める()

 Dim LastRow As Long
 Dim dataHANI As Range

 With Sheets("データシート")
  LastRow = .Range("D65536").End(xlUp).Row
  Set dataHANI = .Range("D2:D" & LastRow)
 End With

 Sheets("度数分布").Select
 Range("C2:C22").Value = WorksheetFunction.Frequency(dataHANI, Range("A1:A21"))

End Sub
----------------------------------------------

以上です。
    • good
    • 0

こんにちは。

maruru01です。

全部見たわけではないですが。
FREQUENCY関数を入力する配列範囲(質問欄では「B1:B21」)は、
FREQUENCY関数の第2引数の区間配列(質問欄では「A1:A21」)より1つ大きくないといけないと思います。
なので、入力範囲を、
「B1:B21」や「B2:B22」
にしてみて下さい。

ちなみに、
区間配列が{A,B,C}
の場合は、データ区分は、
「0~A」「A~B」「B~C」「C~」
になります。
(詳細は、VBAではなく一般の方のヘルプを参照)
    • good
    • 0

[データ最終行を調べる()]で取得した変数[dataHANI]はどのようにして[度数分布を調べる()]に渡されますか?



VBAを書くときは Option Explicit宣言してありますか?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!