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

» VBA for Access

Автор: Sleepwalker
Дата сообщения: 22.06.2005 22:58
clstl
http://forum.ru-board.com/topic.cgi?forum=55&topic=4516#1
Автор: YFred
Дата сообщения: 27.12.2005 22:28
Создал запрос в конструкторе "Запрос1",
как получить данные из этого запроса из VBA (например для того чтобы их затем засунуть в Excel). Помогите очень надо.
Автор: ShIvADeSt
Дата сообщения: 28.12.2005 01:07
YFred

Цитата:
как получить данные из этого запроса из VBA (например для того чтобы их затем засунуть в Excel). Помогите очень надо

Надо создать макрос в Екселе, туда запихнуть код запроса и потом уже сделать заполнение табллицы, либо второй вариант из Акцеза вызвать Ексель при помощи ОЛЕ и заполнить данными таблицу. Для первого случая вот примерный код

Цитата:

Set SrvMA = CreateObject("sqlole.SQLServer") ' Create a SQL Server Object
SrvMA.Connect "сервер", "имя", "пароль"
SqlMA = _"здесь идет запрос"
Set resMA = SrvMA.ExecuteWithResults(SqlMA)

Sht.Cells(rMA, cMA + 1).Formula = resMA.GetColumnString(i, 1) пример получения значения

Автор: YFred
Дата сообщения: 28.12.2005 07:51
ShIvADeSt

Цитата:
второй вариант из Акцеза вызвать Ексель при помощи ОЛЕ и заполнить данными таблицу

Меня интересует этот вариант. Как запустить Excel через OLE я знаю и как данные запихивать тоже. Меня интересует как обратиться к запросу созданному в Access из того же Accessa но из в VBA. Если можно приведите пример.
Автор: AlDol
Дата сообщения: 12.01.2006 21:10
Братцы, подскажите как сделать, что бы VB распознавал русский текст. Я создал БД в Access. Русский из таблицы воспроизводится нормально и все надписи на формах тоже. Но, мне нужно текст присвоить текстбоксу на русском через программный код. Английский текст присваивает нормально, а вот русский VB видит только ???? и поэтому ничего сохранить не может.

У меня главная форма frmCustomers и continuous sub форма Sub_frmCustomers связанная с таблицей. Что бы сохранить место на continuous форме для ввода текста я использую кнопку закрывающую txtNotes поле на continuous форме и использую эту кнопку что бы открыть дополнительную форму frmNotes для ввода текста, который присвоится txtNotes.

frmNotes:
Private Sub Form_Load()

Me.txtNotes.EnterKeyBehavior = True

Me.txtNotes.Requery
Me.txtNotes = Forms![frmCustomers]!Sub_frmCustomers!Notes

End Sub

Private Sub cmdClose_Click()
On Error GoTo Err_cmdClose_Click

Forms![frmCustomers]!Sub_frmCustomers!Notes = Me.txtNotes
'Английский текст здесь присваивается нормально, а русский не распознается

DoCmd.Close acForm, "frmNotes"

Exit_cmdClose_Click:
Exit Sub

Err_cmdClose_Click:
MsgBox Err.Description
Resume Exit_cmdClose_Click

End Sub


Заранее спасибо.
Автор: dneprcomp
Дата сообщения: 13.01.2006 02:28
AlDol
Я уже спрашивал. Определись наконец, VB или VBA! Если работаешь только в Access это VBA. Тогда какая версия Access. Подозреваю, что 97 не поддержит русский. Скорее всего надо будет разбираться с использованием юникода.
PS. Принято писать коментарии перед коментируемой частью, а не после.
Автор: AlDol
Дата сообщения: 13.01.2006 03:01
Dneprcomp
MS VB 6.3
MS Access 2003

Спасибо за помощь. Только что прояснил. В той версии, которая не работала, в следующей строке
Me.txtNotes = Forms![frmCustomers]!Notes

Sub_frmCustomers! было потеряно

В полном варианте Me.txtNotes = Forms![frmCustomers]!Sub_frmCustomers!Notes
вроде работает
Автор: realty
Дата сообщения: 07.08.2006 22:39
Ситуация такая:
Есть база, выкладываю в инет экспортом в html.
Проблемы:
- оптимизация кода при экспорте.
- как сформировать линки формата "http://сайт/цифра(1...N).jpg" в экспортируемой ячейке из поля формата "цифра(1...N)"??
Или есть другие пути, отличные от встроенного экспорта?
Автор: ShamaN
Дата сообщения: 08.08.2006 09:14
dneprcomp
продолжим?

