Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» VBA for Access

Автор: Elena3785
Дата сообщения: 20.10.2008 20:42
Подскажите, пожайлуста! У меня есть форма "Общая". В ней список (Список423). Я хочу, чтобы при нажатии на этот список у меня открывается форма Данные, в которой надо выбрать необходимое действие. Но когда я выбираю в форме Данные любой из Case, у меня исчезают данные из списка (становятся невидимыми). Как сделать так, чтобы данные из списка не исчезали? Код такой при нажатии на список:
Private Sub Список423_Click()
Dim strMessage As String
Dim intOptions As String
Dim bytChoice As String

strMessage = "В следующем окне выберите необходимое действие"
intOptions = vbQuestion + vbYesNo
bytChoice = MsgBox(strMessage, intOptions)

If bytChoice = vbYes Then
DoCmd.OpenForm "Данные", , , , , acDialog
End If
End Sub
А в форме Данные такой:
Private Sub Кнопка6_Click()

Select Case Группа11

Case 1
DoCmd.OpenForm "ДобавлениеСотрудника", , , , , acDialog

Case 2
DoCmd.OpenForm "ИзменениеДанных", , , , , acDialog

Case 3
DoCmd.OpenForm "ОбновлениеДанных", , , , , acDialog

Case 4
Dim strMessage As String
Dim intOptions As String
Dim bytChoice As String

strMessage = "Вы действительно хотите удалить из базы данного сотрудника?"
intOptions = vbQuestion + vbYesNo
bytChoice = MsgBox(strMessage, intOptions)

If bytChoice = vbYes Then
УдалитьДанные
Forms!Общая.Список423.Requery
End If

End Select
'DoCmd.Close acForm, Me.Name
End Sub

Private Sub УдалитьДанные()

Dim База1 As Object, Работник As Object
Set База1 = CurrentDb
Set Работник = База1.OpenRecordset("Работник", dbOpenDynaset)
With Работник
.FindFirst "[КодРаботник] = " & CStr(Forms!Общая.Список423)
.Delete
Forms!Общая.Список423.Requery
Me.Requery
.Close
End With
Set База1 = Nothing


End Sub

Private Sub Кнопка6_Exit(Cancel As Integer)
Forms!Общая.Список423.Requery

End Sub

Автор: MrZeRo
Дата сообщения: 21.10.2008 11:08
klimusu
Конечно, можно проверять все, что нужно.

Цитата:

Select * From Users WHERE (Surname IS NOT NULL) AND (SomethingElse IS NOT NULL)

Смотрится запрос, не смотрится - это дело вкуса. Главное - чтобы правильно работал
Автор: Elena3785
Дата сообщения: 21.10.2008 19:03
С предыдущим вопросом справилась сама, так что подсказывать не надо. А кто подскажет по такому вопросу, сколько не бьюсь ничего не получается. У меня в процессе работы базы открывается несколько форм, например, форма1 и форма2. Как прописать в коде, чтобы после закрытия формы2 закрывалась и форма1?
Автор: Dixi257
Дата сообщения: 21.10.2008 23:09

Цитата:
Как прописать в коде, чтобы после закрытия формы2 закрывалась и форма1?

В событие закрытия формы2 (Form_Close) вписать docmd.Close acForm , "Форма1"
Автор: Elena3785
Дата сообщения: 22.10.2008 20:04
Dixi257
Огромное спасибо. Наконец все заработало.
Автор: Elena3785
Дата сообщения: 23.10.2008 21:39
Помогите решить проблему. У меня в форме Общая есть поле Месяц, Год, список СписокНачислениеЗП, который создан на основе таблицы Начисление2. При выделении в этом списке работника, у меня окрывается форма ДанныеСервис (поля : КодРаботник, Месяц, Год, ДанныеУслуга (это свободные поля) и кнопка КнДобавитьСервис), далее в поле ДанныеУслуга я ввожу любую цифру и после нажатия кнопки КнДобавитьСервис в таблице Начисление2 в поле СтоимостьУслуга должна отобразиться введенная цифра из формы, но конкретно для того месяца и года который выбран непосредственно в форме Общая. Кстати, список также отображает данные Начисления2, соответствующие выбранному месяцу и году в форме Общая. Я написала следующий код:
Private Sub Form_Open(Cancel As Integer)

