2009-03-15 32 views
1

私はASPで作業して以来、しばらくしていますが、単純な代入文であるようにタイプミスマッチエラーが発生しています。なぜ誰かが起こっているかもしれないかについて、誰かが何らかの光を当てることができるか?ASP内の配列割り当てでタイプの不一致があります

これは動作しますが、私は割り当てられていない質問をするforeachしようとすると、動的配列としてIセットアップの質問はそれから割り当てが型の不一致エラーで失敗した場合、私はオブジェクトではないに

Class Survey 
    public ID 
    public Title 
    public Questions 
End Class 

Sub Test() 
    Dim oSurvey 
    Set oSurvey = new Survey 
    Dim aQuestions(2) 
    Set aQuestions(0) = new Question 
    ' Other aQuestions assignments 
    oSurvey.Questions = aQuestions 
End Sub 

代わり収集エラーを取得するブロック。

Class Survey 
    public ID 
    public Title 
    public Questions() 
End Class 

Sub Test() 
    Dim oSurvey 
    Set oSurvey = new Survey 
    Dim aQuestions(2) 
    Set aQuestions(0) = new Question 
    ' Other aQuestions assignments 
    ' Throws a Type mismatch error here 
    oSurvey.Questions = aQuestions 
End Sub 

+0

配列の代わりにScripting.Dictionaryを使ってみましたか? – DaveJustDave

答えて

0

私はArray宣言に固執しました。また、私はReDimのように配列をしようとしたときにエラーが発生しました。

ReDim oSurvey.Questions(2) 

だから私は、配列をReDimするサブルーチンを作成しました。これはうまくいきました。

Class Survey 
    public ID 
    public Title 
    public Questions() 

    sub ReDimQuestions(count) 
    ReDim Questions(count) 
    end sub 
End Class 

Sub Test() 
    Dim oSurvey 
    Set oSurvey = new Survey 
    oSurvey.ReDimQuestions 2 
    Set oSurvey.Questions(0) = new Question 
    ' Other aQuestions assignments 
End Sub 
0

同じコードをVBA(ExcelまたはWord)に貼り付けようとすると、コンパイルされません。

それはラインpublic Questions()にエラーが最初の例で

 
--------------------------- 
Microsoft Visual Basic 
--------------------------- 
Compile error: 

Constants, fixed-length strings, arrays, user-defined types and Declare statements not allowed as Public members of object modules 
--------------------------- 
OK Help 
--------------------------- 

言っ示し、配列(それはしたがって任意の値を割り当てることができる変異体&である)として定義されていません。

+0

VBAでこれをテストしたいのなら、クラス/エンドクラスの代わりにクラスモジュールを作成する必要があると思います – bendewey

+0

確かに。アイデアはなぜ失敗するのか理解することでした。 – shahkalpesh

0

更新:私はこれをASP.NETでテストしましたが、従来のASPについての質問は実現しませんでした。私は、私はまだそれをテストすることができていないものの、従来のASPで動作するように以下のコードを変更した:

Class Question 
     ... 
    End Class 

    Class Survey 
     Public ID 
     Public Title 
     Public Questions As Question() 
    End Class 

    Sub Test() 
     Dim oSurvey As New Survey 
     Dim aQuestions(0 To 2) As Question 
     Set aQuestions(0) = New Question 
     ... 
     Set oSurvey.Questions = aQuestions 
    End Sub 

あなたの最初の例では、Survey.Questionsがコレクションではありません。あなたの次は、タイプVariantの配列です。

+0

私が受け取っているエラーは古典的なaspです – bendewey

+0

私は上記のコードはまだ動作するはずだと思っていますが、おそらく各オブジェクトの割り当ての前に 'Set'キーワードを使用する必要があります。私は答えを更新します。 – elo80ka

+0

古典的なaspでASキーワードを使用したときにエラーが発生しました – bendewey

2

実際に何が起こっているかについてのご質問にお答えください。

私が割り当てられていない 質問をするforeachしようとしたとき、私はそれぞれの場合ではない 収集エラー

オブジェクトは、ソース変数からバリアントのセットを列挙し得るブロック、それはIEnumVARIANTを取得することによってこれを行います。ソース変数がオブジェクトを保持している場合は、このインタフェースの実装が必要です。配列の場合は、VBScriptは実装を動的に作成し、配列がディメンション化されている場合にのみこれを実行できます。ソース変数の中の他のもの(この場合はEmptyなど)はエラーになります。

タイプミスマッチエラーで割り当てが失敗します。

割り当て操作の左側は、常に変種でなければなりません。したがって、単純な割り当てによって、ある動的配列の内容を別の動的配列の内容にコピーすることはできません。

最初のアプローチは合理的ですが、For Eachをクラッシュせずに空の配列を表現する方法が必要です。それは予想通りごとに、何もしないだろう本当の配列が割り当てられている前に、あなたはそれぞれの質問についてはしようとすると今

Function EmptyArray 
EmptyArray = Split("", " ") 
End Function 

Class Survey 
    public ID 
    public Title 
    public Questions 

    Private Sub Class_Initialize 
     Questions = EmptyArray 
    End Sub 
End Class 

- :あなたはこの小さなトリックを使用することができます。また、UBound(EmptyArray)が-1であるため、UBound(Questions)+ 1を使用して正確な質問の数を取得すると、

+0

ありがとうございます、これは今や理にかなっています。 – bendewey

関連する問題