вставил:

Код:
<SCRIPT language=vbscript event=onclick for=Кнопка4>
<!--
Private Sub Command2_Click()
On Error GoTo Err_Command2_Click
Dim strSQL As String
Автор: Anton T
Дата сообщения: 16.08.2006 12:50
В аксессе как можно делать картотека с помощью вба? или в екселе?
Автор: dneprcomp
Дата сообщения: 16.08.2006 20:14
ShamaN
А процитировать msg ошибки не требуется? Да и строку не худо было бы поточнее указать. А то получается что ошибка в 'Private Sub Command2_Click()'
Автор: Anton T
Дата сообщения: 21.11.2006 12:31
У нас в:
две таблице: Контакты и Контакты-2,
две формы: Контакты и Контакты-2 подчиненная форма.
В таблице Контакты(это главная таблица и связанная таблица Контакты-2) имеется 2 поля: КодКонтакта и Фамилия, а в Контакты-2 имеется 4 поля: КодКонтакта, Имя, Отечество, Город, Адрес.
В форме Контакты: Фамилия(поле со списком), Контакты-2 режим табличный.

Как можно сделать в VBA, если в Фамилия "Бондарчук" уже существует, то переход к текущую запису, если Фамилия "Бондаренко" не найден, то создает новый запись?
Автор: AnSoNi
Дата сообщения: 27.12.2006 12:46
Как програмно изменить описание поля таблицы?
создаю поле с помощью ADOX: [имяТаблицы].Columns.Append [имяПоля], ТипПоля, РазмерПоля
а как описание его добавить - незнаю. Подскажите, пожалуйста.
Автор: filemoto
Дата сообщения: 30.12.2006 10:46
Люди помогите, срочно нужно решение такой задачи:

Есть 2 таблицы [main] и [models]
В таблице [main] есть поле "Модели", это поле заполняется значениями из таблицы [models]. А задача такая: нужно организовать 5.000 записей в таблице [main], используя значения из [models] рандомно.
Автор: Dixi257
Дата сообщения: 30.12.2006 11:13
filemoto

Ну, в общем так

Открываешь открываешь рекордсет из таблицы modeles, из него заполняешь массив, заодно, определяешь количество элементов.
Рекордсет закрываешь.
Открываешь рекордсет из таблицы main.
В цикле выбираешь из массива случайные значения, используя функцию Rnd(), и добавляешь их в рекордсет, не забывая обновить после каждого ввода.
Функция Rnd() возвращает случайное число от 0 до 1, это число нужно домножить на количество элементов в массиве плюс 0,5 и взять целую часть, чтобы получить случайный индекс элемента массива. Int(Rnd()*(Nn+0.5))
Рекордсет закрываешь.
Все.
Автор: filemoto
Дата сообщения: 30.12.2006 11:55
Dixi257
спасибо. суть ясна
лУчше кодом конечно...
как там разобрать, где нужно обновление для рекордсета и его закрытие...

и кстати, то, что значения закидываются в массив, а потом заполняется поле, будет ли в этом случае раляция? в смысле, будет ли связь между таблицами? или заполнение тут будет как просто новое слово каждый раз?
Автор: Dixi257
Дата сообщения: 08.01.2007 13:25

Цитата:
в смысле, будет ли связь между таблицами?

Нет, но и задачи такой Вы не ставили.
Если связь нужна она легко организуется, просто в основную таблицу нужно вставлять значение ключевого поля из другой таблицы, а в схеме данных указать связь.

Цитата:
или заполнение тут будет как просто новое слово каждый раз?

Да

Dim Rs1 As Recordset, Rs2 As Recordset

' Тип массива зависит от типа данных
Dim Ms1() As String

Dim k1 As Long, k2 As Long, i As Long
Dim Max1 As Long

Max1 = 5000

Set Rs1 = CurrentDb.OpenRecordset("Modeles", dbOpenDynaset)

k1 = 100
ReDim Ms1(k1) As String
Rs1.MoveFirst
k2 = 0

Do
Ms1(k2) = Rs1("Модели")
Rs1.MoveNext
k2 = k2 + 1
If k2 > k1 Then
k1 = k1 + 100
ReDim Preserve Ms1(k1) As String
End If
Loop Until Rs1.EOF

Rs1.Close

Set Rs2 = CurrentDb.OpenRecordset("Main", dbOpenDynaset)

