2017-01-20 5 views
0

私は、一部のデータ、特に2列(2x2行列)の共分散行列を生成するコードを作成しています。何が起こっているのかは、コードが完全に前に働いていたことであり、今は大きな変更なしに(単に関数を使って)変更されることはありません。コードが実行され、MsgBoxが表示され、行列を計算する必要があるときは、すべての行をスキップするだけで終了します。エラーなしでVBAコードをスキップする

コード:

Function GetBaseRate(ranges() As Variant, Days() As Variant) As Object 
    ' Get Data from Data Base 
    ' Use this array to render the bucket titles 
    Dim Covariance As Object 
    Dim Cov As Variant 
    Set Covariance = CreateObject("Scripting.Dictionary") 
    Set sh = ThisWorkbook.Worksheets("AUX") 
    ' Get Covariance for each range 
    limit = UBound(ranges) 
    MsgBox limit 
    For i = 0 To limit 
    MsgBox ranges(i) & " - " & Days(i) 
    Next i 
    For i = 0 To limit 
     sh.UsedRange.ClearContents 
     ' query for each day 
     MsgBox ranges(i) & " - " & Days(i) 
     Query = "SELECT TASA FROM [NVSSQLBI].[MESA].[dbo].[CURVA_BASE_CLP_ON_FECHA] WHERE DIAS ='" & Days(i) & "' AND FECHA > '" & DateAdd("yyyy", -5, Date) & "' ORDER BY FECHA DESC" 
     Query2 = "SELECT TASA FROM [NVSSQLBI].[MESA].[dbo].[CURVA_BASE_CLF_ON_FECHA] WHERE DIAS ='" & Days(i) & "' AND FECHA > '" & DateAdd("yyyy", -5, Date) & "' ORDER BY FECHA DESC" 
     aux = BDconexion2(Query) 
     aux2 = BDconexion2(Query2) 
     Count = 1 
     ' CLP 
     For Each element In aux 
      sh.Cells(Count, 1).Value = element 
      Count = Count + 1 
     Next element 
     Count = 1 
     ' UF 
     For Each element In aux2 
      sh.Cells(Count, 2).Value = element 
      Count = Count + 1 
     Next element 
     ' Generate Cov 
     Cov = VarCov(Range("A1:B" & Count - 1)) 
     'Debug.Print Cov(0, 0) & " - " 
     Covariance.Add CStr(ranges(i)), Cov 
    Next i 
    GetBaseRate = Covariance 
End Function 

これは、データベースへのSQLクエリを作成し、それが共分散行列年代の後の計算のためのワークシートにデータを置きます。 行列を計算コードはこの1つである:

Function VarCov(rng As Range) As Variant 
' Returns covariance matrix 
    Dim i As Integer 
    Dim j As Integer 
    Dim colnum As Integer 
    Dim Matrix() As Double 

    colnum = rng.columns.Count 
    ReDim Matrix(colnum, colnum) 

    For i = 1 To colnum 
     For j = 1 To colnum 
      Matrix(i - 1, j - 1) = Application.WorksheetFunction.Covar(rng.columns(i), rng.columns(j)) 
     Next j 
    Next i 
    VarCov = Matrix 
End Function 

私はそれが動作しない理由はわかりません、私は、以前のバージョンで働いているとそれは全く失敗しません。 デバッグした後、失敗ポイントは完璧に動作するために使用

Matrix(i - 1, j - 1) = Application.WorksheetFunction.Covar(rng.columns(i), rng.columns(j)) 

ラインに位置し、今ではすべてのエラーをスローしないだけで

(MsgBoxには、「完了」という)関数の後の行に行きます

答えて

1

VarCov関数に渡す範囲にシートオブジェクトを追加してみてください。すなわち -

Cov = VarCov(Range("A1:B" & Count - 1)) 

Cov = VarCov(sh.Range("A1:B" & Count - 1)) 
にSH範囲が配置されているワークシートであると仮定すると変更してみてください。

+0

が解決!ありがとうございました –

0

これを書いて、直前のウィンドウに何が入っているのかを確認できますか?

debug.print colnum 
    For i = 1 To colnum 
     For j = 1 To colnum 
      Matrix(i - 1, j - 1) = Application.WorksheetFunction.Covar(rng.columns(i), rng.columns(j)) 
      debug.print i 
      debug.print j 
      debug.print Matrix(i - 1, j - 1) 
      debug.print "---------" 
     Next j 
    Next i 
+0

何も印刷されません.MsgBoxまたはDebug.Printを使用してデバッグしました。これは奇妙なことです。エラーは表示されません –

+0

おそらく 'colnum'は1ですか? – Vityata

+0

それは2回、繰り返しごとに –

関連する問題