2012-05-08 18 views
1

私はこの小さなVBAスクリプトをAccessデータベースに持っています。私がやりたいと思ういくつかのフィールド比較があります。他の言語では、私はキーの配列を作成し、for..eachループを使って各キーをテストすることができます。このような何か:レコードセットのキーとして文字列の配列を使用できますか?

string[] myKeys = { "key1", "key2", "key3" }; 
foreach(string myKey in myKeys) 
{ 
    if(myRecordset!myKey == myTable!myKey) DoSomething() 
} 

私はVBAでこれを試してみましたが、それは私に実行時エラー「3265」を与える:次のコードを使用している場合、このコレクションに見つかりませんアイテム:

For Each myKey In myKeys 
    If Not IsNull(myR![myKey]) Then Me.Recordset![myKey] = myR![myKey] 
Next myKey 

は何ですか私はVBAでも可能なことをしようとしていますか?

答えて

2

お名前あなたの変数myKeyに保存されているフィールドの値を参照したい場合は、これを使用...あなたのレコードセットがDAOやADOオブジェクトであるかどうかを

myR.Fields(myKey) 

に動作します。

エラー3265、 "このコレクションにアイテムが見つかりません"というエラーは、アレイに関する苦情ではありません。あなたのレコードセットには、文字通りの名前が "myKey"のフィールドがないことを伝えています。おそらく、このコードはそれをより明確にするでしょう。それは書かれているようにエラーなく動作します。最初の2つのDebug.Print行のいずれかが、私はそれがしたいので、これは正確に動作し、エラー3265

Public Sub foo() 
    Const myKey As String = "id" 
    Dim db As DAO.Database 
    Dim rs As DAO.Recordset 
    Dim strSelect As String 
    strSelect = "SELECT id FROM MyTable;" 
    Set db = CurrentDb 
    Set rs = db.OpenRecordset(strSelect) 
    'Debug.Print rs![myKey] 
    'Debug.Print rs!myKey 
    Debug.Print rs.Fields(myKey) 
    rs.Close 
    Set rs = Nothing 
    Set db = Nothing 
End Sub 
+0

をトリガするコメント解除。ありがとう。それが何であるかを明示的に知っていない限り、Fieldsに関する情報はあまりないようです。これはVBAであらゆるタイプのプログラミングを行うのは初めてのことですが、実際には他の言語とは大きく異なります。 –

+0

VBAはいくらか使い慣れています。 :-) 'myR'が' DAO.Recorset'の場合、コードに 'myR.'と入力して、Intellisenseに利用可能なメソッドとプロパティを表示させます。もしそれが 'ADODB.Recordset'であり、Microsoft ActiveX Data Objectsのリファレンスを設定していれば、同じことができます。 – HansUp

0

ここで何をしようとしているのかよく分かりません。 "key1"はフィールド名か値ですか? myR![myKey]を記述すると、myKeyはフィールド名になります。

値でなければエラーが発生します。たとえば、「key1」、「key2」、「key3」が従業員ID番号(たとえば10,20、& 30)である場合、IsNull(myR![10])に質問したことがあります。フィールドは10と呼ばれ、エラーが発生します。

これが役に立ちます。

関連する問題