【问题标题】:Run-time error 3265: Item not found in this collection运行时错误 3265:在此集合中找不到项目
【发布时间】:2020-11-06 06:23:14
【问题描述】:

我不断收到此“运行时错误'3265':在此集合中找不到项目。”错误信息。

它出现的行是:If rs!Borings.[Custom Sampling Method] = False Then,这是被引用字段的第一个实例,所以这让我想知道 SQL 是否正确添加到字符串中。但是我将字符串打印到立即窗口,它说:

SELECT Borings.ProjectID, Borings.BoringID, Borings.HoleDepth, Samples.BoringID,
     Samples.Number, Samples.Depth, Samples.Length, Borings.[Continuous To], 
     Borings.[Every Other], Borings.[Sample Length], 
     Borings.[Custom Sampling Method] 
FROM Borings LEFT JOIN Samples ON Borings.BoringID = Samples.BoringID 
   WHERE Borings.ProjectID = 462

在我看来是正确的.. 是错的吗?我想知道最后的值是否应该用引号引起来?

如果我改为尝试使用Set rs = db.OpenRecordset("qryAddSamples"),则该方法不起作用。我最终得到一个不同的运行时错误“3061”参数太少。预期 1。我不知道那是什么意思。

为了理解代码应该做什么,它应该根据钻孔表中的采样信息为当前加载的项目的每个钻孔生成土壤样本。

Option Compare Database

Dim db As DAO.Database
Dim rs As DAO.Recordset


Private Sub Update_Samples_Click()

    DoCmd.RunCommand acCmdSaveRecord

    Dim strSQL As String
    Dim sampleDepth As Integer
    Dim sampleNumber As Integer
    
    strSQL = "SELECT Borings.ProjectID, Borings.BoringID, Borings.HoleDepth, Samples.BoringID, " & _
             "Samples.Number, Samples.Depth, Samples.Length, Borings.[Continuous To], " & _
             "Borings.[Every Other], Borings.[Sample Length], Borings.[Custom Sampling Method] " & _
             "FROM Borings LEFT JOIN Samples ON Borings.BoringID = Samples.BoringID " & _
             "WHERE Borings.ProjectID = " & [TempVars]![tmpProjectID]
        
    Debug.Print strSQL
        
    Set db = CurrentDb
    Set rs = db.OpenRecordset(strSQL)

    sampleDepth = 0
    sampleNumber = 1
    
    Do While Not rs.EOF
        
        If rs!Borings.[Custom Sampling Method] = False Then

        Do While sampleDepth + rs!Borings.[Sample Length] <= rs!Borings.[Continuous To]

        rs.AddNew
        AddSamples
        
        sampleNumber = sampleNumber + 1
        sampleDepth = sampleDepth + rs!Samples.[Length]
       
        Loop
        
        Do While sampleDepth + rs!Borings.[Sample Length] <= rs!Borings.HoleDepth
        
        rs.AddNew
        AddSamples
        
        sampleNumber = sampleNumber + 1
        sampleDepth = sampleDepth + rs!Borings.[Every Other]

        Loop
        
        End If

        rs.MoveNext

    Loop
    
    rs.Close
    
    Set rs = Nothing
    Set db = Nothing
    
    DoCmd.Close
    DoCmd.OpenForm "Main"

End Sub

Private Sub AddSamples()
        rs!Samples.[BoringID] = rs!Borings.BoringID
        rs!Samples.[Sample Number] = sampleNumber
        rs!Samples.[Depth] = sampleDepth
        rs!Samples.[Length] = rs!Borings.[Sample Length]
        rs.Update
End Sub

【问题讨论】:

  • 不相关,但使用Option Explicit,因此拼写错误不会创建新变量,并且Long而不是Integer,因为无论如何16位整数在内存中都是32位长整数,并且会发生静默转换。

标签: vba ms-access runtime-error recordset


【解决方案1】:

尝试使用属性 Value 更具体,因为rs!SomeField 是一个字段对象。 另外,在不需要的地方省略表名:

    Do While Not rs.EOF
        
        If rs![Custom Sampling Method].Value = False Then

            Do While sampleDepth + rs![Sample Length].Value <= rs![Continuous To].Value

                rs.AddNew
                AddSamples
                
                sampleNumber = sampleNumber + 1
                sampleDepth = sampleDepth + rs!Length.Value
        
            Loop
            
            Do While sampleDepth + rs![Sample Length].Value <= rs!HoleDepth.Value
            
                rs.AddNew
                AddSamples
                
                sampleNumber = sampleNumber + 1
                sampleDepth = sampleDepth + rs![Every Other].Value

            Loop
        
        End If

        rs.MoveNext

    Loop