Forms!Общая.СписокНачислениеЗП.SetFocus
КодРаботник = Forms!Общая.СписокНачислениеЗП.Column(0)
ДанныеУслуга = Forms!Общая.СписокНачислениеЗП.Column(11)
Месяц = Forms!Общая.СписокНачислениеЗП.Column(2)
Год = Forms!Общая.СписокНачислениеЗП.Column(3)
End Sub

Private Sub КнДобавитьСервис_Click()
Dim База1 As Object, Начисление2 As Object

Set База1 = CurrentDb
Set Начисление2 = База1.OpenRecordset("SELECT [КодРаботник],[Месяц],[Год] FROM Начисление2 WHERE Месяц = Forms!Общая!Месяц And Год = Forms!Общая!Год")
With Начисление2
.FindFirst "[КодРаботник] = " & CStr(Forms!Общая.СписокНачислениеЗП)
.Edit
![СтоимостьУслуга] = ДанныеУслуга
.Update

End With
Forms!Общая.СписокНачислениеЗП.Requery

Начисление2.Close
Set База1 = Nothing
DoCmd.Close
End Sub
Но при этом выделяет строку Set Начисление2 = База1.OpenRecordset("SELECT [КодРаботник],[Месяц],[Год] FROM Начисление2 WHERE Месяц = Forms!Общая!Месяц And Год = Forms!Общая!Год") и выдает следующее выражение: Run-Time error 3061 Слишком мало параметров, требуется 2.
Я пыталась эту строку записать так:Set Начисление2 = База1.OpenRecordset("SELECT Начисление2. * FROM Начисление2 WHERE Месяц = Forms!Общая!Месяц And Год = Forms!Общая!Год"), выдает ту же самую ошибку. Я не знаю в чем проблема. Правда у меня в таблице больше полей, но мне нужно изменить только одно поле СтоимостьУслуга для выделенного работника в списке и чтобы это изменение внеслось в таблицу только за тот месяц и год, котрый выбран в форме Общая.
Может кто подскажет?

Автор: dneprcomp
Дата сообщения: 23.10.2008 22:08
Elena3785
[more=expression.OpenRecordset(Name, Type, Options, LockEdit)]Parameters

Name Required/Optional Data Type Description
Name Required String The source of the records for the new Recordset. The source can be a table name, a query name, or an SQL statement (SQL string/statement: An expression that defines an SQL command, such as SELECT, UPDATE, or DELETE, and includes clauses such as WHERE and ORDER BY. SQL strings/statements are typically used in queries and in aggregate functions.) that returns records. For table-type Recordset objects in Microsoft Access database engine databases, the source can only be a table name.
Type Optional Variant A RecordsetTypeEnum constant that indicates the type of Recordset to open.
Note
If you open a Recordset in a Microsoft Access workspace (Access workspace: A workspace that uses the Access database engine to access a data source. The data source can be an Access database file, an ODBC database, such as a Paradox database, or an ISAM database.) and you don't specify a type, OpenRecordset creates a table-type Recordset, if possible. If you specify a linked table (linked table: A table stored in a file outside the open database from which Access can access records. You can add, delete, and edit records in a linked table, but you cannot change its structure.) or query, OpenRecordset creates a dynaset-type Recordset.

Options Optional Variant A combination of RecordsetOptionEnum constants that specify characteristics of the new Recordset.
Note
The constants dbConsistent and dbInconsistent are mutually exclusive, and using both causes an error. Supplying a lockedits argument when options uses the dbReadOnly constant also causes an error.

LockEdit Optional Variant A LockTypeEnum constant that determines the locking for the Recordset.
Note
You can use dbReadOnly in either the options argument or the lockedits argument, but not both. If you use it for both arguments, a run-time error occurs.[/more]

Автор: Oyger
Дата сообщения: 24.10.2008 10:04
Господа, программисты. Такой вопрос.
Работаю с базой из под Excel. Поработал. Закрыл объект.
Но со временем растет размер базы. Надо ее сжать. Это я умею делать из самой базы - руками. А есть ли какая-нибудь команда на сжатие макросом?
Спасибо.
Автор: dneprcomp
Дата сообщения: 24.10.2008 20:06
Oyger
Excel Best Practices - VBA compact current database
Compact Database via VBA
Автор: jackdenis
Дата сообщения: 28.10.2008 10:52
Привет Всем!!
Помогите с небольшой проблемкой. В значении переменной заложен адрес и имя файла(изображения). Надо на форме в элементе "Рисунок" показать изображение которое находится по адресу который в переменной забит. Огромное спасибо за помощь.
Автор: dneprcomp
Дата сообщения: 29.10.2008 03:26
jackdenis
И совершенно незачем было сразу в двух темах спрашивать. Мне теперь как, половину ответа здесь давать, половину там?
Код: Dim strPath As String
strPath = "C:\1.JPG"
Image1.Picture = LoadPicture(strPath)
Автор: jackdenis
Дата сообщения: 30.10.2008 10:41
dneprcomp

