2017-02-14 6 views
2

次の問題は私には難解です。私は複数の入力に基づいて、特定の列の列インデックス提供する関数を作成した:Excel VBA:要素がループに格納されていません

  1. アレイ(列ヘッダーの範囲)を
  2. データ要素(整数)の数
  3. アン選択された列名の配列
  4. 結果を保持してサブに戻すための配列。
  5. カウンタ(グローバル)明らか

、ここでの意図は、オフセット及び追加処理のために他の機能およびルーチンに列インデックスを通過させることです。

機能自体は機能していますが、2番目のデータ要素では機能していません。 Kは適切なインデックスで記録されますが、配列に渡されません。私がここに欠けているものはありますか?

Public Function getIndex(ByRef all_names As Variant, ByVal Elements As Integer, check_names() As Variant, resultindex() As Variant) As Variant 
    ReDim resultindex(1 To Elements) 
    For i = LBound(all_names) To UBound(all_names) 
     For j = 1 To Elements 
      For k = LBound(all_names, 2) To UBound(all_names, 2) 
       If all_names(i, k) = check_names(j) Then         ' checks colName against dynamic names 
        resultindex(j) = k              ' colIndex takes index of selected column 
        Debug.Print resultindex(j) 
'     k = UBound(all_names, 2)            ' Jump to end? 
       End If 
      Next k 
     Next j 
    Next i 
End Function 

第2要素が格納されていない特定の理由はありますか?私はいくつかの異なる入力でこれを試し、同じ結果を達成しました。ネストされたループをうまく使っている人には、これについて正しい方向にうなずきます。ありがとう。

編集:それは直接のウィンドウで動作しているようです。適切なインデックスは期待通りに邪魔されていますが、2番目の要素は渡されていません。

値が渡されたことを確認:

results(i) = getIndex(subArray(), Elements, selNames(), results()) 
colIndex() = results() 

For i = 1 To Elements 
    Debug.Print colIndex(i) 
Next i 
Erase result 
+0

のようにそれを呼び出しますか'? – Slai

+2

VBAは "return"ステートメントを持つ多くの一般的な言語に比べて少し奇妙です。 VBAは、関数と同じ名前の自動変数を作成します。この変数に代入するものが返されます。関数が終了する直前(配列 'resultindex'を返すと仮定します)に、' getIndex = resultIndex'という行を追加します。 – Blackhawk

+0

ああ、私は参照しているので、参考のために戻ってきています... – Blackhawk

答えて

3

あなたの関数に戻り値を代入することはありません。結果を保持するためにresultindexByRefパラメータとして使用しているようです。両方を行う必要はありません。

リファクタリング、)

Public Function getIndex(_ 
    ByRef all_names As Variant, _ 
    ByVal Elements As Integer, _ 
    check_names() As Variant) As Variant 

    Dim i As Long, j As Long, k As Long 
    Dim resultindex() As Variant 
    ReDim resultindex(1 To Elements) 
    For i = LBound(all_names) To UBound(all_names) 
    For j = 1 To Elements 
     For k = LBound(all_names, 2) To UBound(all_names, 2) 
      If all_names(i, k) = check_names(j) Then         ' checks colName against dynamic names 
       resultindex(j) = k              ' colIndex takes index of selected column 
       Debug.Print resultindex(j) 
       Exit For 
      End If 
     Next k 
    Next j, i 
    getIndex = resultindex 
End Function 

を試してみて、多分 `、ByRefのresultindexバリアントとしてこの

results = getIndex(subArray(), Elements, selNames()) 

For i = 1 To Elements 
    Debug.Print results(i) 
Next i 
関連する問題