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

» VBA for Access

Автор: georgbird
Дата сообщения: 11.04.2010 23:28
dneprcomp
Спасибо, буду разбираться
Автор: Oyger
Дата сообщения: 30.04.2010 14:24
Всем доброго дня и с наступающими праздниками!
Несмотря на предпраздничное, выходное настроение и укароченный рабочий день хочу Вас озадачить вот каким вопросом:

Что надо сделать:
Есть форма. При нажании кнопки начинает работать макрос.
В середине макроса должна открыться вторая форма и управление должно передаться на нее. После выбора на второй форме нужных пользователю переключателей и начатии кнопки "Ок", форма должна закрыться и макрос, прерванный от первой формы, должен продолжить работать.

А что меня получается:
Я жму кнопкуна первой форме. Макрос работает. В середине макроса он натыкается на команду DoCmd.OpenForm "...". Начинает грузиться вторая форма. Посре отработки Form_Loan второй формы, макрос в первой продолжает свою работу. А вторая форма тупо висит на экране...

Вид модуля первой формы, примерно, следующий:

'Сдесь идет модуль
For q=1 to N
DoCmd.OpenForm "..." 'Должна открыться вторая форма и управление должно передаться на нее. Макрос первой формы должен прерваться. И подождать, пока пользователь не закроет вторую форму кнопкой "Ок"
Next
'Сдесь продолжается модуль

Как-нибудь можно решить задачу? Кто идеи или команды дельные подскажет?

Спасибо.
Автор: dneprcomp
Дата сообщения: 30.04.2010 16:31
Oyger
Попробуй открывать модальнo
Автор: Oyger
Дата сообщения: 05.05.2010 11:22
dneprcomp
Спасибо.
Что такое модальная форма - я не знаю.

А задачу решил так:

'Сдесь идет модуль
For q=1 to N
DoCmd.OpenForm "..."
Do Until Form_"...".Visible = False
DoEvents
Loop
Next
'Сдесь продолжается модуль

Таким образом макрос открывает вторую форму и циклится. На второй форме спокойно работаешь (отмечаешь все параметры и пр.) и жмешь кнопку продолжения в которой прописан код при нажатии Form_"...".Visible = False
Условие зацикливания выполнено и макрос продолжает работать. При этом и форма не закрыта, т.е. можно обработать значения, параметры и пр., что позволяет не создавать дополнительные переменные.
После всего закрываем скрытую форму.

Спасибо.
Автор: maxGoustarev
Дата сообщения: 25.05.2010 19:04
Всем привет!
Помогите новичку =)

Имею в базе данных таблицу t1 и t2
Создал пустую форму, на ней поле со списком (данные в нем берутся из t2)
Добавил кнопку, пишу обработчик события:


Private Sub button_Click()
End Sub

что вписать в обработчик что бы при нажатии на кнопку в таблицу t1 записывался текст который находится в поле со списком (уже выбранно из t2)
Автор: doker_kg
Дата сообщения: 09.06.2010 16:47
день добрый. если подволите вопрос.
создал в MSA2007 на форме диаграмму, прописал заголовки столбцов, теперь нужно из VBA добавить сточку в соурсную таблицу диаграммы, подскажите пжл как это сделать
Автор: Changeless
Дата сообщения: 14.06.2010 10:01
Я не совсем понял, если тебе нужно указать источник данных для диаграммы через VBA то примерно так:
Me.TvoyaDiagramma.RowSource = "Имя таблицы или запроса, можно и сразу запрос"
Повесить, например, на событие Load формы. Таким же образом, возможно, нужно будет указать подчиненные поля (LinkChildFields) и основные поля (LinkMasterFields) или указать источником, например, лист Excel. Все зависит от того что тебе нужно.
Автор: taravasya
Дата сообщения: 02.11.2010 01:32
Как в VBA 6.5(офис 2007) перемещать окно формы без заголовка?
Нарыл вот такой код:

Код: Private Sub Detail_MouseMove(Button As Integer, _
Shift As Integer, X As Single, Y As Single)
fMoving = True
End Sub

