• ベストアンサー

回帰の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/17068)
回答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
質問者

補足

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

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • VBA(重回帰分析)

    以下のプログラムが動かないのですがなぜでしょうか? Sub Macro2() Application.Run "ATPVBAEN.XLAM!Regress", _ Worksheets("aaa").Range("$A$1:$A$5"), _ Worksheets("aaa").Range("$B$1:$C$5"), True, False, , _ Worksheets("bbb").Range("$A$1"), False, False, False, False, , False End Sub 具体的には、シート「aaa」のA1~A5を説明変数、B1~C5を被説明変数として、重回帰分析の結果を「bbb」のA1に表示させようとしているのですが、うまくいきません。 ちなみにexcel2007を使っています。

  • マクロの自動記録について

    Sub Macro1() 'Macro1 Macro 'Keyboard Shortcut:Ctrl+a Application.Run"ATPVBAEN.XLA!Sample",Worksheets("sheet1").Range("$A$2:$AD$31"),ActiveCell,"R",10,False ActiveCell.Offset(0,1).Select End Sub  これは、マクロの自動記録を用いて、『ツール>分析ツール>サンプリング』の動作を自動的に生成されたマクロ(プログラム)を書き直したものです。  このマクロを実行しようとすると、『実行時エラー'1004':'ATPVBAEN.XLA'が見つかりません。ファイル名およびファイルの保存場所が正しいか確認してください。』と出て、マクロが実行できません。どうすればよいでしょうか?

  • VBAを始めたばかりです。

    VBAを始めたばかりです。 下記でエラー「オブジェクトが必要です」が出ます。 何故ですか。 Sub A_Sample048() Dim mySht1 As Object Dim mySht2 As Worksheet '準備ここまで Set mySht1 = ActiveSheet If mySht1.Type = xlWorksheet Then Set mySht2 = mySht1 MsgBox mySht2.Name Else MsgBox "最前面のシートはワークシートではありません" End If Set mySht1 = Nothing 'オブジェクトの解放 Set mySht2 = Nothing End Sub よろしくお願いします。

  • VBA オートフィルタで抽出したものを連続貼り付け

    下記のように情報が100近くまで存在した場合に、オートフィルターで一つずつ抽出したものをコピーし、新規シートに貼り付けたいのですが、どうすれば良いのでしょうか? 1 1 1 2 2 2 3 3 3 たとえばシート1に 1 1 1     シート2に 2 2 2 といったように処理したいので、教えて下さい。 vbaの参考書とサンプルを見て下記のように作成したのですが上手くいきません。 どんな本を読めば作成出来るようになるのかわからず、質問させていただきました。 ub オートフィルター() Dim myRng As Range Dim mySht As Worksheet Set myRng = _ Worksheets(1).Range("A1").CurrentRegion With Worksheets Set mySht = .Add(after:=.Item(.Count)) End With With myRng .AutoFilter field:=1, Criteria1:=8 On Error Resume Next .Resize(.Rows.Count - 1).Offset(1).Copy mySht.Range("A1") .SpecialCells(xlCellTypeVisible).Copy mySht.Range("A1").AutoFilter mySht.Range("A1").AutoFilter If Err.Number <> 0 Then Application.DisplayAlerts = False mySht.Delete Application.DisplayAlerts = True End If On Error GoTo 0 End With Set myRng = Nothing Set mySht = Nothing End Sub

  • 最適尺度法を伴う回帰分析

    最適尺度法を伴う回帰分析 SPSSでカテゴリカル回帰をしたいと思います。 従属変数は「1.全く不満足~5.非常に満足」までの5つのカテゴリです。 説明変数は、X1~X20まで20コあります。二値のデータで、仮に「A~Tまでの教材を使用したかしないか」という設問で、Aを使用したら1,しなかったら0というように入力しています。 これらのデータでカテゴリカル回帰を行い、A~Tまでのどの教材が満足度への影響力が強いのか「重要度 」を分析したいと思うのです。 SPSSでは、「回帰」から「最適尺度法」、従属変数は「スプライン順序」で「内側ノット」は「2」、説明変数は「スプライン名義」で「内側ノット」は「0」と設定しています。しかしエラーが出て計算ができません。カテゴリカル回帰ご存じの方おられましたら、御指南ください。

  • 原点を通る重回帰式について

    重回帰式Y=α+βX1+・・・・という線形回帰を使っているのですが 定数項が大きく+、-に振れたりしてこまっています。 サンプル数が少ないからぶれるのは仕方ないのですが どうすれば計算上α(定数項)をゼロにすることができるんですか。 教えてください。 ちなみに、変数は4変数、一次で、各係数は今後サンプルを増やせば +になるという条件でお願いいたします。

  • 複数ファイルへのVBAの処理について

    最近、ExcelのVBAを使うようになりました。 しかし、以下のような処理を同じフォルダ内の複数のファイルに対して一気にやりたいのですが、わかる方いらっしゃいませんか? 理想としては同じフォルダ内で50個くらいを選択して一気にやりたいのですが・・・。 ******************************* Sub FFT() Columns("A:A").Select Selection.TextToColumns Destination:=Range("A1"), DataType:=xlFixedWidth, _ FieldInfo:=Array(Array(0, 1), Array(18, 1)), TrailingMinusNumbers:=True Range("E8").Select Application.Run "ATPVBAEN.XLA!Fourier", ActiveSheet.Range("$B$1:$B$256"), _ ActiveSheet.Range("$C$1:$C$256"), False, False Columns("C:C").ColumnWidth = 38.38 Range("D1").Select Columns("D:D").ColumnWidth = 20.75 Range("D1").Select ActiveCell.FormulaR1C1 = "=IMABS(RC[-1])" Range("D1").Select Selection.Copy Range("D1:D256").Select ActiveSheet.Paste Range("E6").Select Application.CutCopyMode = False ActiveCell.FormulaR1C1 = "" Range("E7").Select End Sub

  • VBAの関数について

    VBA初心者です。 VLOOKUP関数の使い方がわかりません。 具体的に書かせてもらうと VBAの中にVLOOKUP関数を使いたいです 試験1ファイルのシート"sheet1"にある 検索値を使い 試験2ファイルの指定した検索範囲を 試験1ファイルのシート"sheet1"の指定した位置に数値を挿入することです。 例えばですが(この使い方も間違ってるかもしれません)コードを書いてみると 試験1の検索値はA5セルとします 試験2の検索範囲はB1~C20とします 検索範囲から取得した数値の位置はD5とします VLOOKUPに関してですが 検索値は変数を使い 検索値範囲も変数を使い 列番号はC列がいいので3で 検索方法はFALSEでお願いします sub test() dim a as range dim b as workbooks dim c as range set a = range("B1~C20") set b = workbooks("sheet1") set c = range("A5") workbooks("試験1").worksheets("sheet1").range("D5").value=workbooks("試験2").activesheet."=VLOOKUP(ここがわかりません)".value end sub そもそも変数やsetの使い方が間違ってるかもしれませんm(__)m コードを書いて貰えるととても助かります。 回答お願いします。

  • いい方法を教えてください(VBAについての質問)

    よろしくお願いします。 ある処理についてプロシージャを作成しました。 それは「毎回データの行数・列数の異なるデータから必要な列のデータだけを取り出して別のシートにコピーして貼り付ける」処理です。 具体的にはセルのA2以下にデータを貼り付けて必要な列の1行目空白セルに1を、不要な列は0を入れ、必要なデータ(1を入れた列にあるデータ)だけ取り出すという処理です。  Do Until ActiveCell.Value = ""   If Selection.Value = "1" Then   Selection.Offset(1, 0).Select   Range(Selection, Selection.End(xlDown)).Copy _   Destination:=mySht.Range("IV1").End(xlToLeft).Offset(0, 1)   Selection.End(xlUp).Offset(0, 1).Select   Else   Selection.Offset(0, 1).Select   End If  Loop ↑こんな感じで書きました。 myShtは変数で、必要データ貼り付け用に作成したシートです。 使ってみて穴に気付きました。 データに空白があった時に、空白以後のデータがコピーされないのです。そういう書き方なので当然ですが・・・。 範囲の指定をその列のデータの最初から空白関係なくデータのある最終行までにしようとあれこれと試しましたがことごとくうまくいきません。 これが1つ目の悩みです。 もう1つは   Range(Selection, Selection.End(xlDown)).Copy _   Destination:=mySht.Range("IV1").End(xlToLeft).Offset(0, 1) の部分、取り出した列のコピーを別のシート(mySht)に左寄せで順番に詰めてコピーしていくようにしたのですが、この記述だと1列目が空いてしまいます。 ですから実際はこの後1列目を削除する処理をしています。 この1列目の削除というのが本来不要な作業なので、なんだかイヤなのです。 何かいい方法を教えてください。 ヒントみたいなものでもうれしいです。

  • 回帰分析の繰り返し→結果出力VBA

    今、1つのブックに複数のワークシートがあります。 ワークシートには、それぞれ日本、アメリカ、カナダ・・・というふうな形で名前がついています。 それぞれのワークシートには、次のようなデータが入っています。 年月    消費    所得 198001   10     100 198002   12     130 ・ ・ ・ それぞれのワークシートごとにサンプル数が 異なります。やりたいことは、ワークシートごとに 単回帰を行い、次のような形で、新たなワークシートに回帰係数bだけ出力できるようにしたいです。 国名   回帰係数b 日本    5 アメリカ  3 ・ ・ 本やインターネットで色々探してみましたが、 どうしても解答に行き着くことができません。 ご存知の方がいらっしゃれば、ご教示願います。

専門家に質問してみよう