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でも可能ですか?

4

2 に答える 2

2

名前が変数に格納されているフィールドの値を参照する場合は、myKeyこれを使用します...

myR.Fields(myKey)

これは、レコードセットがDAOオブジェクトであるかADOオブジェクトであるかに関係なく機能します。

エラー3265「このコレクションにアイテムが見つかりません」は、配列に関する苦情ではありません。これは、レコードセットにリテラル名が「myKey」であるフィールドがないことを示しています。おそらく、このコードはそれをより明確にするでしょう。書かれているようにエラーなしで動作します。最初の2Debug.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
于 2012-05-08T14:35:48.877 に答える
0

ここで何をしようとしているのかわからない。「key1」はフィールド名ですか、それとも値ですか。myR![myKey]と書くとき、myKeyはフィールド名です。

値であると想定されている場合は、エラーが発生します。たとえば、「key1」、「key2」、「key3」が従業員ID番号(たとえば、10、20、および30)である場合、IsNull(myR![10])に質問することを試みましたが、 10というフィールドは、エラーになります。

お役に立てれば。

于 2012-05-08T14:30:57.753 に答える