Private Sub Detail_MouseMove(Button As Integer, _
Shift As Integer, X As Single, Y As Single)
Dim sngNewX As Single
Dim sngNewY As Single
If (fMoving) Then
' calculate using window dimensions so the mouse doesn't jump
sngNewX = (Me.WindowLeft - Me.WindowWidth / 2) + X
sngNewY = (Me.WindowTop - Me.WindowHeight / 2) + Y

' move the form
Me.Move sngNewX, sngNewY
End If
End Sub

Private Sub Detail_MouseMove(Button As Integer, _
Shift As Integer, X As Single, Y As Single)
fMoving = False
End Sub
Автор: Djaarfik
Дата сообщения: 06.12.2010 07:57
Ребята помогите открыть файл ... немогу понять как его закрыли а человек который закрыл не открывает ... Поможете? Ссылка на файл http://depositfiles.com/files/uwszh8uqh
Очень прошу вас решить эту загадку
Автор: Laybochka
Дата сообщения: 16.12.2010 12:56
Может кто подскажет почему не работает? Надо фильтровать форму Продажа (от таблиы Продажа) по районам "бс" и "сг" .

Dim StrA1 As String, Strb1 As String, Strb2 As String, Strb3 As String

StrA1 = "продажа"
Strb1 = "([продажа]![район]=""бс"")"
Strb2 = "([продажа]![район]=""сг"")"
Strb3 = Strb1 Or Strb2

DoCmd.OpenForm StrA1, acNormal, "", Strb3, , acNormal
Автор: AndVGri
Дата сообщения: 20.12.2010 05:23
Laybochka

Цитата:
Strb3 = Strb1 Or Strb2

на

Код:
Strb3 = Strb1 & " Or " & Strb2
Автор: Laybochka
Дата сообщения: 26.12.2010 18:39
Спасибо работает. Может литературку подскажете, а то сколько искал попадается все в общем формате, а на мелочах спотыкаюсь. Сейчес мучаюсь какой командой можно обнулить все флажки в одном поле или все значения поля.
Автор: AndVGri
Дата сообщения: 27.12.2010 05:08
Laybochka


Код:
'где me форма, пример для кода внутри формы (например, событие Load)
Dim p As Cotrol
Dim p As Control
For Each p In Me.Controls
If TypeOf p Is TextBox Then
Debug.Print p.Value
ElseIf TypeOf p Is CheckBox Then
Debug.Print p.Value
End If
Next p
Автор: Jully
Дата сообщения: 11.01.2011 10:52
Всем добрый день!
Помогите упростить процедуру определения открытых окон в проекте.
Т.е. объекты Forms и Reports - это хорошо, но на экране так же бывают открытые таблицы и запросы в виде таблиц. Как определить, есть ли они вообще.
Сейчас делаю перебор по всем таблицам и запросам и в цикле проверяю - загружен или нет.
Неужели нет никакого системного кэша открытых объектов, чтобы можно было с ними работать.

И может быть кто-то знает как работает системная функция в данном контексте:

If SysCmd(acSysCmdGetObjectState, acQuery, strQName) = acObjStateOpen Then
IsLoadedQry = True
End If

и возможна ли подобная проверка не тупо перебором, а запросом в куда-то?!

СПАСИБО!
Автор: Oyger
Дата сообщения: 01.02.2011 10:00
Jully
На сколько я знаю - возможен только перебор. Я делаю так (как в Справке):
Dim Tabl As AccessObject, dbs As Object
For Each Tabl In Application.CurrentData.AllTables
If Tabl.IsLoaded = True Then
...
End If
Next Tabl

Это на примере объектов Таблиц. Можно аналогично и с другими объектами сделать.

