2016-12-05 11 views
0

に3つのベクトルの値を渡す:は、次のように私はサブを持っている別のサブ

Sub simulations(k As Long) 
Dim moAkt() As Double, moShort() As Double, moImmo() As Double 
    . 
    . 
    . 
    For l = 1 To length 
    . 
    . 
       ' write into the vectors 
       moAkt(l) = zaktie 
       moImmo(l) = zImmo 
       moShort(l) = zshort 
    Next l 
    End Sub 

私はこれらのベクトルがあるので、私はエラーを取得するcalculateColl

Sub calculateColl 
Call simulations 
       Dim l As Long 
       Open "C\testfile.txt" For Append As #1 
        For l = 1 To 10 
        Print #1, moImmo(l) ";" zshort(l) ";" moAkt(l) 
        Print #1, 
        Next l 
        Close #1 
    End Sub 

別のサブでこのサブを呼び出しますこのサブでは知られていない。今私はを避けたいと思っています。subに別の変数があるので、ByRefを避けてください。どのようにしてこれら3つのベクトルのすべての値を新しいサブcalculateCollに渡すことができますか?ファイルに書き込むことができますか?

+0

「moAkt」、「moImmo」、および「moShort」が宣言されましたか? – Comintern

+1

あなたの 'シミュレーション' Subは1つのパラメータ(つまり 'k As Long')を求めているので、長い変数やリテラルを渡さずに' Call Simulations'のように呼び出すことはできません – user3598756

+0

'moAkt'、' moImmo'および 'moShort 'サブ' calculateColl'にあり、 'byRef'をサブ'シミュレーション ' – PartyHatPanda

答えて

1

として、あなたの配列を返すことになる

別のより洗練されたアプローチであなたのSub simulationsあなたはそれから値を返すようにしたい場合は、本当に機能しなければなりません。返すものにはいくつかのオプションがあります(Collection、2D配列など)。あなたのSub calculateCollに関数の戻り値を使用して、最後に

Function simulations(k As Long) As Vector() 
    Dim vectors() As Vector 
    '... 
    For l = 1 To Length 
     ' write into the vectors 
     vectors(l).Akt = zaktie 
     vectors(l).Immo = zImmo 
     vectors(l).Short = zshort 
    Next l 
    simulations = vectors 
End Function 

:次にsimulationsリターンというの配列を持っている

'Give this a more appropriate name. 
Public Type Vector 
    Akt As Double 
    Immo As Double 
    Short As Double 
End Type 

:私は個人的に関連する値を保持するための簡単なユーザタイプを宣言したい

Sub calculateColl() 
    Dim toWrite() As Vector 
    toWrite = simulations(whateverKShouldBe) 
    Dim l As Long 
    Dim handle As Long 
    handle = FreeFile 
    Open "C\testfile.txt" For Append As #handle 
    For l = LBound(toWrite) To UBound(toWrite) 
     Print #handle, toWrite(l).Akt; ";"; toWrite(l).Immo; ";"; toWrite(l).Short 
     Print #handle, 
    Next l 
    Close #handle 
End Sub 

ハードコードされたファイル番号の代わりに常にFreeFileを使用する必要があります。

+0

優れた答えを助けることができます。 –

0

これを行うことをお勧めしますが、あなたがそれらをモジュールレベルで宣言した場合、モジュールの上部にある(明示的にオプションの下にある)ことを意味します。例えば。

Option Explicit 
Dim moAkt() as Single, moImmo() as Single, moShort() as Single 

Sub simulations(k As Long) 
..... 

ただし、simulations-subを繰り返し呼び出すと、エラーが発生しやすくなります。 FunctionSub simulationsを変更し、カスタムCollection

+1

あなたは正しく動作するあなたはあなたの答えに注意を払って説明します。しかし、私はモジュール変数を使用するときに注意を再強調したいと思います:**あなたが慎重でないと本当にひどくあなたを台無しにする可能性があります!**私はちょうど最近これで自分自身を苦しめました。ただ気をつけてください。 – PartyHatPanda

+0

ベクトルをSingleと宣言すると、まだエラーがあります。なぜなら、そのサブが繰り返し呼び出されるからです。たぶん関数だけで – maniA

関連する問題