Версия для печати темы

Нажмите сюда для просмотра этой темы в оригинальном формате

WinCity.Ru _ Программирование _ Ошибки 424 и 91 в VBA

Автор: dem Вторник, 13 Декабря 2005, 15:11

Срочно нужна помощь полному чайнику.
Программа для Exel. Необходимо, чтобы в первом случае по нжатии кнопки открывалась форма, заполнялись поля часть из записей Access, часть вручную, по нажатию кнопки, данные обрабатываются и заносятся обратно в таблицы Access. Во втором случае данные заносятся в Вордовский файл. Теперь коды
Код раздела General
Dim bd1 As DAO.Database
Dim s1 As String, s2 As String, s3 As String
Dim r1 As Recordset, r2 As Recordset, r3 As Recordset, r4 As Recordset
Dim k1 As String, k2 As String, k3 As String, k4 As String
//объявление используемых переменных в общем разделе, так как они будут использоваться в нескольких процедурах
Код для первого случая

Private Sub ComboBox1_Click()
Set bd1 = OpenDatabase("d:\w\db1.mdb")
k1 = ComboBox1.Text
s1 = "select*from[Товары] where [Товар]= """ & k1 & """"
Set r1 = bd1.OpenRecordset(s1)
TextBox3.Text = r1!Количество
TextBox4.Text = Format((r1!Стоимость) / (r1!Количество), "#########")
End Sub

Private Sub CommandButton1_Click()
With r1
.Edit (Вылетает ошибка 424)
!Количество = !Количество + Val(TextBox1.Text)
!Стоимость = !Стоимость + Val(TextBox1.Text) * Val(TextBox2.Text)
.Update
End With
Для второго случая
Private Sub CommandButton1_Click()
Dim bd1 As DAO.Database
Dim r1 As Recordset
Dim e1 As Word.Application
Dim k As String, s As String, m As String
Set bd1 = OpenDatabase("d:\w\db1.mdb")
Set e1 = CreateObject("Word.Application")
e1.Documents.Open Filename:="d:\w\recl.doc"
k = UserForm3.ComboBox1.Text
s = "Select * From [Товары] Where [Товар]="" &k& """
Set rl = bd1.OpenRecordset(s)
m = InputBox("Введите цену товара")
e1.Application.Visible = True
e1.WindowState = wdWindowStateMaximize
e1.Documents("recl").TextBox2.Text = m
e1.Documents("recl").TextBox3.Text = r1!Описание (ошибка 91)
e1.Documents("recl").TextBox1.Text = r1!Товар
End Sub
Так в чем же ошибки?

Автор: Levon Вторник, 13 Декабря 2005, 15:45

Сделай вначале
On Erroro goto er

затем где нибудь в конце
er:
MsgBox err.Description

Хоть будешь знать побольше об ошибке ......

Автор: dem Вторник, 13 Декабря 2005, 16:10

Ничего, кроме названий ошибок "Object required " для 424 и "Object variable or With block variable not set" для 91 не показал.

Автор: Квазимодо Вторник, 13 Декабря 2005, 16:42

Извините за чайниковские вопросы, но:
1. А объект r1 к моменту нажатия кнопки CommandButton1 определен? Просто в программе выборка из базы повешена на ComboBox1_Click, а если на этот список не нажимали, то...
2.

Цитата
Set rl = bd1.OpenRecordset(s)

- это неправильно сюда перенеслось или опечатка в программе? Переменная rl (в отличие от r1) нигде не определяется.

Автор: Levon Вторник, 13 Декабря 2005, 16:45

У тебя обект r1 создается после того когда ты кликаешь на комбобоксе ......
Set r1 = bd1.OpenRecordset(s1)
Перед тем как нажать на Кнопку ... ты всегда кликаешь Комбобокс ... ???

во втором случае .... посмотри получше что ты открываешь ..
Set rl = bd1.OpenRecordset(s)

a затем что ты используешь
e1.Documents("recl").TextBox3.Text = r1!Описание

Добавлено Levon, [mergetime]1134481546[/mergetime]
Квазимодо, -2 минуты ... :-) beer.gif

Автор: dem Вторник, 13 Декабря 2005, 17:47

Напоминаю, помощь нужна полному чайнику, так что извините, если вопросы покажутся глупыми.

