2017-11-02 6 views
0

私はcCavityと呼ばれるカスタムクラスを持っています。クラスの多くのプロパティの1つに、pAdjacencyという文字列配列があります。この配列には、各インデックスのノードの文字列名(FormatはC [#of Node])が含まれています。私はお互いに2つのノード名を使用してエッジ名を作成しようとしています。私がクラスオブジェクトのためにadjacency GET関数を呼び出そうとすると、私はByRef引数型の不一致を得て、なぜ私は見ることができません。クラスGet関数エラーByRef

クラス取得機能:エラーを取得しているコードの

Public Property Get Adjacency(Index As Integer) As String 
    Adjacency = pAdjacency(Index) 
End Property 

章:

Sub CalculateEdges(cCavities() As cCavity, dEdges As Scripting.Dictionary) 
    'Dim i as integer 
    For i = 1 To UBound(cCavities) 
     If cCavities(i).AdjacencySize > MaxEdges Then MaxEdges = cCavities(i).AdjacencySize 
     'Dim j as Integer 
     For j = 1 To cCavities(i).AdjacencySize 
      dEdges.Add cCavities(i).Name & cCavities(i).Adjacency(j), 0 ' The error is taking place here, with the .Adjacency(j) 
     Next j 
    Next i 
End Sub 

問題のエラーは、次のとおりです。 "というエラーコンパイル:ByRefの引数の型の不一致" を

私は明白な何かを欠いていますか引数jは整数でなければなりません。何が起きているのかを把握しようとしている間、明示的にそのように定義しようとしました。

+0

モジュールの上部に 'Option Explicit'を指定し、* all *識別子を明示的な型で宣言します。コードテキストを短くするためにそれらを削除することは、まったく馬鹿げたことです。 –

+0

また、_exactly_がコードに失敗している場合、エラー番号と正確な表現は何ですか? – Excelosaurus

+0

いいえ、私はそれを短くするために、ここにサイトに配置したコードブロックから削除しました。現在、私はそれを動作させるためのさまざまな方法を試しているので、私の最後のソースコードではコメントアウトされています。投稿時にコメントを外していないので、私はそれを含めなかった。 – JustinCoplin

答えて

3

最初にOption Explicitを指定し、すべての変数を宣言してから、パラメータをByValにしてください。オブジェクトポインタと値を渡すことができます。配列はByRefに渡す必要があります。

だから、これで始まる:今すぐ

Public Property Get Adjacency(ByVal Index As Long) As String 
    Adjacency = pAdjacency(Index) 
End Property 

を、4-ライナースニペットがcCavities(i) 5回を参照解除されていること。ローカル変数を導入することを検討しましたが、を一度にデリファレンスしましたか?

For i = LBound(cCavities) To UBound(cCavities) 
    Dim foo As cCavity 
    Set foo = cCavities(i) 
    For j = 1 To foo.AdjacencySize 
     Dim edge As String 
     edge = foo.Name & foo.Adjacency(j) 
    Next 
Next 

今、fooという課題がありますか?その場合は、インテリセンスcCavityメンバーコール、およびより効率的なコードがあります。

+0

私は、固定されているので、後でコード内で(別のセクションがコメントされていて、含まれていない)別のエラーが発生していることを認識しました。私は質問を投稿したときに同じものについて2つの別々のエラーを間違えたが、それ以来私のエラーを認識した。 – JustinCoplin

+0

明示的な宣言を削除することは、**決して**何のための良い修正です。 –

+0

私はその時に気がついたことを単に試していました。私は何を言いたいのか分からない。 – JustinCoplin

1

コンパイルエラーです。実行時エラーではありません。 jがVariantの場合(明示的に宣言されていない場合と同じように)、コンパイラはそれを許さないでしょう。すべての変数を適切な型で宣言します。

:何らかの理由でコンパイラが実行時にこれについて不平を言うだけですが、それでもコンパイルエラーです。

+0

これも私が思ったことです。そのため、最初にIntegerであると明示的に宣言しました。私は、コードのこの特定のスナップショットでそれをコメントアウトしていただけだったので、それは私が投稿をすることを決めた時の方法でした。 – JustinCoplin

+0

ByValは、@ Matのマグカップの答えに従って、違いを生み出します。 VBAの引数はデフォルトでByRefに渡されます。私は気付いていないByValをタイプするのにとても慣れています。 – Excelosaurus