Добавлено:
Коллеги.
Вопрос по ComboBox. А то я что-то в творческом кризисе =)
Итак. На форме ComboBox. Он заполняется запросом и имеет несколько столбцов. После выбора значения запускается макрос (AfterUpdate).
Цель: в переменую надо загнать выбранное значение combobox из второго столбца. Как сделать?
Value - берет значение из первого столбца.
Recordset - обрабатывает первое значение в списке, а не выбранное.
Жду подсказок...
Спасибо.
Автор: dneprcomp
Дата сообщения: 01.02.2011 16:30
Oyger
http://www.ozgrid.com/forum/showthread.php?t=66621&page=1
http://bytes.com/topic/access/answers/193375-how-reference-combobox-column-1-query
Автор: Oyger
Дата сообщения: 03.02.2011 16:36
dneprcomp

Цитата:
http://www.ozgrid.com/forum/showthread.php?t=66621&page=1

У 2007 офис. И в нем нет свойства List у ComboBox, как в примере.

Цитата:
http://bytes.com/topic/access/answers/193375-how-reference-combobox-column-1-query

От сюда тоже не помогло.

Задачу решил сам, немного подумав. Через RecordSet. Для меня это удобнее. И таму есть объяснение - используя RecordSet можно ссылаться не на номера столбцов, а на их названия. Это большой "+" когда приходиться добавлять новый столбец данных. Да еще в середину данных/таблицы. Если используешь номера - они сместились из-за вставки и надо править весь текст макроса. А если используешь названия столбцов, ничего править не надо.
А решил задачу вот как:
ПолеСоСписком.Recordset.MoveFirst 'Задаем Recordset на первое значение
ПолеСоСписком.Recordset.Move (ПолеСоСписком.ListIndex) 'Задаем Recordset на выбранный элемент списка
Actual = ПолеСоСписком.Recordset(ХХХ) 'Используем выбранное значение из столбца ХХХ (вместо ХХХ можно вставить как номер столбца, так и его название)
Автор: dneprcomp
Дата сообщения: 03.02.2011 21:37
Oyger
Можно ппробовать обратится к столбцу по номеру:
Me.YourComboBoxNameHere.Column(n)

Автор: Oyger
Дата сообщения: 04.02.2011 09:35
dneprcomp
Перед тем как задать вопрос - пробовал, но почему-то не получалось... А сейчас получилось. Странно.
Но лично для меня удобнее Recordset, т.к. используя его можно обращаться к записи по имени столбца, а не только по номеру. Пример описал в предыдущем посте.
Спасибо за помощь.
Автор: KolyaP
Дата сообщения: 08.02.2011 23:32
Такая задача.
Есть файл BNKSEEK.dbf нужно получить к нему доступ. Осуществить поиск записи по полю NEWNUM. Затем выбрать значения некоторых других полей из найденой записи. Хотелось бы чтобы этот пример также мог работать из Excel.
Автор: KolyaP
Дата сообщения: 10.02.2011 01:26
Хоть никто и не ответил, частично уже сам сделал.
Код привожу:

bik = "044552743"

Set dbBS = OpenDatabase(dbn, False, True)

strSQL1 = "SELECT NAMEP, TNP, NNP, KSNP FROM BNKSEEK WHERE NEWNUM = " + """" & bik & """"
Set qdf1 = dbBS.CreateQueryDef("", strSQL1)
Set rst = qdf1.OpenRecordset()

If rst.RecordCount = 0 Then Exit Sub

bank_name = rst.Fields("NAMEP").Value
bank_pl = rst.Fields("NNP").Value
ks = rst.Fields("KSNP").Value



Если dbn = "BNKSEEK1.mdb", всё работает.
Если dbn = "BNKSEEK.dbf", возникает ошибка "Нераспознаваемый формат базы данных <имя файла>. (Ошибка 3343)".
Хотя файл mdb получен из dbf, и ACCESS его успешно конвертировал.

Подскажите как работать непосредственно с dbf.

Автор: AndVGri
Дата сообщения: 10.02.2011 05:14
KolyaP

Цитата:
Подскажите как работать непосредственно с dbf

Для начала можешь не импортировать dbf таблицу в базу Access, а связать dbf с этой базой данных, то есть все изменения в dbf, выполненные сторонними программами, будут автоматически видны в Access.
Ну, а если кодом

