2012-02-08 19 views
0

今朝から私はVBA(Excel 2003)で奇妙な動作を経験しています。ここでコレクションには文字列が格納されません

コードです:今

Sub TestCollection() 

Dim i As Single, col As New Collection 
Dim vArr(1 To 3) As String 

'For i = LBound(vArr) To UBound(vArr) 
' vArr(i) = Sheets("Sheet2").Cells(1, i) 
'Next i 

vArr(1) = "String 1" 
vArr(2) = "String 2" 
vArr(3) = "String 3" 

For i = LBound(vArr) To UBound(vArr) 
    Debug.Print vArr(i) 
    col.Add i, vArr(i) 
    Debug.Print col(i) 
Next i 

End Sub 

、私は私のコレクションは、(例えばローカルウィンドウ内)のような項目/キーのペアで満たされることを期待したい:

Item 1 -> "String 1" 
Item 2 -> "String 2" 
Item 3 -> "String 3" 

残念ながら私

Item 1 -> 1 
Item 2 -> 2 
Item 3 -> 3 

誰もがコレクションに文字列を保存しない理由を誰かが知っていますかキー値として?

答えて

1

コードを正しく読んでいる場合は、たとえばString 1ではなく、iの値をキーにしたいと思うようです。もしそうなら、私はあなたがちょうど彼らのインデックスでアイテムを検索、これはあなたの実際のデータでは動作しないことがあり

vArr(1) = "String 1" 
vArr(2) = "String 2" 
vArr(3) = "String 3" 

For i = LBound(vArr) To UBound(vArr) 
    col.Add vArr(i) 
    Sheet1.Cells(1, i) = col.Item(i) 
Next i 

だろう簡単な方法与えられた例に基づいて

vArr(1) = "String 1" 
vArr(2) = "String 2" 
vArr(3) = "String 3" 

For i = LBound(vArr) To UBound(vArr) 
    col.Add vArr(i), CStr(i) 
    Sheet1.Cells(1, i) = col.Item(i) 
Next i 

をしようとお勧めします。

編集: 私はこのコードを使用して、列名に基づいて列番号を検索することができます

Dim i As Single, col As New Collection 
Dim vArr(1 To 3) As String 

vArr(1) = "Column 1" 
vArr(2) = "Column 2" 
vArr(3) = "Column 3" 

For i = LBound(vArr) To UBound(vArr) 
    col.Add i, vArr(i) 
Next i 

For i = LBound(vArr) To UBound(vArr) 
    Dim columnNumber As Integer 
    columnNumber = col("Column 2") 
    Sheet1.Cells(1, columnNumber).Value = "Found it" 
Next i 
+0

おかげhuel、私は本当にここで何かを見逃しているかもしれません... 'col.Add vArr(i)'は実際に動作しますが、インデックス番号を 'i'で制御したいと思っていました。この例は、最後のコードサンプルの[link](http://www.dailydoseofexcel.com/archives/2011/12/26/populating-class-properties/)にあります: 'With tbl.HeaderRowRange: For i = 1 To .Count:col.Add i、.Columns(i):Next:End With ' – Davide

+0

リンク@Davideをありがとう。列インデックスを参照するキーとして列ヘッダーを使用しているようです。私の最初のコードブロックでは、 'col.Add vArr(i)、CStr(i)'を使用しました。列インデックスをキーとして使用することができます(文字列に変換した後)。これはあなたが望むものに近いでしょうか? – huel

+0

私は何をしようとしていたのか、同じコードが昨日働いていることを誓うことができます。残念ながら、String値が分かっているので、列ヘッダーが必要ですが、列の位置が変わることがあります。対応するキーを使用してコレクションインデックスを取得する他の方法?これまでの助けてくれてありがとう。 – Davide

0

簡単な説明:アイテム、キーというより:コレクションの Addメソッドは、順序でパラメータを望んでいます:キー、項目。 http://msdn.microsoft.com/en-us/library/f26wd2e5.aspx

+0

MiloNCありがとうございますが、これはiが数字(インデックス)で、vArr(i)に文字列値(Key)が含まれている 'col.Add i、vArr(i) – Davide

+0

@Davide:私はあなたがMiloNCに記載された順序でそれをやっていないと思います。コードをもう一度読んでください:私にとっては、それは 'col.Add vArr(i)、i'でなければなりません。 –

+0

@iDevlop:私はMiloNCの提案を理解していると思いますが、' i'はInt/Single valueと 'vArr(i)'は文字列を含んでいるため、String型のItem Indexを与えると型の不一致エラーが発生します。 – Davide

0

これは私があなたの元のコードになるだろう唯一の編集です::キーは文字列でなければなりません

col.Add vArr(i), CStr(vArr(i)) 
0

は項目がすることができますが、私はその情報を得たのはここ

ですint、string、またはおそらく任意のオブジェクトです。 あなたはキーが、ちょうどそれらを投げ、ジェリーボーケールの提案に似て、むしろ「項目1」などよりも簡単な整数、にしたい場合:

col.Add vArr(i), CStr(i) 
関連する問題