2013-08-21 2 views
0

Хорошо, друзья, я оставляю свою работу через полтора недели, и я пытаюсь сделать то, что я сделал легче для моего босса. У него нет доступа к знаниям, поэтому я пытаюсь создать форму, которая будет автоматизировать отчеты, которые я генерирую. Вместо того, чтобы создавать разные формы для всех разных отчетов, я пытаюсь автоматизировать его из таблицы параметров. Вот что я собираюсь сделать: У меня есть таблица, которую я создал, которая состоит из 5 полей. Я хотел бы использовать эти поля для заполнения полей параметров в стандартном шаблоне формы. Пять полей в моей таблице следующим образом:Автоматический выбор запроса на основе поля со списком на форме

  1. Тип запроса выполняющиеся (результат выплюнуть)
  2. Запросы, которые генерируют этот отчет, разделенных запятой и без пробелов. "QRYNAMEA,QRYNAMEB"
  3. Таблица которые генерируют эти запросы, которые будут использоваться transferspreadsheet
  4. Адресата первенствует файл, который уже имеет сводную таблицу, созданную для подачи данных.
  5. Входной лист этого файла excel. В настоящее время все эти листы называются «Input». (что не имеет значения)

Моя проблема связана с тем, что я не знаю, куда идти после того, как я сделал свой комбинированный блок. Я знаю достаточно Visual Basic для автоматизации моих запросов, но недостаточно, чтобы заполнить форму информацией в 3,4 и 5 (до сих пор я вручную менял их для разных запросов). Я понятия не имею, как искать запись в таблице по выбору в «selectbox», а затем выбирать отдельные поля из этого в моей автоматизации.

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

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

Редактировать: Мой наклон в этот момент должен создать запрос для этой таблицы, который будет возвращать одно поле в зависимости от ввода, который я даю. Я могу представить, как это делается в SQL, но я до сих пор не знаю, как заполнить формы, и не извлекать полевой объект из таблицы, как только я получу его.

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

Заключительный изменить: Код полируется (не так много на пути обработки ошибок):

  1. Первый метод, который тянет поля из таблицы и заполнит форму, активируется путем выбора новая запись в поле со списком и выглядит следующим образом:

    Private Sub QuerySelect_Change() 
    Dim db As Database 
    Dim rec As Recordset 
    
    Set db = CurrentDb 
    Set rec = db.OpenRecordset("SELECT [Queries to Run], [Source Table], [Destination Spreadsheet], [Destination Sheet Name] FROM TBL_QRY_SETTINGS WHERE TBL_QRY_SETTINGS.[Query Type] Like '" & [Forms]![QuerySelector]![QuerySelect] & "';") 
    [Forms]![QuerySelector]![QueriesToRun].Value = rec("Queries to Run") 
    [Forms]![QuerySelector]![SourceTable].Value = rec("Source Table") 
    [Forms]![QuerySelector]![FileDest].Value = rec("Destination Spreadsheet") 
    [Forms]![QuerySelector]![SheetName].Value = rec("Destination Sheet Name") 
    Set rec = Nothing 
    Set db = Nothing 
    
    End Sub 
    
  2. Второй код тянет, что данные для выполнения запроса. Мне нравится, как это получилось. Он запускается при нажатии кнопки рядом с выпадающим списком.

    Private Sub DynamicQuery_Click() 
    Dim qryArray As Variant 
    Dim i As Integer 
    
    qryArray = Split([Forms]![QuerySelector]![QueriesToRun], ",") 
    DoCmd.SetWarnings False 
    For i = LBound(qryArray) To UBound(qryArray) 
        Debug.Print qryArray(i) 
        DoCmd.OpenQuery (qryArray(i)) 
    Next 
    DoCmd.SetWarnings True 
    DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, [Forms]![QuerySelector]![SourceTable], _ 
        [Forms]![QuerySelector]![FileDest], _ 
         True, [Forms]![QuerySelector]![SheetName] 
    End Sub 
    

Обратите внимание, что конечный код части (1) почти такая же, как выбранный ответ, за исключением того, что я захватывая более одного поля. Это работает, потому что я знаю, что у меня есть уникальные «Типы запросов», и мой набор записей будет содержать только одну запись.

В любом случае, я надеюсь, что некоторые люди наткнутся на это и сочтут это полезным. Send me a message if you do. Насколько я могу судить по кратким поисковым запросам, такого рода автоматизация не была достигнута при доступе. Это должно облегчить доступ к неграмотным, чтобы запускать свои собственные запросы и быть простым для дизайнеров, чтобы добавить, если они хотят, чтобы все их запросы были доступны через несколько кликов.

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

+0

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

+0

@HansUp Я не могу вставить фотографию в сообщение, и я не могу понять способ ее форматирования, поэтому вот скриншот: http://i.imgur.com/EuTi5bY.png Верхний ряд является единственным, связанным с ним, но все они следуют одному и тому же форматированию. – GMoany

ответ

1

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

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

Am I понимание того, что правильно?

EDIT: Это заполнит переменную (MyRandomField) с содержимым поля в таблице

Dim db as Database 
Dim rec as Recordset 

set db = CurrentDB 
set rec = db.OpenRecordSet("Select SomeField from SomeTable Where Something = 'SomethingElse'") 

MyRandomField = rec("SomeFieldName") 

set rec = Nothing 
set db = Nothing 
+0

Не совсем, если другие комбинированные поля не будут «автозаполнять» в зависимости от того, что содержит мой первый. Невозможно ли взять результат запроса и передать его в форму? Потому что прямо сейчас я собираюсь запросить мою таблицу для полей, которые соответствуют моей записи со списком, а затем считывая эти значения в текстовые поля в другом месте формы, аналогично значению по умолчанию. Мой большой вопрос: «Как я могу присвоить значение из таблицы или запроса переменной в vba?» Кажется, что это должно быть что-то прямое, все рассмотрено. – GMoany

+0

@GMoany - Посмотрите мое редактирование выше. Это заполнит переменную содержимым поля в таблице или запросе. То есть, если предложение WHERE возвращает только 1 запись из таблицы/запроса. В противном случае вы можете использовать цикл «Do While rec.EOF = False» для прокрутки каждой возвращенной записи. –

+0

Это прекрасно. Я был в vba, пытаясь открыть таблицу как объект excel, но это то, что мне действительно нужно. Спасибо, сэр. – GMoany

Смежные вопросы