Пробую, но всеравно выдает ошибку - "Run-time error 2220" Приложению ... не удается открыть файл "С:\1.JPEG"

Вот часть кода проги:

Private Sub Form_open(Cancel As Integer)

Dim strPath As String

strPath = "C:\1.JPEG"
img1.Picture = LoadPicture(strPath)

End Sub

Может надо что-то изменить в свойствах img1??
Автор: Dixi257
Дата сообщения: 30.10.2008 17:25
На сколько я помню, jpg нельзя загружать, попробуй bmp файлы, или используй внешний ActiveX, который заведомо умеет читать jpg. А действительно, зря в двух местах плодишь одинаковые вопросы.
Автор: dneprcomp
Дата сообщения: 30.10.2008 22:54
jackdenis
Действительно, или попробуй другой формат(хотя у меня jpg загружает). Или проверь, существует ли файл 1.jpg на с:\
Попробуй предварительно, можно ли назначить этот файл в проекте в свойствах объекта. Если принимает и отображает, значит и формат подходящий, и файл не испорчен.
Автор: jackdenis
Дата сообщения: 04.11.2008 12:45
Ребята спасибо за помощь!! Пробую, но не очень получается, еще посижу покумекаю. Пробовал закрепить за элементом img рисунок - все отображается нормально, как только прописываю в коде - пишет что неможет открыть рисунок (
Автор: A_S_T_E_R_I_X
Дата сообщения: 06.11.2008 17:31
подскажите, что можно почитать по использованию VBA в ACCESS,
какие книги самые лучшие?
Автор: Elena3785
Дата сообщения: 09.11.2008 20:29
Подскажите, как прописать в коде Выделить весь список (Список.SetFocus - выделяет только одну запись) и как потом снять выделение?
Автор: Elena3785
Дата сообщения: 04.12.2008 21:00
Кто подскажет по такому вопросу: у меня есть поле Дата, где указывается дата (например, 11.12.2008). Мне нужно, чтобы в поле Месяц отображался месяц из поля Дата, как это прописать в свойстве Данные поля Месяц?
Автор: A_S_T_E_R_I_X
Дата сообщения: 05.12.2008 13:57
Elena3785
=MonthName(Month(Date()))
вроде так
Автор: Elena3785
Дата сообщения: 05.12.2008 18:55
A_S_T_E_R_I_X
Спасибо за отзыв. Но это немного не то. Мне нужно именно из поля Дата извлечь месяц, т.к. в этом поле Дата отображаются даты, не соответствующие текущей. скорее всего нужно прописать код в VBA, типа этого:
Dim MyDate, MyMonth
MyDate = str([Дата])
MyMonth = Me!Поле19
MyMonth = Mid(MyDate, 4, 2)
Me!Поле19.Requery
Т.е. в Поле19 должен отобразится месяц
Только это не работает, вот в этом то вся и проблема.

Ура! Сделала, чтобы извлекался месяц и год. Надо было так:
Dim d As String
d = Дата.Text
Месяц = Mid(d, 4, 2)
Год = Mid(d, 7, 4)
Автор: liverpool56
Дата сообщения: 10.12.2008 14:06
Здравствуйте!
Подскажите пожалуйста каким образом можно из Excel таблицы конвертировать в Access базу также в таблицу в точности такую же?



Добавлено:
Имелось ввиду не руками, а скриптом.
Автор: Mont1
Дата сообщения: 11.12.2008 09:18
liverpool56
Попробуй команду в Access-e

DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel97, "TableName", "C:\File.xls"
Автор: liverpool56
Дата сообщения: 12.12.2008 07:55
to Mont1
Спасибо, но именно нужно чтобы все было прозрачно для пользователя, чтобы просто запустить скрипт и все добавилось, просто нужно это сделать у многих клиентов.
Автор: ArtemijG
Дата сообщения: 26.12.2008 10:20
Всем Здрасте! С наступающим. У меня возникла проблема. Излагаю: Существуют таблицы EXCEL (стандартная с одинаковым количеством строк, но каждый раз с разным количеством рядков). Мне надо:
1) Импортировать ее в ACCESS. Это я делаю следующим макросом.
Option Compare Database