Randomize Timer

For k1 = 1 To Max1
i = Int(Rnd() * k2 - 0.5)
Rs2.AddNew
Rs2("модели") = Ms1(k1)
Rs2.Update
Next

Rs2.Close
Автор: filemoto
Дата сообщения: 08.01.2007 15:11
спасибо Dixi257 за пример.
мне еще предложили такой вариант:
Option Compare Database
Option Explicit

Public Sub set5000()
Dim dbs As Database

Dim rsModels As Recordset
Dim rsMain As Recordset
Dim MyValue As Long

Dim i As Long

Set dbs = CurrentDb
Set rsModels = dbs.OpenRecordset("models", dbOpenSnapshot)
Set rsMain = dbs.OpenRecordset("main")

rsModels.MoveLast

For i = 1 To 5001

Randomize

MyValue = Int((rsModels.RecordCount * Rnd) + 0)
rsModels.AbsolutePosition = MyValue

rsMain.AddNew

rsMain.Fields("Модели") = rsModels.Fields("Наименование")
rsMain.Update
Next i

End Sub

теперь буду применять на практике... пока пытаюсь понять что они делают
Автор: Dixi257
Дата сообщения: 08.01.2007 15:35

Цитата:
For i = 1 To 5001

Здесь добавляется 5001 запись, а не 5000


Цитата:
rsModels = dbs.OpenRecordset("models", dbOpenSnapshot)

А, да не нужно открывать первый рекордсет для записи, только для чтения


Цитата:
MyValue = Int((rsModels.RecordCount * Rnd) + 0)

Не надо было каждый раз звать rsModels.RecordCount, можно было в переменную один раз записать. +0 не очень мне понятно, ну хотя бы +1E-12, но может так и будет работать, надо проверить на досуге...


Цитата:
rsModels.AbsolutePosition = MyValue

Здесь устанавливают случайную текущую позицию в рекордсете. В общем случае, думаю, это несколько медленние, чем прочитать все в динамический массив и оттуда тянуть. Однако здесь есть гарантия от провлем с нехваткой памяти. Массив может быть очень большой, если таблица моделей огромная.
Работать будет и так и этак.

Автор: filemoto
Дата сообщения: 08.01.2007 16:13
а как сделать чтоб поле было явно привязано к подстановке из другой таблицы? т.е. если поле берёт значение из другой таблицы, то чтоб в это поле нельзя было вставить никакое другое значение, только то, что представлено в той таблице, откуда берутся значения.
Автор: Dixi257
Дата сообщения: 09.01.2007 08:57

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


Это не вопрос программирования как такового. Это вопрос лишь организации интерфейса.
Если ты создаешь форму для ввода данных в таблицу, то этой форме может быть элемент управления "Поле со списком". "Поле со списком" связано с полем заполняемой таблицы. Для "Поля со списком" должно быть указано свойство "Ограничиться списком", а данные в список должны подставляться из индивидуального запроса, который основан на второй таблице из которой беруться значения. Ни строчки кода на VB писать не надо.
Автор: filemoto
Дата сообщения: 09.01.2007 09:22
Dixi257
отлично! именно это я и хотел узнать. всё сделал, всё работает.
слушай, а еще не мог бы помочь в одном вопросе? я нашёл юзерконтрол один, хочу прикрутить его в проект ВБ. но у меня возникает некоторые ошибки. думаю, что это мелочи какие-то, но у меня всё никак не получается. не мог ли бы ты посмотреть сам контрол? вот ссылка http://www.vb.kiev.ua/controls/multiline_treeview_197736.zip ~20кб
Глянь пожалуйста, как использовать ctl и cls в своём проекте.
Автор: dvison
Дата сообщения: 24.01.2007 16:23
Народ, подскажите пожалуйста. Хочу в Access включить возможность просмотра изображений, потом выбранные изображения скопировать в нужную папку. Как это сделать?
Автор: Dixi257
Дата сообщения: 26.01.2007 08:18
dvison