Цитата
Перед тем как нажать на Кнопку ... ты всегда кликаешь Комбобокс ... ???

Я не совсем разобрался в терминологии, но похоже, что да, и что мне делать(

По второму, l на 1 исправил, но ошибка осталась, правда теперь 13 "Type mismatch "

Автор: Levon Среда, 14 Декабря 2005, 8:16

Ну для первого случая можешь добавить в процедуру кликания кнопки вот эти строки
Set bd1 = OpenDatabase("d:\w\db1.mdb")
k1 = ComboBox1.Text
s1 = "select*from[Товары] where [Товар]= """ & k1 & """"
Set r1 = bd1.OpenRecordset(s1)
TextBox3.Text = r1!Количество
TextBox4.Text = Format((r1!Стоимость) / (r1!Количество), "#########")
они из процедуры кликания комбобокса ....

А для второго случая ошибка вылетает на прежнем месте ... ??

Автор: dem Среда, 14 Декабря 2005, 15:19

Да, спасибо, этот момент я просек, исправил и этот блок заработал, но начали сыпаться ошибки при попытке записи в другу таблицу акцесса:

Set r4 = bd1.OpenRecordset("Контракты")
With r4
.AddNew
.Bookmark = .LastModified
!Товар = k1
!Фирма = k2
!Динамика = "Поставка"
!Количество = TextBox1.Text
!Цена = TextBox2.Text
!Дата = Date
!Сотрудник = ComboBox3.Text
.Update
End With

В таком виде на строке !Товар = k1 дает ошибку 3020 (Вызов метода Update или CancelUpdate без предварительного вызова метода AddNew или Edit), я попробовал убрать .Bookmark = .LastModified (как я понял он отменяет действие метода .AddNew), за что был естесственно вознагражден на предпоследней строке сообщением об ошибке 3058 (Индекс или ключ не может содержать пустое значение (Null)).

Цитата
А для второго случая ошибка вылетает на прежнем месте ... ??

Да, она на той же строке
e1.Documents("recl").TextBox3.Text = r1!Описание

Автор: Levon Среда, 14 Декабря 2005, 16:24

А может у тебя несоответствие данных ... ?
К примеру тип поля "Товар" - текстовый ... ? Или все-таки числовой ... ?
Кстати .. ты все поля заполнеяшь .. ? так как

Цитата(dem @ Сегодня, 16:19)
Индекс или ключ не может содержать пустое значение (Null)
говорит о том что ты даешь значения не всем полям ......

Попробуй ка ты лучше добавить новую строку таким образом ...

Set r4 = bd1.OpenRecordset("Контракты")
р4.execute "INSERT INTO Контракты(Товар,Фирма, Динамика , и тд.) VALUES (" & k1 & ", " & k2 & ")" и тд ......

Этот куд работает с таблицей напрямую ..... соответственно - быстрее .... может он прокатит без проблемм .....
Но на всякий .. проверь поля которые обязательны для заполнения ... в частности ключевой эллемент таблицы ... как он пулучает значения ... Автонумерация, или вручную ..... ??

Автор: dem Четверг, 15 Декабря 2005, 11:59

Большое спасибо за подсказки, все работает, за одним небольшим недостатком. Первый раз все записи заносятся куда надо, вносятся изменнения, но при попытке повторного изменения выдает ошибку 3022 (Изменения не были успешно завершены из-за повторяющихся значений в индексе, ключевых полях или связях).
Дело в том, что, как я понял, в блоке

Set r4 = bd1.OpenRecordset("Контракты")
With r4
.AddNew
.Bookmark = .LastModified
!Товар = k1
!Фирма = k2
!Динамика = "Поставка"
!Количество = TextBox1.Text
!Цена = TextBox2.Text
!Дата = Date
!Сотрудник = ComboBox3.Text
.Update
End With

метод .Bookmark = .LastModified отвечает за то, чтобы запись была внесена в конец таблицы, соответственно, ключевому полю присваивается номер после предыдущей. Но при использовании данного метода в таком виде перестает работать связка .AddNew ... .Update. Если этот метод убрать, то получается та самая ошибка 3022 при последующей записи (если конечно не исправлять ключ вручную) Как выйти из этой ситуации?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)