Код:
Const sPart1 As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
Const sPart2 As String = ";Extended Properties=dBASE IV;User ID=Admin;Password=;"

Dim pConn As New ADODB.Connection
Dim pRSet As New ADODB.Recordset
Dim sPath As String

sPath = "d\PathToDbfFolder"
pConn.Open sPart1 & sPath & sPart2
pRSet.Open "Select T.* From dbfName As T", pConn, ADODB.adOpenStatic, ADODB.adLockOptimistic
Автор: KolyaP
Дата сообщения: 10.02.2011 11:37
AndVGri

Большое спасибо. Всё работает.
Я в справке даже таких методов не нашёл.

Интересен такой вопрос. Задача решается в рамках библиотеки DAO или нужна библиотека ADO?
Автор: AndVGri
Дата сообщения: 11.02.2011 01:40
KolyaP
Можно делать только на DAO или только на ADO.
Согласно идеологии Microsoft DAO более старый вид работы с базами данных (сейчас не развивается), ADO - более новый.

Цитата:
Я в справке даже таких методов не нашёл.

Почему же нет? В VBA устанавливаем курсор на ADODB.Connection (на слово Connection) и нажимаем F1. Читаем справку
Автор: novo_again
Дата сообщения: 09.04.2011 16:36
Уважаемые гуру программирования, вот какой вопрос меня мучает. Есть задача в одной таблице с данными по каждому проекту записывать значения показателей для каждого из стандартного набора вопросов. Чтобы было нагляднее, предметная область выглядит так: для каждого проекта по аудиту необходимо оценить величину риска для каждого риска из набора типовых рисков... Проблема в том, что необходимо для каждого проекта предусмотреть возможность оценки рисков нетиповых, не входящих в стандартный набор. Соответственно, я предполагаю, что справочник типовых рисков будет лежать в отдельной таблице. Вот и ломаю голову над тем, куда класть нетиповые риски: то ли делать для них отдельную таблицу данных. Но тогда как то некрасиво получается, нарушается правило бритвы оккама не плодить сущности. Будет ли метологически правильно весь "нестандарт" запихнуть в одну таблицу со стандартными наборами, привязать его к одному риску в справочнике с именем "прочее" и предусмотреть поле комментариев для описания нестандартного риска в таблице с данными?...
Автор: asbo
Дата сообщения: 09.04.2011 17:08
Дык... Что-то не сходится - набор один или несколько?
... из набора типовых рисков ...
... в одну таблицу со стандартными наборами ...

Есть риски. Есть наборы рисков. Каждый набор может содержать как типовые для него риски, так и нетиповые. Предполагаем, что один риск может принадлежать нескольким наборам. Один и тот же риск может быть типовым для одного набора, и нетиповым для другого.

Итого получается: Справочник наборов, Справочник рисков и Объединяющая таблица - набор-риск с дополнительным флагом, указывающим, что данный писк для данного набора является нетиповым. Как-то так...
Автор: novo_again
Дата сообщения: 09.04.2011 17:43
asbo
Уважаемый asbo, искреннее спасибо за отклик! Наличие собеседника - явный признак того, что ты не сходишь с ума
Продолжу про постановку задачи. Есть один набор типовых рисков (больше не будет нужно, а если нужно - по-моему, этим можно пренебречь). Есть набор проектов (по аудиту). Есть оценки величины каждого риска из набора типовых для каждого проекта - собстенно таблица с данными. Так вот мне нужно куда-то в структуру запихнуть возможность проверяющему
отразить нетиповой риск - заранее неизвестный, их может быть неограниченное количество, в одном проекте они могут быть, в другом - нет, они вообще в целом все разные, нестандартные. И, соответственно, для этого непредвиденного риска должна быть возможность завести оценку
его уровня... Еще раз большое спасибо!!!
Автор: asbo
Дата сообщения: 09.04.2011 18:33
novo_again, рад что оказался полезным. А то я испугался, увидев обращение "Уважаемый" - подумал, что же я не так сделал?.. :)