Public PathN As String
Public XlApp As Object
Public Wbk As Object

Public BD As DAO.Database
Public rs As DAO.Recordset


Public SQL As String
Public Function OpenDB() As Boolean
On Error GoTo m01
Set BD = CurrentDb
OpenDB = True
Exit Function
m01:
OpenDB = False
End
End Function
Sub Downloader()
PathN = CurrentProject.Path

If OpenDB = False Then Exit Sub

Dim FName As String
Dim NumFile As Integer
NumFile = 0
FName = Dir("*.xls")
Do While FName <> ""

If FileOpen(FName) Then
NumFile = NumFile + 1
Debug.Print FName, NumFile

End If
FName = Dir
Loop
BD.Close
End Sub
Function FileOpen(FName As String) As Boolean
On Error Resume Next
Dim ErrTxt As String
Dim Index As Long, endcells As Long
Dim StartCells As Integer, ListStart As Integer

Index = 0
ErrTxt = ""

Set rs = BD.OpenRecordset("input")
Set XlApp = CreateObject("Excel.Application")
Set Wbk = XlApp.Workbooks.Open((FName), False, ReadOnly)


i1 = 2
i = i1

ListStart = 1
lastrw = Selection.SpecialCells(xlCellTypeLastCell).Row
j = i1

While Wbk.Sheets(1).Cells(j, 2) <> 0

If Wbk.Sheets(1).Cells(j, 1) <> "" Then


rs.AddNew

rs!Код = Wbk.Sheets(1).Cells(j, 1)
rs!МФО = Wbk.Sheets(1).Cells(j, 2)
rs!ОР = Wbk.Sheets(1).Cells(j, 3)
rs!Назначение_счёта = Wbk.Sheets(1).Cells(j, 4)
rs!Результат = Wbk.Sheets(1).Cells(j, 5)
rs!January = Wbk.Sheets(1).Cells(j, 6)
rs!Expense = Wbk.Sheets(1).Cells(j, 7)

rs.Update

j = j + 1

End If
Wend
Wbk.Close SaveChanges:=False
XlApp.Quit
FileOpen = True

End Function

Таблицы ACCESS и EXCEL одинаковы по всем параметрам, только в ACCESS больше столбиков(месяца года)

А теперь что оно делает. Я помещаю в папку "мои документы" 25 файлов EXCEL. Данный макрос перебирает их поочерёдно и наполняет таблицу ACCESS данными. Как бы элементарно.

Но возникала у меня вторая необходимость. После того как данные импортированы, у меня появляется вторая группа файлов EXCEL(за другой месяц) которую снова надо экспортировать в ACCESS, но в этот раз данные должны поместится в другой столбец (February)ACCESS. Сравнение происходит по двум полям, тоесть если совпал поле МФО и ОР данные заносятся в Февраль, если не совпали тогда записываются после последнего заполненного рядка. Данный макрос у меня реализован в EXCEL. Всё очень просто потому как у меня идёт сравнение значений ячеек между двумя листами.Привожу пример кода в EXCEL.

Sub &#212;&#224;&#234;&#242;_1602_2007()
Dim MyStr, a, Response
Dim i, i1, i2, i3, ikmF, iMs, j As Integer
ikmF = 12 + (Cells(4, 4) - 1) * 8 + Cells(5, 4) * 2 ' &#199;&#236;_&#249;&#229;&#237;&#237;&#255; &#228;&#238; &#234;&#238;&#235;&#238;&#237;&#234;&#232; &#239;&#238;&#242;&#238;&#247;&#237;&#238;&#227;&#238; &#236;_&#241;&#255;&#246;&#255;
iMs = (Cells(4, 4) - 1) * 3 + Cells(5, 4) ' &#237;&#238;&#236;&#229;&#240; &#239;&#238;&#242;&#238;&#247;&#237;&#238;&#227;&#238; &#236;_&#241;&#255;&#246;&#255;
Response = MsgBox("&#199;&#224;&#226;&#224;&#237;&#242;&#224;&#230;&#229;&#237;&#237;&#255; &#244;&#224;&#234;&#242;&#232;&#247;&#237;&#232;&#245; &#228;&#224;&#237;&#232;&#245; &#231;&#224; " & Str(iMs) & " &#236;_&#241;&#255;&#246;&#252;..." & Chr(13) & Chr(10) _
& "&#193;&#196; &#226;_&#228;&#241;&#238;&#240;&#242;&#238;&#226;&#224;&#237;&#224; &#239;&#238; &#204;&#212;&#206; + &#206;&#208; ?!!!", vbYesNo)
If Response = vbNo Then GoTo m_end ' User chose No.

