Использование VBA для создания динамической таблицы в Access 2010 - PullRequest
4 голосов
/ 19 июля 2011

У меня есть база данных Access 2010 с модулем VBA, который выполняет статистический анализ данных. Результаты статистического анализа не могут быть сгенерированы SQL, но они могут быть представлены в табличном формате. Прямо сейчас я могу запустить функцию VBA в окне Immediate, и она будет перебирать результаты и записывать их в терминал с помощью Debug.Print ().

Я бы хотел, чтобы результаты этой функции были доступны для остальной части Access, чтобы я мог создавать запросы и отчеты из таблицы результатов. Итак, что я ищу, так это как превратить мою функцию в «динамическую таблицу» - таблицу, которая на самом деле не хранит данные, но хранит функцию VBA, которая выполняется и динамически заполняет данные таблицы при каждом использовании этой таблицы. .

Я потратил довольно много времени на динамическое создание таблиц с помощью запросов MAKE TABLE или с использованием DDL в VBA, но во всех этих примерах SQL используется для создания новой таблицы из существующих записей. Я не могу использовать SQL для генерации результатов, поэтому я не совсем уверен, как преобразовать результаты в объект, который распознает Access. Отчасти проблема в том, что я просто недостаточно знаком с терминологией Access VBA, чтобы знать, что мне нужно искать.

Мое объявление просто "Public Function GenerateSchedule". Он состоит из трех блоков кода: первый извлекает нужные мне данные из базы данных, используя запрос, и обрабатывает RecordSet в массив. Второй блок выполняет статистический анализ массива, а третий выводит результаты анализа на терминал. Я хотел бы заменить третий блок блоком, который предоставляет результаты в виде таблицы, которая может использоваться остальной частью Access.

Ответы [ 3 ]

8 голосов
/ 19 июля 2011

Я использую следующий код, если не хочу использовать DDL и SQL Query ...

Set dbs = CurrentDb        
Set tbl = dbs.CreateTableDef("tbl_Name")
Set fld = tbl.CreateField("Field1", dbText, 255)
tbl.Fields.Append fld
Set fld = tbl.CreateField("Field2", dbText, 255)
tbl.Fields.Append fld
Set fld = tbl.CreateField("Field3", dbInteger)
tbl.Fields.Append fld
Set fld = tbl.CreateField("Field4", dbCurrency)
tbl.Fields.Append fld
dbs.TableDefs.Append tbl
dbs.TableDefs.Refresh

и если вы хотите добавить запись, вы можете сделать

Dim dbs As DAO.Database
Dim rs As DAO.Recordset

Set dbs = CurrentDb
Set rstVideos = dbs.OpenRecordset("tbl_name")

rs.AddNew    
rs("field1").Value = "TEST "   
rs("field2").Value = "TEXT"   
rs("field3").Value = 1991
rs("field4").Value = 19.99

rstVideos.Update
0 голосов
/ 21 июля 2011

Это звучит как отключенный набор записей, или, может быть, «синтетический набор записей», что ADO может сделать. Я не использую ADO, поэтому не могу дать вам инструкции, но, возможно, это даст вам то, что вам нужно.

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

0 голосов
/ 20 июля 2011

Я не уверен, почему вам нужно поместить полученные данные в массив. Кажется и дополнительный шаг. Если вы можете генерировать статистику из массива, то же самое должно быть возможно в запросе. создайте другой запрос, используя запрос результатов в качестве одного источника записей и сделайте ваши вычисления соответственно для полей, которые вы хотите создать. Если бы мы увидели, что вы пытались сделать, я думаю, это можно было бы сделать проще.

...