Срочно нужна помощь полному чайнику.
Программа для 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
Так в чем же ошибки?
Сделай вначале
On Erroro goto er
затем где нибудь в конце
er:
MsgBox err.Description
Хоть будешь знать побольше об ошибке ......
Ничего, кроме названий ошибок "Object required " для 424 и "Object variable or With block variable not set" для 91 не показал.
Извините за чайниковские вопросы, но:
1. А объект r1 к моменту нажатия кнопки CommandButton1 определен? Просто в программе выборка из базы повешена на ComboBox1_Click, а если на этот список не нажимали, то...
2.
У тебя обект r1 создается после того когда ты кликаешь на комбобоксе ......
Set r1 = bd1.OpenRecordset(s1)
Перед тем как нажать на Кнопку ... ты всегда кликаешь Комбобокс ... ???
во втором случае .... посмотри получше что ты открываешь ..
Set rl = bd1.OpenRecordset(s)
a затем что ты используешь
e1.Documents("recl").TextBox3.Text = r1!Описание
Добавлено Levon, [mergetime]1134481546[/mergetime]
Квазимодо, -2 минуты ... :-)
Напоминаю, помощь нужна полному чайнику, так что извините, если вопросы покажутся глупыми.
Ну для первого случая можешь добавить в процедуру кликания кнопки вот эти строки
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!Количество), "#########")
они из процедуры кликания комбобокса ....
А для второго случая ошибка вылетает на прежнем месте ... ??
Да, спасибо, этот момент я просек, исправил и этот блок заработал, но начали сыпаться ошибки при попытке записи в другу таблицу акцесса:
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)).
А может у тебя несоответствие данных ... ?
К примеру тип поля "Товар" - текстовый ... ? Или все-таки числовой ... ?
Кстати .. ты все поля заполнеяшь .. ? так как
Большое спасибо за подсказки, все работает, за одним небольшим недостатком. Первый раз все записи заносятся куда надо, вносятся изменнения, но при попытке повторного изменения выдает ошибку 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)