Насколько я представляю себе аудит, результат никогда с первого раза не устраивает заказчика. Приходится на ходу модифицировать не только критерии оценки показателей, но и, подчас, саму методу аудита. Пусть даже набор рисков фиксированный, но их веса в совокупной оценке могут (и должны!) меняться. Т.о., совокупность, пусть одинаковых, рисков, но с разными весами, и будет составлять набор. Легко будет сравнивать результаты и влияние на них по-разному взвешенных рисков.

Но Справочник рисков будет нужен по-любому. А необходимость наборов таки возникнет, помяните мое слово :) А нетиповой риск от типового ничем не отличается, по сути... Разве что тем, что возникает он в справочнике уже по ходу дела, не являясь стандартным элементом типовой методологии. Флаг у него прочто стоит, что он нетиповой.

А если практика применения его в оценке устоится, то и станет он, родимый, типовым. Никудыть он, милок, не денется, как говорил покойный Демьян Минеич.... И флаг с него снимут :)
Автор: novo_again
Дата сообщения: 09.04.2011 19:04
asbo
Кажется начинаю понимать... То есть руководитель проекта создает проект в базе и создает для него в таблице с данными набор оценок тяжести последствий и вероятности для каждого из типовых рисков, имеющихся в справочнике.

Далее, если этому руководителю проекта встречается риск, который необходимо оценить в разрезе тяжести и вероятности (аудит, кстати, внутренний), который не входит в стандартный набор, сотрудник заводит такой риск с флагом "Нетиповой"...

Не пойму одного пока - является ли технологически правильным такой новый для меня подход. Дело в том, что раньше в последней версии базы учитывались просто находки/наблюдения/нарушения, а сама формулировка рисков для каждого из них была просто мемо-полем в таблице Data. Теперь стоит задача перейти к оценке типового набора рисков с возможностью добавления к ним нетиповых. Причем этого ужа нужно скрестить с ежом, где все риски нетиповые. С учетом необходимости слияния в последующем данных по всем проектам структура сводной базы становится значительно более насыщенной - что и пугает, наверное.

Получается, что, если раньше агрегировались по всем проектам данные по наблюдениям, теперь будут агрегироваться данные по: рискам, по их оценкам, по наблюдениям.

Вот! Понял, что меня пугает. Если все риски вести в одном справочнике - применительно к моей ситуации это уже будет не совсем справочник в общем смысле, так как обычной практикой должно являться то, что для одних проектов все риски будут нетиповыми всегда (просто в качестве накопления статистики хотя бы временно годик другой), а других - в основном типовыми.

Полагаю, нужно попробовать все-таки последовать Вашему совету...
Автор: novo_again
Дата сообщения: 26.04.2011 17:23
Вопрос по ListBox.
Данный объект формы источником данных использует Recordset, который периодически обновляется по мере действий пользователя. В один прекрасный момент количество записей в нем становится равным нулю. НО: если перед этим количество записей было больше нуля, а какая-либо запись была выделена, то есть ListBox имел определенное Value, это самое Value нихрена не выкорчевывается и не хочет превращаться в Null (
Может быть это така фича и нужно для ListBox написать гигиеническую самоочистку Value, завязанную на .ListCount?

Добавлено:
На самом деле последовательность вот такая: есть Combo, от которого зависит ListBox, а от ListBox зависит SubForm. Так вот чтобы записи в SubForm были актуальны, приходится лепить вот такое:
Private Sub Combo1_AfterUpdate()
Me.Requery
Me.Refresh
If Me.List1.ListCount = 0 Then Me.List1.Value = Null
Me.Requery
Me.Refresh
End Sub

Нечего сказать - изящно...

Добавлено:
Вот так красивше):
Me.List1.Requery
If Me.List1.ListCount = 0 Then Me.List1.Value = Null
Me.Requery
Me.Refresh

Страницы: 1234567891011121314151617

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


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