2017-05-08 10 views
0

LinEst関数をVBAで実行しようとしています。私が抱えている問題は、私のX変数が同じ列にあるが、別のワークシートにあることです。VBA:範囲を異なるワークシートの列に設定する

私の質問:異なるシートのこれらの列を1つの範囲に組み合わせることは可能ですか?

以下はコード化しようとしていますが、Union部分に貼り付けられています。私は私のサンプルも提供しました。

ありがとうございます!

Sub FM() 

Dim sResult As Worksheet 
Set sResult = Sheets("Result") 

Dim sY As Worksheet 
Set sY = Sheets("Y") 

Dim sX1 As Worksheet 
Set sX1 = Sheets("X1") 

Dim sX2 As Worksheet 
Set sX2 = Sheets("X2") 

Dim sX3 As Worksheet 
Set sX3 = Sheets("X3") 


Dim sX4 As Worksheet 
Set sX4 = Sheets("X4") 

Dim x() As Variant 
    ReDim x(1 To 4) 
    x(1) = sX1.Columns("A") 
    x(2) = sX2.Columns("A") 
    x(3) = sX3.Columns("A") 
    x(4) = sX4.Columns("A") 


Dim rY As Range 
Set rY = sY.Columns("A") 


sResult.Range("B2").Value = Application.WorksheetFunction.LinEst(rY, x, True, True)(1, 4) 


End Sub 

Sample

+1

「連合」は、異なるワークシートの範囲では機能しません。 –

+0

オプションはありますか? – AxRo

+0

@AxRo私が知っている限り、あなたが達成しようとしていることは不可能です。複数のワークシートに存在する範囲から1つの範囲を作成することはできません。 'Range'は' Worksheet'プロパティのメンバであり、それが存在するコンテナを尊重しなければなりません。何を達成しようとしていますか?私はこのようなことの必要性を想像することはできません。 –

答えて

0

xは、範囲オブジェクトの配列ですが、それぞれの範囲からの値の配列である必要があります。それはほぼ確実に不一致エラーです。

この問題を解決するには、400万行のデータを使用する可能性は低いと考えられるため、範囲を修正する必要があります(Excel 2007+はワークシートごとに1048576行あります)。 this answerのメソッドを使用すると、特定の列範囲のデータを含む最後の行を取得できます。

これはx値を取得し、配列known_xknown_y配列に入れて、LineEst関数で使用できます。

Dim known_x() 'Will contain all of your x values 
Dim known_y() 
Dim i As Long 
Dim rng As Variant 
Dim val As Variant 
Dim ws As Variant 
Dim obs As Long 
Dim SHEET_NAMES As String 'Comma-separated list of worksheets 

SHEET_NAMES = "X1,X2,X3,X4" 

'## Gets the size of the array needed to contain all of the values 
For Each ws In Worksheets(Split(SHEET_NAMES, ",")) 
    With ws 
     obs = obs + GetLastRow(.Columns(1)) 
    End With 
Next 
ReDim known_x(1 To obs) 

'## Dump the values in to the array 
i = 1 
For Each ws In Worksheets(Split(SHEET_NAMES, ",")) 
    With ws 
     Set rng = .Range("A1:A" & GetLastRow(.Columns(1))) 
     For Each val In rng.Value 
      known_x(i) = val 
      i = i + 1 
     Next 
    End With 
Next 

'## Dump your y in to an array 
With Worksheets("Sheet2") 
    Set rng = .Range("A1:A" & GetLastRow(.Columns(1))) 
    known_y = Application.Transpose(rng.Value)) 
End With 

注:あなたが400万+観測を使用して、実際にある場合、私はそれがLinEst機能でknown_x'sと同じサイズでなければなりませんのでごknown_y'sパラメータは、間違っているかもしれないと思うと、あなたがする必要があります。など

NOTE、配列が同じサイズであることを確認するためのロジックを追加します。を私はあなたがあなたのLinEst関数呼び出しの終わりに(1, 4)でやっていることは考えてきません。

+0

ありがとうございました。 '(1,4)'は特定のベータ値を呼び出す 'LinEst'関数の座標です。 – AxRo

0

私は役に立たない答えを入れたくないが、あなたはそれで少しプレイする場合、あなたは役に立つ何かを見つけるでしょう。そして、それはB2にいくつかの結果を生成します。

Option Explicit 

Sub FM() 

    Dim sResult As Worksheet 
    Set sResult = Sheets(1) 

    Dim sY As Worksheet 
    Set sY = Sheets(2) 

    Dim sX1 As Worksheet 
    Set sX1 = Sheets(3) 

    Dim sX2 As Worksheet 
    Set sX2 = Sheets(4) 

    Dim sX3 As Worksheet 
    Set sX3 = Sheets(6)   

    Dim sX4 As Worksheet 
    Set sX4 = Sheets(5) 

    Dim x() As Variant 
     ReDim x(1 To 4) 
     x(1) = sX1.Cells(1, 1).Value 
     x(2) = sX1.Cells(2, 1).Value 
     x(3) = sX1.Cells(3, 1).Value 
     x(4) = sX1.Cells(4, 1).Value 


    Dim rY As Range 
    Set rY = sY.Range(sY.Cells(1, 1), sY.Cells(5, 1)) 

    sResult.Range("B2").Value = Application.WorksheetFunction.LinEst(rY(1, 1), x(1), True, True) 

End Sub 

問題は、配列と範囲を参照する方法で、主にあります。これらのすべてをもう一度チェックすると、実行可能なソリューションを作成できます。

関連する問題