i1 = 10
i2 = Cells(8, 3) ' &#202;_&#237;&#229;&#246;&#252; &#193;&#196;
i = i1
j = 6
While Worksheets("Input").Cells(j, 2) <> 0
Cells(1, 4) = j
M1: For i = i1 To i2
If Cells(i, 1) = Worksheets("Input").Cells(j, 2) Then ' MFO=
If Cells(i, 2) = Worksheets("Input").Cells(j, 3) Then ' OR=
Cells(8, 4) = i
Cells(i, ikmF) = Worksheets("Input").Cells(j, 10) '&#244;&#224;&#234;&#242; &#237;&#224; &#231;&#226;_&#242;&#237;&#243; &#228;&#224;&#242;&#243;
i1 = i + 1
GoTo M4 ' Next input
Else
If Cells(i, 2) > Worksheets("Input").Cells(j, 3) Then GoTo M3 ' Insert
GoTo M5 ' Next DB
End If
End If
If Cells(i, 1) > Worksheets("Input").Cells(j, 2) Then GoTo M3
'GoTo m5 ' Next DB
M5: Next i
' &#194;&#241;&#242;&#224;&#226;&#234;&#224; &#241;&#242;&#240;_&#247;&#234;&#232; - Cells(8, 3)
M3: i3 = Cells(8, 3) + 1
Cells(8, 4) = i3
Cells(i3, 1) = Worksheets("Input").Cells(j, 2)
Cells(i3, 2) = Mid(Worksheets("Input").Cells(j, 3), 1, 14)
Cells(i3, 3) = Mid(Worksheets("Input").Cells(j, 3), 9, 2)
Cells(i3, 4) = Worksheets("Input").Cells(j, 1)
Cells(i3, 5) = Worksheets("Input").Cells(j, 4)
Cells(i3, ikmF) = Worksheets("Input").Cells(j, 10) '&#244;&#224;&#234;&#242;
Cells(8, 3) = i3
M4: j = j + 1
Wend
m_end:
End Sub


Но в ACCESS понятие ячейки отсутствует. Что делать? Помогите. Всех с наступающим!
Автор: KenGa
Дата сообщения: 26.12.2008 15:01
Господа, пропало главное меню в Access 2003. При этом в настройках "показывать стандатрное меню" галочка стоит, но она нажата и залочена.. никак не изменить, и меню не показывает
Под чужим профилем всё ОК... но удалять свой профиль в виндах не хотелось бы... подскажите, плиз, как вернуть стандартное меню..
Автор: ArtemijG
Дата сообщения: 09.01.2009 14:37
Никто не ответит? Если необходимо более детально описать суть проблемы, я с радостью это сделаю.
Автор: dmka
Дата сообщения: 09.01.2009 16:17
ArtemijG
Много буков и нифига не ясно в чем собственно вопрос...

Насколько понял, у тебя неправильно спроектирована база Access. В каждой записи зачем-то куча колонок на каждый месяц ((February)ACCESS, ...), вместо того, чтобы добавить одну - date (ну или две - month, year).
Автор: ArtemijG
Дата сообщения: 09.01.2009 16:32
А каким то образом можно скриншоты прицепить для наглядности?
Автор: Alex_Dark_69
Дата сообщения: 09.01.2009 16:33
KenGa пробовал делать "сброс"?
Автор: Elena3785
Дата сообщения: 24.01.2009 20:26
Подскажите, пожайлуста, как снять выделение строки в списке?
А то у меня в форме несколько списков, и они выделяются все. А нужно, чтобы при выполнении процедуры автоматически снималось выделение строки.

Страницы: 1234567891011121314151617

Предыдущая тема: Delphi+ADO


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.