- Remove From My Forums
-
General discussion
-
Yes it matters.
And it is not only a programmers fault.
Once again I had this problem today :- deleted all records in a subform
- jumped to another record in mainform
- because of a couple of conditions most controls in the subform were disabled (via VBA)
- additional AllowAdditions and AllowEdits in the subform were set to FALSE (via VBA)
- Access showed Error 3021
The workarround for this «special appearance» of error 3021 was :
- calling the Requery() — method of the subform after disabling controls and setting Allow—-props.
additional remarks :
- The error only shows up if I delete the records before
- the subform is linked via Masterfields/Childfields
Best regards,
dp.dedicated to all victims of 3021
-
Edited by
Wednesday, May 8, 2013 8:25 AM
- Remove From My Forums
-
General discussion
-
Yes it matters.
And it is not only a programmers fault.
Once again I had this problem today :- deleted all records in a subform
- jumped to another record in mainform
- because of a couple of conditions most controls in the subform were disabled (via VBA)
- additional AllowAdditions and AllowEdits in the subform were set to FALSE (via VBA)
- Access showed Error 3021
The workarround for this «special appearance» of error 3021 was :
- calling the Requery() — method of the subform after disabling controls and setting Allow—-props.
additional remarks :
- The error only shows up if I delete the records before
- the subform is linked via Masterfields/Childfields
Best regards,
dp.dedicated to all victims of 3021
-
Edited by
Wednesday, May 8, 2013 8:25 AM
Номер ошибки: | Ошибка 3021 | |
Название ошибки: | Microsoft Access Error 3021 | |
Описание ошибки: | No current record. | |
Разработчик: | Microsoft Corporation | |
Программное обеспечение: | Microsoft Access | |
Относится к: | Windows XP, Vista, 7, 8, 10, 11 |
Объяснение «Microsoft Access Error 3021»
«Microsoft Access Error 3021» также считается ошибкой во время выполнения (ошибкой). Когда дело доходит до программного обеспечения, как Microsoft Access, инженеры могут использовать различные инструменты, чтобы попытаться сорвать эти ошибки как можно скорее. Ошибки, такие как ошибка 3021, иногда удаляются из отчетов, оставляя проблему остается нерешенной в программном обеспечении.
Ошибка 3021 может столкнуться с пользователями Microsoft Access, если они регулярно используют программу, также рассматривается как «No current record.». Когда появится ошибка, пользователи компьютеров смогут уведомить разработчика о наличии ошибки 3021 через отчеты об ошибках. Затем Microsoft Corporation нужно будет исправить эти ошибки в главном исходном коде и предоставить модифицированную версию для загрузки. Эта ситуация происходит из-за обновления программного обеспечения Microsoft Access является одним из решений ошибок 3021 ошибок и других проблем.
Почему происходит ошибка времени выполнения 3021?
Сбой во время запуска Microsoft Access или во время выполнения, как правило, когда вы столкнетесь с «Microsoft Access Error 3021». Вот три наиболее заметные причины ошибки ошибки 3021 во время выполнения происходят:
Ошибка 3021 Crash — Ошибка 3021 остановит компьютер от выполнения обычной программной операции. Это происходит много, когда продукт (Microsoft Access) или компьютер не может обрабатывать уникальные входные данные.
Утечка памяти «Microsoft Access Error 3021» — последствия утечки памяти Microsoft Access связаны с неисправной операционной системой. Потенциальные триггеры могут быть «бесконечным циклом», или когда программа выполняет «цикл» или повторение снова и снова.
Ошибка 3021 Logic Error — Компьютерная система создает неверную информацию или дает другой результат, даже если входные данные являются точными. Обычные причины этой проблемы связаны с ошибками в обработке данных.
Большинство ошибок Microsoft Access Error 3021 являются результатом отсутствия или повреждения версии файла, установленного Microsoft Access. Как правило, решить проблему можно заменой файла Microsoft Corporation. Кроме того, некоторые ошибки Microsoft Access Error 3021 могут возникать по причине наличия неправильных ссылок на реестр. По этой причине для очистки недействительных записей рекомендуется выполнить сканирование реестра.
Распространенные сообщения об ошибках в Microsoft Access Error 3021
Обнаруженные проблемы Microsoft Access Error 3021 с Microsoft Access включают:
- «Ошибка программы Microsoft Access Error 3021. «
- «Ошибка программного обеспечения Win32: Microsoft Access Error 3021»
- «Microsoft Access Error 3021 должен быть закрыт. «
- «Файл Microsoft Access Error 3021 не найден.»
- «Microsoft Access Error 3021 не может быть найден. «
- «Проблема при запуске приложения: Microsoft Access Error 3021. «
- «Файл Microsoft Access Error 3021 не запущен.»
- «Ошибка Microsoft Access Error 3021. «
- «Ошибка пути программного обеспечения: Microsoft Access Error 3021. «
Обычно ошибки Microsoft Access Error 3021 с Microsoft Access возникают во время запуска или завершения работы, в то время как программы, связанные с Microsoft Access Error 3021, выполняются, или редко во время последовательности обновления ОС. Запись ошибок Microsoft Access Error 3021 внутри Microsoft Access имеет решающее значение для обнаружения неисправностей электронной Windows и ретрансляции обратно в Microsoft Corporation для параметров ремонта.
Создатели Microsoft Access Error 3021 Трудности
Проблемы Microsoft Access Error 3021 могут быть отнесены к поврежденным или отсутствующим файлам, содержащим ошибки записям реестра, связанным с Microsoft Access Error 3021, или к вирусам / вредоносному ПО.
В частности, проблемы с Microsoft Access Error 3021, вызванные:
- Недопустимый Microsoft Access Error 3021 или поврежденный раздел реестра.
- Вирус или вредоносное ПО, повреждающее Microsoft Access Error 3021.
- Microsoft Access Error 3021 ошибочно удален или злонамеренно программным обеспечением, не связанным с приложением Microsoft Access.
- Microsoft Access Error 3021 конфликтует с другой программой (общим файлом).
- Microsoft Access (Microsoft Access Error 3021) поврежден во время загрузки или установки.
Продукт Solvusoft
Загрузка
WinThruster 2022 — Проверьте свой компьютер на наличие ошибок.
Совместима с Windows 2000, XP, Vista, 7, 8, 10 и 11
Установить необязательные продукты — WinThruster (Solvusoft) | Лицензия | Политика защиты личных сведений | Условия | Удаление
I am trying to export multiple datasets to the respective new Excel file.
Public Sub MultipleQueries()
Dim i As Integer
Dim Mailer As Database
Dim rs1 As Recordset
Dim rs2 As Recordset
Dim qdf As QueryDef
Set Mailer = CurrentDb
Set rs1 = Mailer.OpenRecordset("MailerData")
Set qdf = Mailer.CreateQueryDef("CCspl", "PARAMETERS CostCentre Text ( 255 );SELECT MonthlyFteData.CostCentre, MonthlyFteData.EmpName, MonthlyFteData.Workload FROM MonthlyFteData WHERE (((MonthlyFteData.CostCentre)=[CostCentre]))")
For i = 0 To rs1.RecordCount - 1
qdf.Parameters("CostCentre") = rs1.Fields("CostCentre")
Dim oExcel As Object
Dim oBook As Object
Dim oSheet As Object
Set oExcel = CreateObject("Excel.Application")
Set oBook = oExcel.Workbooks.Add
Set oSheet = oBook.Worksheets(1)
Set rs2 = qdf.OpenRecordset()
With rs2
oSheet.Range("A2").CopyFromRecordset rs2
oBook.SaveAs "C:Users807140Downloads" & rs2.Fields("CostCentre") & ".xlsx"
rs2.Close
oExcel.Quit
Set oExcel = Nothing
End With
rs1.MoveNext
Next i
qdf.Close
Set qdf = Nothing
rs1.Close
End Sub
But I get the Runtime Error 3021 — No Current Record
I substituted the
oSheet.Range("A2").CopyFromRecordset rs2
oBook.SaveAs "C:Users807140Downloads" & rs2.Fields("CostCentre") & ".xlsx"
with
Debug.Print .RecordCount
And I do actually get the appropriate record count for rs2.
How can I fix my code to eliminate the error?
asked Jul 28, 2016 at 16:27
2
Don’t use For..Next
loops with Recordsets. Use this:
Do While Not rs1.EOF
' do stuff with rs1
rs1.MoveNext
Loop
rs1.close
And as Ryan wrote, Dim
don’t belong into any loop, move them to the start of the sub.
If this doesn’t help, please tell us on which line the error occurs.
answered Jul 28, 2016 at 16:45
AndreAndre
25.9k6 gold badges34 silver badges78 bronze badges
1
The 3021 error («No current record.») occurs at the second of these two lines:
oSheet.Range("A2").CopyFromRecordset rs2
oBook.SaveAs "C:Users807140Downloads" & rs2.Fields("CostCentre") & ".xlsx"
That happens because the rs2
recordset pointer is at EOF
after you do CopyFromRecordset rs2
. Then at SaveAs
, you ask for rs2.Fields("CostCentre")
, but there is no available record («no current record») when the recordset pointer is at EOF
.
However the rs1.Fields("CostCentre")
value you used as the query parameter when opening rs2
is still accessible. So you can make the error go away by asking for rs1.Fields("CostCentre")
instead of rs2.Fields("CostCentre")
oBook.SaveAs "C:Users807140Downloads" & rs1.Fields("CostCentre") & ".xlsx"
answered Jul 28, 2016 at 20:50
HansUpHansUp
95.4k11 gold badges75 silver badges135 bronze badges
1
This code has a few issues pointed out by @Andre and Ryan.
You’re not reusing your Excel object, you’re re-dimming objects that should only be defined once, using a With that never gets referenced so it just adds to code with no benefit.
You’re also creating a parameter query on the fly in code — instead of creating it in SQL and saving it to be reused by name.
You can try this rewritten code and see if it works better for you. I do believe that a predefined query is the better way to go — and then I’d close the query inside the loop and reset it at the start each time. I’ve just seen weird stuff happen when querydefs are reused inside loops without resetting them.
Anyways give this a try — and report on specific line that causes error
Public Sub MultipleQueries()
Dim i As Integer
Dim Mailer As Database
Dim rs1 As Recordset
Dim rs2 As Recordset
Dim qdf As QueryDef
Dim oExcel As Object
Dim oBook As Object
Dim oSheet As Object
' Only Open and Close Excel once
Set oExcel = CreateObject("Excel.Application")
Set Mailer = CurrentDb
Set rs1 = Mailer.OpenRecordset("MailerData")
' Ideally you'd put this create query ahead of time instead of dynamically
Set qdf = Mailer.CreateQueryDef("CCspl", "PARAMETERS CostCentre Text ( 255 );SELECT MonthlyFteData.CostCentre, MonthlyFteData.EmpName, MonthlyFteData.Workload FROM MonthlyFteData WHERE (((MonthlyFteData.CostCentre)=[CostCentre]))")
Do Until rs1.EOF
' Sometimes weird things happen when you reuse querydef with new parameters
qdf.Parameters("CostCentre") = rs1.Fields("CostCentre")
Set rs2 = qdf.OpenRecordset()
If Not rs2.EOF Then
Set oBook = oExcel.Workbooks.Add
Set oSheet = oBook.Worksheets(1)
oSheet.Range("A2").CopyFromRecordset rs2
oBook.SaveAs "C:Users807140Downloads" & rs2.Fields("CostCentre") & ".xlsx"
Else
Msgbox "No Data Found for: " & rs1.Fields("CostCentre")
Exit Do
End If
rs2.Close
Set rs2 = Nothing
Set oBook = Nothing
Set oSheet = Nothing
rs1.MoveNext
Loop
oExcel.Quit
qdf.Close
rs1.Close
Mailer.Close
Set qdf = Nothing
Set rs1 = Nothing
Set Mailer = Nothing
' Remove Excel references
Set oBook = Nothing
Set oSheet = Nothing
Set oExcel = Nothing
End Sub
answered Jul 28, 2016 at 17:09
dbmitchdbmitch
5,3534 gold badges23 silver badges38 bronze badges
7
zvs 0 / 0 / 0 Регистрация: 04.11.2012 Сообщений: 56 |
||||
1 |
||||
10.12.2013, 16:03. Показов 4582. Ответов 5 Метки нет (Все метки)
Здравствуйте!
__________________
0 |
mobile 26772 / 14451 / 3192 Регистрация: 28.04.2012 Сообщений: 15,782 |
||||
10.12.2013, 16:44 |
2 |
|||
Все работает до тех пор пока на параметр-дату( D1)нет записи…ошибка-3021… Поскольку неясно куда надо переходить и в каком месте кода проверять отсутствие данных, то скажем так:
1 |
zvs 0 / 0 / 0 Регистрация: 04.11.2012 Сообщений: 56 |
||||
11.12.2013, 12:38 [ТС] |
3 |
|||
Поскольку неясно куда надо переходить и в каком месте кода проверять отсутствие данных, то скажем так:
У меня ошибка срабатывает на rst2.MoveFirst, посколко на дату D1(дата из формы) в запросе нет записей и естественно нет первой строки…., для этого случая мне нужно таблицу на дату D1 заполнить поля нулями….(таблица используется для отчета за период)…
0 |
mobile 26772 / 14451 / 3192 Регистрация: 28.04.2012 Сообщений: 15,782 |
||||
11.12.2013, 13:04 |
4 |
|||
У меня ошибка срабатывает на rst2.MoveFirst, посколко на дату D1(дата из формы) в запросе нет записей и естественно нет первой строки…., для этого случая мне нужно таблицу на дату D1 заполнить поля нулями Может быть так
0 |
Модератор 11267 / 4597 / 740 Регистрация: 07.08.2010 Сообщений: 13,182 Записей в блоге: 4 |
|
11.12.2013, 13:16 |
5 |
применяю только Do While rst2.EOF = False
0 |
zvs 0 / 0 / 0 Регистрация: 04.11.2012 Сообщений: 56 |
||||||||
11.12.2013, 15:51 [ТС] |
6 |
|||||||
Поскольку неясно куда надо переходить и в каком месте кода проверять отсутствие данных, то скажем так:
спасибо за подсказку, я ею воспользовалась…но у меня возникла другая проблема -Как правильно прописать повторяющуюся ошибку…Первый раз все правильно работает, а во второй раз не видит метки….
0 |
Forum Rules |
|
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
- burik
- Постоялец
-
- Сообщения: 514
- Зарегистрирован: 03.11.2005 (Чт) 22:04
- Откуда: Беларусь, Рогачев
-
- ICQ
Ошибка 3021. Текущая запись отсутствует.
Здравствуйте!
Вобщем возникает ошибка 3021 (Текущая запись отсутствует).
Есть такой участок кода:
- Код: Выделить всё
For i = 1 To rs.RecordCount
Load Days(i)
With Days(i)
.Top = Days(i - 1).Top + Days(i - 1).Height + 60
.TDate = rs.Fields(1)
.Text = rs.Fields(3)
.BackColor = vbWhite
.Visible = True
End With
rs.MoveNext
Next i
Days — это массив моих контролов.
Ошибка возникает в …Property Let TDate.. :
- Код: Выделить всё
Public Property Let TDate(ByVal New_TDate As Variant)
DTPicker1.Value() = Mid$(New_TDate, 1, 10) '<<<<<<<< Здесь ошибка возникает
tTime(0).Text = IIf(Len(CStr(Hour(New_TDate))) = 1, "0" & CStr(Hour(New_TDate)), CStr(Hour(New_TDate)))
tTime(1).Text = IIf(Len(CStr(Minute(New_TDate))) = 1, "0" & CStr(Minute(New_TDate)), CStr(Minute(New_TDate)))
tTime(2).Text = IIf(Len(CStr(Second(New_TDate))) = 1, "0" & CStr(Second(New_TDate)), CStr(Second(New_TDate)))
PropertyChanged "TDate"
End Property
Кол-во записей в rs — 4 у всех fields(1) = «24.06.2007 11:30:25».
Вроде все проверил.. Не знаю где ошибка..
Между слухов, сказок, мифов,
просто лжи, легенд сомнений
мы враждуем жарче скифов
за несходство заблуждений
Игорь Губерман
- Antonariy
- Повелитель Internet Explorer
-
- Сообщения: 4824
- Зарегистрирован: 28.04.2005 (Чт) 14:33
- Откуда: Мимо проходил
-
- ICQ
Antonariy » 25.06.2007 (Пн) 15:14
А ты там нигде DataField/DataSource не проставляешь? Такая ошибка возникает, когда присваивается значение контролу, связанному с полем рекордета, который находится в BOF/EOF.
Лучший способ понять что-то самому — объяснить это другому.
- burik
- Постоялец
-
- Сообщения: 514
- Зарегистрирован: 03.11.2005 (Чт) 22:04
- Откуда: Беларусь, Рогачев
-
- ICQ
burik » 25.06.2007 (Пн) 15:36
А ты там нигде DataField/DataSource не проставляешь? Такая ошибка возникает, когда присваивается значение контролу, связанному с полем рекордета, который находится в BOF/EOF.
Нет. Там только две процедуры с БД работают (эта и еще одна), обе такого типа:
- Код: Выделить всё
sub sub_name()
set db = dao.opendatabase..
set rs = db.opendatabase..
...
rs.close
set rs = nothing
db.close
set db = nothing
end sub
Связанных с БД контролов нет. В моем контроле есть DTPicker(календарь), image и два текст бокса
Между слухов, сказок, мифов,
просто лжи, легенд сомнений
мы враждуем жарче скифов
за несходство заблуждений
Игорь Губерман
- Antonariy
- Повелитель Internet Explorer
-
- Сообщения: 4824
- Зарегистрирован: 28.04.2005 (Чт) 14:33
- Откуда: Мимо проходил
-
- ICQ
Antonariy » 25.06.2007 (Пн) 15:51
Возможно рекордсет таки находится в EOF потому что For i = 1 To rs.RecordCount — безграмотно. Грамотно так:
- Код: Выделить всё
While Not rs.EOF
...
i = i + 1
rs.MoveNext
Wend
Кроме того ты передаешь rs.Fields(1) в функцию, которая принимает Variant. Из-за этого передается не значение свойства по умолчанию — Value, — а объект Field.
Лучший способ понять что-то самому — объяснить это другому.
- burik
- Постоялец
-
- Сообщения: 514
- Зарегистрирован: 03.11.2005 (Чт) 22:04
- Откуда: Беларусь, Рогачев
-
- ICQ
burik » 25.06.2007 (Пн) 16:00
Antonariy спасибо!
Заработало.
Между слухов, сказок, мифов,
просто лжи, легенд сомнений
мы враждуем жарче скифов
за несходство заблуждений
Игорь Губерман
Вернуться в Visual Basic 1–6
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0
Are you trying to use Microsoft Access, but are you getting the error ‘3021’?
Tech Support 24/7
Ask a Tech Specialist Online
Connect with the Expert via email, text or phone. Include photos, documents, and more. Get step-by-step instructions from verified Tech Support Specialists.
On this page, you will find more information about the most common causes and most relevant solutions for the Microsoft Access error ‘3021’. Do you need help straight away? Visit our support page.
Error information
How to solve Microsoft Access error 3021
We’ve created a list of solutions which you can follow if you want to solve this Microsoft Access problem yourself. Do you need more help? Visit our support page if you need professional support with Microsoft Access right away.
Tech Support 24/7
Ask a Tech Specialist Online
Connect with the Expert via email, text or phone. Include photos, documents, and more. Get step-by-step instructions from verified Tech Support Specialists.
Have you found a solution yourself, but it is not in the list? Share your solution in the comments below.
Need more help?
Do you need more help?
Tech experts are ready to answer your questions.
Ask a question