【讨论】:

  • 谢谢!这有很大帮助。我按照你和@Nacorid 所说的做了,但现在我遇到了一个新错误。当它到达 AddSample 子例程中的 rs![Sample Number].Value = sampleNumber 行时,它突出显示 sampleNumber 并且错误显示为编译错误。变量未定义。
【解决方案2】:

我无法将bBoringID 的值分配给记录集中的sBoringID 字段。当它向 Samples 表添加新样本时,它需要从 Borings 表中获取当前的 bBoringID 并将其分配给 Samples 表中的 sBoringID。每当它到达 rs!sBoringID.Value = rs!bBoringID.Value 行时,我都会收到“运行时错误 3162:您试图将 Null 值分配给不是 Variant 数据类型的变量”错误。

但是,值正在正确地打印到即时窗口,除了值的前面和末尾有一个空格。但是当我将鼠标悬停在变量上时的标题和变量的手表都显示为 Null。

Dim db As DAO.Database
Dim rs As DAO.Recordset


Private Sub Update_Samples_Click()

    DoCmd.RunCommand acCmdSaveRecord
    
    Dim strSQL As String
    Dim sampleDepth As Long
    Dim sampleNumber As Long

    strSQL = "SELECT Borings.ProjectID, Borings.BoringID as bBoringID, Borings.HoleDepth, " & _
             "Samples.BoringID as sBoringID, Samples.Number, Samples.Depth, Samples.Length, " & _
             "Borings.[Continuous To], Borings.[Every Other], Borings.[Sample Length], " & _
             "Borings.[Custom Sampling Method] " & _
             "FROM Borings LEFT JOIN Samples ON Borings.BoringID = Samples.BoringID " & _
             "WHERE Borings.ProjectID = " & [TempVars]![tmpProjectID]
    
    Set db = CurrentDb
    Set rs = db.OpenRecordset(strSQL)
    rs.MoveFirst
    
    Debug.Print strSQL
    Debug.Print rs!ProjectID.Value                  'Borings Table
    Debug.Print rs!bBoringID.Value                  'Borings Table
    Debug.Print rs!HoleDepth.Value                  'Borings Table
    Debug.Print rs![Continuous To].Value            'Borings Table
    Debug.Print rs![Every Other].Value              'Borings Table
    Debug.Print rs![Sample Length].Value            'Borings Table
    Debug.Print rs![Custom Sampling Method].Value   'Borings Table
    Debug.Print rs!sBoringID.Value                  'Samples Table
    Debug.Print rs!Number.Value                     'Samples Table
    Debug.Print rs!Depth.Value                      'Samples Table
    Debug.Print rs!Length.Value                     'Samples Table
    Debug.Print [TempVars]![tmpProjectID]

    sampleDepth = 0
    sampleNumber = 1
    
    Do While Not rs.EOF
        
        If rs![Custom Sampling Method].Value = False Then

        Do While sampleDepth + rs![Sample Length].Value <= rs![Continuous To].Value

                  rs.AddNew
>>this line >>    rs!sBoringID.Value = rs!bBoringID.Value
                  rs![Sample Number].Value = sampleNumber
                  rs!Depth.Value = sampleDepth
                  rs!Length.Value = rs![Sample Length].Value
                  rs.Update
Immediate window output:
SELECT Borings.ProjectID, Borings.BoringID as bBoringID, Borings.HoleDepth, Samples.BoringID as sBoringID, Samples.Number, Samples.Depth, Samples.Length, Borings.[Continuous To], Borings.[Every Other], Borings.[Sample Length], Borings.[Custom Sampling Method] FROM Borings LEFT JOIN Samples ON Borings.BoringID = Samples.BoringID WHERE Borings.ProjectID = 462
 462    'Why is there a space before and after all these integer values?
 848    'Why is there a space before and after all these integer values? 
 60     'Why is there a space before and after all these integer values?
 10     'Why is there a space before and after all these integer values?
 5      'Why is there a space before and after all these integer values?
 2      'Why is there a space before and after all these integer values?
False
Null
Null
Null
Null
462

【讨论】:

    【解决方案3】:

    没关系,经过更多研究,我修复了它。由于bBoringID 是 Borings 表中的自动编号,因此我不需要将其输入到 Samples 表中。 Access 将自动在 Samples 表中输入相同的键值。我删除了rs!sBoringID.Value = rs!bBoringID.Value,我终于看到了其他 rs! 字段中的所有值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多