2017-06-30 19 views
0

私はVBAをかなり新しくしており、いくつかの財務報告を自動化しようとしています。以下は、私が持っているサブプロシージャーです:特定のシートからVBAマクロを実行できません

Sub normdata() 

Dim numofstocks As Integer 
Dim numofdatapoints As Integer 
Dim numberofiterations As Integer 
Dim averageposition As Integer 

numofstocks = Application.CountA(Sheets("Static").Range("B:B")) - 1 
Sheets("NormData").Range("A2").Value = "Date" 

    For i = 1 To numofstocks 
     Sheets("NormData").Cells(1, 2 * (i - 1) + 2).Value = Sheets("Static").Cells(i + 1, 1) 
     Sheets("NormData").Cells(2, 2 * (i - 1) + 2).Value = "Close" 
     Sheets("NormData").Cells(2, 2 * (i - 1) + 3).Value = "Returns" 
    Next i 

numofdatapoints = Application.CountA(Sheets("RawData").Range("A:A")) - 2 

    For i = 1 To numofdatapoints 
     Sheets("NormData").Cells(i + 2, 1).Value = Sheets("RawData").Cells(i + 2, 1).Value 
    Next i 

    For j = 1 To numofstocks 
     For i = 1 To numofdatapoints 
      Sheets("NormData").Cells(i + 2, 2 * (j - 1) + 2).Value = Sheets("RawData").Cells(i + 2, 6 * (j - 1) + 5).Value 
     Next i 
    Next j 

numberofiterations = Application.CountA(Sheets("RawData").Range("A:A")) - 3 
    For j = 1 To numofstocks 
     For i = 1 To numberofiterations 
      Sheets("NormData").Cells(i + 2, 2 * (j - 1) + 3).Value = (Sheets("NormData").Cells(i + 2, 2 * (j - 1) + 2).Value - Sheets("NormData").Cells(i + 3, 2 * (j - 1) + 2).Value)/Sheets("NormData").Cells(i + 3, 2 * (j - 1) + 2).Value 
     Next i 
    Next j 


averageposition = Application.CountA(Sheets("NormData").Range("A:A")) + 2 
    For i = 1 To numofstocks 
     Worksheets("NormData").Cells(averageposition, 2 * (i - 1) + 2).Value = Worksheets("Static").Cells(i + 1, 1) & " average daily returns" 
     Worksheets("NormData").Cells(averageposition, 2 * (i - 1) + 3).Value = Application.WorksheetFunction.Average(Worksheets("NormData").Range(Cells(3, 2 * (i - 1) + 3), Cells(numberofiterations + 2, 2 * (i - 1) + 3))) 
     Worksheets("NormData").Cells(averageposition + 1, 2 * (i - 1) + 2).Value = Worksheets("Static").Cells(i + 1, 1) & " daily variance" 
     Worksheets("NormData").Cells(averageposition + 1, 2 * (i - 1) + 3).Value = Application.WorksheetFunction.VarP(Worksheets("NormData").Range(Cells(3, 2 * (i - 1) + 3), Cells(numberofiterations + 2, 2 * (i - 1) + 3))) 
     Worksheets("NormData").Cells(averageposition + 2, 2 * (i - 1) + 2).Value = Worksheets("Static").Cells(i + 1, 1) & " daily std dev" 
     Worksheets("NormData").Cells(averageposition + 2, 2 * (i - 1) + 3).Value = (Application.WorksheetFunction.VarP(Worksheets("NormData").Range(Cells(3, 2 * (i - 1) + 3), Cells(numberofiterations + 2, 2 * (i - 1) + 3))))^(1/2) 
     Worksheets("NormData").Cells(averageposition + 3, 2 * (i - 1) + 2).Value = Worksheets("Static").Cells(i + 1, 1) & " 95% VaR" 
     Worksheets("NormData").Cells(averageposition + 3, 2 * (i - 1) + 3).Value = Application.WorksheetFunction.Percentile(Range(Cells(3, 2 * i + 1), Cells(numberofiterations + 2, 2 * i + 1)), 0.05) 
     Worksheets("NormData").Cells(averageposition + 4, 2 * (i - 1) + 2).Value = Worksheets("Static").Cells(i + 1, 1) & " 99% VaR" 
     Worksheets("NormData").Cells(averageposition + 4, 2 * (i - 1) + 3).Value = Application.WorksheetFunction.Percentile(Range(Cells(3, 2 * i + 1), Cells(numberofiterations + 2, 2 * i + 1)), 0.01) 
    Next i 

    For i = 1 To numofstocks 
     Worksheets("Static").Cells(1 + i, 4).Value = Worksheets("NormData").Cells(numberofiterations + 4, 2 * i + 1).Value 
    Next i 


End Sub 

は、例えば、私はシート「NormData」にいるときにコードを実行することができるだけだが、そうでない場合、私は実行時エラー「1004」を取得し、アプリケーションが定義されましたかオブジェクト定義エラー。コードは常に2番目のforループで停止し、ループの2番目の行を強調表示します。ご協力いただきありがとうございます。感謝:)

答えて

-1

例えば変数

内のすべてのワークシートを設定してください:

dim wsNormData as Worksheet 
set wsNormData = ThisWorkbook.Worksheets("NormData") 

、その後のように使用します。あなたの問題はあなたのコードは束を使用していることである

wsNormData.Cells(x,y).value = "value" 
+0

SO Rafaelへようこそ!ちょうどヒント、何かだけでなく、理由を説明してください。これはあなたの答えがOPのために明確になるのを助けるでしょう。運が良かった! –

+0

アドバイスのためのThx: –

+0

ワークシートへのキャッシュ参照はパフォーマンスをわずかに向上させる可能性がありますが、問題の原因ではありません。 – GSerg

1

これらの問題の1つがコードが破れているときに、本質的にそれを捕らえるのを難しくする非修飾/暗黙の参照が含まれています。

Worksheets("NormData").Range(Cells(3, 2 * (i - 1) + 3), Cells(numberofiterations + 2, 2 * (i - 1) + 3))) 

Cells(3, 2 * (i - 1) + 3)を参照あなたが修飾されていない細胞にActiveWorkbook.Worksheets("NormData").Rangeで始まり、その後、入力方法を参照してください:右ここでこの行は問題ありか?このセル参照は実際にはActiveSheet.Cells("")と表示されますので、ActiveSheetActiveWorkbook.Worksheets("NormData")以外の場合、コードは壊れます。

詳細については、この投稿を参照してください。Why does Range work, but not Cells?

+0

こんにちは、ブランドン、あなたの助けを今までありがとう!コードを編集したり、コードを変更したりするための提案はありますか?また、修飾されていないセル参照とは何ですか?また、どのようにそれらを克服するのですか? – Bert

+0

上記の答えは文字通りあなたのコードを壊している問題なので、そこから始めて修正したいと思うでしょう。非修飾参照は基本的に、親が指定されていないオブジェクトへの参照です。たとえば、 'Worksheets()'は修飾されていませんが、 'ThisWorkbook.Worksheets'は完全修飾されています。同じ質問にも答える他の投稿をチェックしてください。追加情報があります。私の推奨は、 'With'ブロックと変数を使用してコードをクリーンアップし、そこから移動することです。 –

+0

あなたの助けてくれてありがとう、私はあなたが提案したものを試してみる方法を見てみましょう:) – Bert

関連する問題