• ベストアンサー

回帰のVBA

今、1つのブックに複数のシートがあります。 それぞれのシートに対して、Q列を従属変数に、 T列を独立変数にした回帰モデルを推定しよう としています。 しかし、各々のシートのサンプル数が必ずしも 同じ数ではないため、うまくできません。 今は、以下のようなプログラムで、同じサンプル数の シートだけ実行している状態です。 Sub reg() Dim mySht As Worksheet For Each mySht In Worksheets Application.Run "ATPVBAEN.XLA!Regress", mySht.Range("$Q$1:$Q$10"), _ mySht.Range("$T$1:$T$10"), False, True, , mySht.Range("$AB$2") _ , False, False, False, False, , False Next End Sub どのように改良すれば良いのでしょうか? Q列とT列のデータの入っている行(必ず等しくなっています)までをサンプルとしてVBAを実行したいです。 ご存知の方、ご教示頂ければと思います。

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

#2の訂正です。 Sub regTest1()  Dim mySht As Worksheet, MyRng As Range  For Each mySht In Worksheets   Set MyRng = mySht.Range("Q1", myShet.Range("Q1").End(xlDown))   Application.Run "ATPVBAEN.XLA!Regress", _    MyRng, _    MyRng.Offset(, 3), _    False, True, , _    mySht.Range("$AB$2") _   , False, False, False, False, , False  Next End Sub

hunter_paul
質問者

お礼

なぜ、エラーがでるか解決しました。 3行目のmyShtがmyShetになっていることが 原因であったようです。すいませんでした。 ただ、重回帰の場合は、どうするのか 考えても分かりませんでした。教えて頂ければ 幸いです。

hunter_paul
質問者

補足

2度も書き込み頂き、ありがとうございました。 この方法でも、「オブジェクトが必要です」という エラーメッセージがでてしまいます。 ついでといっては、図々しいですが、 たとえば従属変数をTからX列までの重回帰に した場合はどうなるのか、教えて頂ければ幸いです。 本当にすいません。

その他の回答 (4)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.5

hunter_paul さん、 >3行目のmyShtがmyShetになっていることが ミスが続いて、すみませんでした。 今、調べてみましたが、Excelには、重回帰自体のツールはないようですね。 私は、重回帰分析は分かりませんが、ツールはあるようですね。でも、値段が高いです。 $20程度なら、手は出してもよいのですが、Polymath というのは有名だそうですが、$300以上もしますね。いくらフリー・トライアルがあっても、それは、ちょっと手が出せません。 ここに、日本語のマクロが置いてありますね。お役に立てますかしら? 重回帰分析(ステップワイズ変数選択)

参考URL:
http://aoki2.si.gunma-u.ac.jp/lecture/stats-by-excel/vba/html/sreg.html
  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.4

シートによってサンプルデータの最下行が違う、で壁なのでしょうが ほかにも解決点は (1)シートが別のシートに変わることの表現法 (2)Q,T列の最下行を捕らえる方法 (3)捕らえた行数字をコードに反映する方法 (1)はWorksheets(ワークシート名)Worksheets(Index番号) などをForNextの中で変化させる (2)d=Worksheets(名前).Range("A65536").End(xlUp).Rowで捕らえられる (3)Range(Cells(i,j),(k,l))で範囲指定できる。iは固定でkはdを使う。 j、lはQ,T列 (4)そのほかにシートを2つ以上扱うときは Dim Sh1 as Worksheet Set Sh1=worksheets("Sheet1")のような使い方が便利。 いろいろコードを載せるより、私なりの、要点になりそうなスキルをリストしてみました。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんにちは。 Q列とT列のデータ高が同じなら、Endプロパティと、Offset でいけると思います。 Sub regTest1()  Dim mySht As Worksheet, MyRng As Range  For Each mySht In Worksheets   Set MyRng = mySht.Range("Q1", Range("Q1").End(xlDown))   Application.Run "ATPVBAEN.XLA!Regress", _    MyRng, _    MyRng.Offset(, 3), _    False, True, , _    mySht.Range("$AB$2") _   , False, False, False, False, , False  Next End Sub

  • driverII
  • ベストアンサー率27% (248/913)
回答No.1

Rangeはこんなふうにも書けます。 range(Cells(row,col),Cells(row2,col2)) row = 行 col = 列(A列 =1, B列 =2・・・) ですので Q列を参照しているところを range(cells(1,17),cells(x,17)) T列を参照しているところを range(cells(1,20),cells(x,20)) とします。 でFor 分の直後に x = application.WorksheetFunction.CountA("A1:A65535") 等で対象行数を取得すればOKです。 ----------------------------------------------- Sub reg() Dim mySht As Worksheet Dim nD as integer For Each mySht In Worksheets nD = application.WorksheetFunction.CountA("A1:A65535") Application.Run "ATPVBAEN.XLA!Regress", mySht.Range(cells(1,17),cells(nD,17)), _ mySht.Range(cells(1,20),cells(nD,20)), False, True, , mySht.Range("$AB$2") _ , False, False, False, False, , False Next End Sub

hunter_paul
質問者

補足

この方法で、試したみましたが、 「回帰分析入力範囲と出力先の参照ができません」という エラーメッセージがでます。 私の知識が足りないことが原因でしょうか?