Ошибка 3265 во время выполнения: элемент не найден в этой коллекции

#vba #ms-access #runtime-error #recordset

#vba #ms-access #время выполнения-ошибка #набор записей

Вопрос:

Я продолжаю получать эту «ошибку времени выполнения ‘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, " amp; _
             "Samples.Number, Samples.Depth, Samples.Length, Borings.[Continuous To], " amp; _
             "Borings.[Every Other], Borings.[Sample Length], Borings.[Custom Sampling Method] " amp; _
             "FROM Borings LEFT JOIN Samples ON Borings.BoringID = Samples.BoringID " amp; _
             "WHERE Borings.ProjectID = " amp; [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
  

Комментарии:

1. Не связано, но используется Option Explicit , поэтому опечатки не создают новых переменных, а Long вместо Integer 16-битных целых чисел в памяти все равно остаются 32-битные длины, и происходит автоматическое преобразование.

Ответ №1:

Попробуйте быть более конкретным, используя значение свойства как 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
  

Комментарии:

1. Спасибо! Это очень помогло. Я сделал то, что сказали вы и @Nacorid, но теперь у меня новая ошибка. Когда он попадает в rs![Sample Number].Value = sampleNumber строку в подпрограмме AddSample, он выделяется sampleNumber , и ошибка говорит об ошибке компиляции. Переменная не определена.

Ответ №2:

У меня возникли проблемы с присвоением значения bBoringID sBoringID полю в наборе записей. Поскольку он добавляет новые образцы в таблицу Samples, ему необходимо взять ток bBoringID из таблицы Borings и назначить его sBoringID в таблице Samples. Всякий раз, когда он попадает в 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, " amp; _
             "Samples.BoringID as sBoringID, Samples.Number, Samples.Depth, Samples.Length, " amp; _
             "Borings.[Continuous To], Borings.[Every Other], Borings.[Sample Length], " amp; _
             "Borings.[Custom Sampling Method] " amp; _
             "FROM Borings LEFT JOIN Samples ON Borings.BoringID = Samples.BoringID " amp; _
             "WHERE Borings.ProjectID = " amp; [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!поля.