2016-04-20 186 views
0

ExcelのVBAでLinestをサブルーチンで使用する際に問題が発生しました。私はx値の列(行17から始まる列A)とy値の列(行17から始まる列G)の多項式係数(3次または4次)を返す必要があります。ExcelのVBAのLinest多項式回帰

私が現在使用しているコードを以下に示します。

Dim X 
X = Application.Evaluate("=linest(g17:g61,A17:A61^{1,2,3})") 
Cells(3, 8) = X(1) 
Cells(4, 8) = X(2) 
Cells(5, 8) = X(3) 
Cells(6, 8) = X(4) 

本質的に、このサブルーチンを任意の長さのデータで動作させる必要があります。データは常に行17に入力され始めます。これを行うには、以下に示すようなコードを使用しようとしています。私は上記の代わりにG17:G61と同様の範囲を使用する場合

Range(Cells(i, 1), Cells(Cells(Rows.Count, 1).End(xlUp).Row, 1)), Range(Cells(i, 2), Cells(Cells(Rows.Count, 2).End(xlUp).Row, 2)) 

はしかし、私は、型の不一致エラーが発生します。私はなぜ細胞の範囲がフォーマットG17:G61の細胞の範囲と異なるのか分かりません。私はまたA17:A61の代わりに単純なRange(Cells(17,1),Cells(61,1))を使ってみました。

G:17:G61の代わりに"G" & 17:"G" & 61を使用してみましたが、閲覧中にいくつか見たことがありますが、それでも問題は解決していないようです。

他にも優れた機能がありますか?

助けてください!

+0

あなたのタイトルは、これはExcelで回帰を行う際の問題であることを示しています。 Excel VBAでのプログラミング範囲の問題です。すでにこのサイトにはたくさんの良いコンテンツがあります。 [This](http:// stackoverflow。com/questions/22202948/using-range-function-excel-with-variables)にはいくつかの簡単な例があります。 – OldUgly

+0

私はそれを使用しようとしている容量(すなわち、より多項式のためのVBA)でLinest関数に関する十分な情報を見つけるのが難しかったので、入力する必要があるものを正確に理解するのに苦労しました。さらに展開できますか? – SilvaAger

答えて

1

あなたの質問の最初のコメントは、あなたに正しい道案内を行います。Application.Evaluateは文字列を取ります(その文字列の範囲への参照を作成する必要があります)。 Rangeとを使用する2番目の方法では、Application.WorksheetFunction.LinEstへの参照を渡す文字列を評価する代わりに、オブジェクト参照を使用する場合は、Rangeへのオブジェクト参照を作成します。

ここでは、元の質問のセル参照を使用した例を示します。

Public Sub TestLinest() 

Dim x 
Dim i as long 
Dim evalString As String 
Dim sheetDisplayName As String 
Dim polyOrder as string 

' this is whatever the name of your sheet containing data: 
sheetDisplayName = "Sheet1" 
' this gets the index of the last cell in the data range 
i = Range(sheetDisplayName & "!A17").End(xlDown).Row 
' Obviously change this depending on how many polynomial terms you need 
polyOrder = "{1,2,3}" 

evalString = "=linest(" & sheetDisplayName & "!E6:E" & i & ", " & sheetDisplayName & "!D6:D" & i & "^" & polyOrder & ")" 
x = Application.Evaluate(evalString) 

Cells(3, 8) = x(1) 
Cells(4, 8) = x(2) 
Cells(5, 8) = x(3) 
Cells(6, 8) = x(4) 

End Sub 

範囲、シート名、および多項式の順で、いくつかの魔法の変数があります。おそらくこのルーチンは、それらを引数として関数に渡し、係数の配列を返すように拡張できますか?スプレッドシートのロジックはあなたおよび/またはあなたのユーザーにもっと目に見えるままであることを意味するだろう、あなたがVBAを使用せずに、すべてこれを達成できることを言及する価値があるかもしれません。この時点で、


。セルに充填の合計数を取得

=COUNT(A17:A10000) 

入力します(これはA1であると言うことができます)

:ここでは、シート上のすべてのこれを行うために有効にするためにいくつかの例の関数であり、ここでの要点ですこれは、配列数式として:

=LINEST(INDIRECT("G17:G"&(A1+16)), INDIRECT("A17:A"&(A1+16))^{1,2,3}) 

16と、この式中の{1,2,3}明らかに状況に合わせて変更することができます。

+0

コードをステップ実行して、ローカルウィンドウを使用して変数に含まれる内容を確認してください。この場合、xは2次元配列なので、 'x(1,1)'のようなものが必要になると思います。また、もともとあなたがx、x^2、x^3に対して回帰していたことを認識していませんでした。これを行うには、スプレッドシートにセルを追加するか、LinEst関数に渡すために配列を自分で計算する必要があります。 – GodLovesATrier

+0

さらなる調査の後、これは線形トレンドの係数をデータに戻すだけです。どのようにしてこれを修正して、3次または4次の係数を返すことができますか? – SilvaAger