وعليكم السلام ورحمة الله وبركاته ..
مشكلتك أخي الكريم في السطر :-
rsFiltered.Close
والذي يعنيه ان المتغير لم يتم تنفيذ الجملة :-
Set rsFiltered = rs.OpenRecordset
عليه في بعض الحالات ؛ وبالتالي بقيت قيمته = لا شيء = Nothing . ففي كودك وتحديداً ، إذا كان rs فارغاً ، فإنه لن يدخل في هذا الشرط :-
If Not rs.BOF And Not rs.EOF Then
وعليه ، فأني اقترح عليك استبدال هذا الجزء :-
rsFiltered.Close
rs.Close
'Sets objects to nothing
Set rsFiltered = Nothing
Set rs = Nothing
Set db = Nothing
الموجود في الدالة Private Sub LoadArray ، بهذا الجزء البسيط :-
If Not rsFiltered Is Nothing Then
rsFiltered.Close
Set rsFiltered = Nothing
End If
If Not rs Is Nothing Then
rs.Close
Set rs = Nothing
End If
Set db = Nothing
ولكن الأفضل تعديل الحلقة أيضاً ، لأنك تقوم بإنشاء rsFiltered عدة مرات داخل الحلقة :-
Set rsFiltered = rs.OpenRecordset
وأعتقد أيضاً أن الأفضل إغلاقه بعد الانتهاء منه مباشرة ، وليس انتظار نهاية الإجراء . وبالتالي تعديلي على الدالة كاملة سيكون بهذا الشكل :-
Private Sub LoadArray()
'-------------------------------------------------------- '----------------- '---------------
'---------------- '----------------
'--------------- '---------------
'-------------------------------------------------------- '----------
'This procedure loads text into the 3rd column of the array
'--------------------------------------------------------
'--------------------------------------------------------
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim rsFiltered As DAO.Recordset
Dim strSQL As String
Dim i As Integer
strSQL = "SELECT tblData.ID, tblData.[No], tblData.Name, tblData.Stae, tblData.Day, tblData.Date, tblData.Phone, tblData.Village, tblData.Waitingplace, tblData.Subject,tblData.Presence,tblData.Notes " _
& "FROM tblData; "
'Debug.Print strSQL
Set db = CurrentDb
Set rs = db.OpenRecordset(strSQL)
'This line ensures that the recordset is populated
If Not rs.BOF And Not rs.EOF Then
'Loops through the array using dates for the filter
For i = LBound(myArray) To UBound(myArray)
'Checks whether the 2nd element of the array = True
If myArray(i, 1) Then
'Filter recordset with array dates
rs.Filter = "[Date] = " & myArray(i, 0)
'Open up new recordset based on filter
Set rsFiltered = rs.OpenRecordset
'Loop through new recordset
Do While (Not rsFiltered.EOF)
'Adds text to the 3rd column of the array
myArray(i, 2) = myArray(i, 2) & vbNewLine _
& rsFiltered!No & " / " _
& rsFiltered!Village & " / " _
& rsFiltered!Notes
rsFiltered.MoveNext
Loop
rsFiltered.Close
Set rsFiltered = Nothing
End If
'Debug.Print myArray(i, 2)
Next i
End If
If Not rs Is Nothing Then
rs.Close
Set rs = Nothing
End If
'Sets objects to nothing
Set db = Nothing
End Sub
وأيضاً كملاحظة مهمة . يوجد احتمال آخر يتعلق بالحقل [Date] وهو للعلم حقل مخالف لقواعد آكسيس حيث ان الإسم محجوز لآكسيس ، وبالتالي قد يسبب لك هذا مستقبلاً مشاكل كبيرة إذا كان يحتوي على وقت بالإضافة إلى التاريخ ؛ عندها المقارنة = قد لا تجد السجلات المتوقعة . ومثله اعتقد في الحقل Day .. حيث ان هذه الأسماء محجوزة لأوامر آكسيس .
جرب هذه التعديلات بيدك ، وأخبرني بالنتيجة .