Неужели Вы до сих пор верите в телепатию? Ну никто Вам ничего не ответит на такой вопрос. Надо многое уточнять. Как смотреть, чем смотреть, какие изображения? Что, куда, откуда копировать? Вы для себя определитесь.
Вариант: встроенные элемент Image VB,
вариант: встроенный элемент PictureBox VB,
вариант: платный OCX-элемент для просмотра изображений,
вариант: вызывать внешнюю программу просмотра.
Автор: dvison
Дата сообщения: 26.01.2007 18:26
Я попробовал через стандартный FileDialog msOffice. Открывает эксплоер, а там можно и просмотреть и выбрать картинки. Потом с помощью Public Declare Function SHFileOperation Lib "shell32.dll" Alias "SHFileOperationA" (lpFileOp As Any) As Long
копирую всю выбранную коллекцию в нужную папку.
Завис теперь на проверке - существует ли папка. При использовании FSO - выдает Automation error, а другие методы проверки я не могу найти. Не подскажете? Вобще, каким лучше идти путем для работы с файлами (копирование, удаление, переименование, проверка на существование)? В нете можно посмотреть разные, но мне нужен один универсальный и надежный, а главное, чтоб Access поддерживал, ато FileSystemObject - чето глючит (или я чего-то не знаю)
Автор: Pantera3587
Дата сообщения: 30.01.2007 17:54
Кто подскажет? Есть список1, в котором, например, содержаться фамилии, и есть пустой список2. Вопрос: как прописать в VBA код (процедура: двойное нажатие кнопки), чтобы выбрав из первого списка фамилию она скопировалась во второй список.

Private Sub Список1_DblClick(Cancel As Integer)
Список1. Copy Список2 (???)
End Sub
Автор: Audciz
Дата сообщения: 16.02.2007 11:10
Как в VBA узнать количество строк в таблице (форме).
Реально ли такое реализовать:
Есть таблица, в которой одно поле идет по категориям, т.е. есть определенные значения и они повроторяются. Как узнать эти категории.
Вот пример:
id job
1 Садовод
2 Лесоруб
3 Лесоруб
4 Садовод
5 Танкист
6 Пилот
Хотелось бы достать все виды "job", т.е. "Садовод", "Лесоруб", "Танкист".
Как потом сохранить все эти варианты? Можно в новую таблицу или БД.
Можно было бы сделать это всё вручную, но так как в таблице 94 тыс. записей, хотелось бы это автоматизировать.
Юзал поиск, но ничего толкового не нашел (может не правильно искал?).
Заранее благодарен.

Добавлено:
Да, ещё:
Есть ли нормальный способ нахождения строки в массиве строк, помимо стандартного перебора.

Добавлено:
Пока сделал поиск через перебор. Чем дольше работает прога, тем медленнее.
Как альтернативу хоетлось бы попробовать делать Query на Query, т.е., чтобы можно было бы последовательно отфильтровывать данные, т.е. чтобы при изменении фильтра не менялся прежний.
Что-то в этом роде. Не знаю, как сказать лучше.
Обращайтесь за разъяснениями.
Автор: AndVGri
Дата сообщения: 16.02.2007 15:42
Audciz



Цитата:
Как в VBA узнать количество строк в таблице


Public Sub RecordCount()
Dim mdb As DAO.Database
Dim rec As DAO.Recordset

Set mdb = Application.CurrentDb
Set rec = mdb.OpenRecordset("Select Count(*) As recCount From MyTable;")

Debug.Print rec.Fields("recCount").Value
End Sub


Цитата:
Есть таблица, в которой одно поле идет по категориям, т.е. есть определенные значения и они повроторяются. Как узнать эти категории.


Public Sub GetAllJobs()
Dim mdb As DAO.Database
Dim rec As DAO.Recordset

Set mdb = Application.CurrentDb
Set rec = mdb.OpenRecordset("Select job From MyTable Group By job;")
rec.MoveFirst
Do Until rec.EOF
Debug.Print rec.Fields("job").Value
rec.MoveNext
Loop
End Sub


Цитата:
Как потом сохранить все эти варианты? Можно в новую таблицу


Public Sub CreateJobTable()
Dim mdb As DAO.Database

Set mdb = Application.CurrentDb
mdb.Execute "Select job Into MyJobTable From MyTable Group By job;"
End Sub
Автор: lmnik
Дата сообщения: 18.02.2007 19:30
На форме есть поле с выпадающим списком и поля для заполнения данных.
Данные разбиты по регионам. Есть выпадающее поле со списком регионов. Можно ли сделать чтобы при выборе региона форма "переходила" на соответствующую запись т.е. остальные поля обновлялись вместе с полем "регионы"?
Автор: Audciz
Дата сообщения: 20.02.2007 05:21
AndVGri
Компилятор ругается на

Код: Dim mdb As DAO.Database
Dim rec As DAO.Recordset

Страницы: 1234567891011121314151617

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


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