2012-12-11 4 views
4

У меня очень сложный процесс, который включает в себя загрузку нескольких файлов из разных долей, объединение этих файлов в рабочие таблицы, манипулирование и вычисление связанной информации, а затем экспорт определенных полей (и вычислений) в виде отчетов в ряд книг Excel.VBA Выполнение кода из ComboBox

У меня этот процесс закодирован так, что я могу нажать одну кнопку, и весь процесс будет выполняться от конца до конца. У меня есть серия текстовых полей, которые функционируют как «индикаторы» (красный - эта часть не прошла, зеленый - эта часть преуспела). Как вы можете себе представить, код для всего процесса является ОГРОМНЫМ (32 страницы при копировании в MSWord) и трудно усваивается, когда у меня есть проблема.

Я понял, что хотел бы поместить код в стол, чтобы он был гораздо более модульным и более легким в использовании. Я установил поле со списком с действием, которое я хочу взять, и второе поле со списком с сообщением/файлом/объектом, с которым я хочу работать (например, Удалить - Таблица 2, Приобретение - Файл 1, Экспорт - Отчет 4). Мне удалось создать инструкцию SQL для выполнения простых вещей, таких как del *, из tbl_test и выполнить их из списков со списком без каких-либо проблем.

Что мне нужно знать, если есть способ поместить в таблицу (поле memo) по существу фрагмент кода, а затем выполнить этот код vba при выборе подходящих комбо.

IE код для 'Acquire - File1' является полностью кодом VBA; он отображает сетевой диск, находит файл, загружает файл и перемещает его в каталог.

IE код для 'Scrub - tblMain_Part1' представляет собой комбинацию кода vba и sql; он проверяет наличие файла (vba), если он находит его, он удаляет часть основной таблицы (sql) и добавляет содержимое найденного файла (sql), а затем обновляет монитор, указывая на то, что он (vba). Если файл не найден, он меняет окно монитора на красный и обновляет заголовок кнопки команды (vba)

Я НЕ гений с vba, но я придерживаюсь своего. Мыслительный процесс, который у меня был, состоял в том, что, если я могу по существу получить код, разбитый на управляемые куски в таблице, я мог бы вызвать код smippets в том порядке, если я хочу запустить весь процесс, или я мог бы просто повторно выполнить части кода при необходимости, выбрав комбинацию действий и отчета/файла/объекта.

Любые мысли/идеи приветствуются.

ответ

2

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

+0

Таким образом, понятие было бы создать ряд общественных подлодки для отдельных участков кода. Внутри таблицы есть общедоступное имя и поле успеха (которое может быть связано с индикаторами монитора), но как бы я мог получить доступ к выполнению кода на основе комбо-полей action-report/file/object .... right теперь мне удалось использовать dlookup для выполнения простых SQL-запросов ... как я могу назвать публичный подраздел на основе этих критериев? –

+0

В ближайшее время я улучшу свой ответ. – HelloW

+1

@StevenCrandall: Один из вариантов: «Application.Run» NameOfSub ». Если вы хотите использовать функции вместо Subs (чтобы вы могли вернуть значение, например, логическое подтверждение успеха), вы можете использовать 'result = Eval (« NameOfFunction »)'. – Heinzi

1

Рассмотрите возможность использования макросов. Вам не нужна таблица. Кроме того, подумайте о переносе вашего жестко запрограммированного SQL на запросы.

+0

Это может быть вопросом вкуса, но лично я бы посоветовал против макросов (код VBA гораздо более надежный) и против запросов на действия (если SQL является частью функциональности подпрограммы, имея его «все в одном месте», намного проще. * Разделите свой код на небольшие подпрограммы!). – Heinzi

+0

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

1

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

 dim strOperation as string 
     strOperation = me!selectionOne 
    Select Case strOperation   
    Case "delete": deleteTable(me!selectionTwo) 
    Case "export": export(me!selectionTwo) 
    case "acquire": acquire(me!selectionTwo)  
    End Select 

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

Это всего лишь одна идея многих, которые вы могли бы использовать для этого.

+0

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

0

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

Я думаю, что было бы лучше, чтобы разделить код в функции, которые возвращают строку, если есть ошибка. В таблице, в которой вы работаете, будет strFunction, strError и strObject полей. Ваш код будет зацикливаться, хотя таблица, выполняющая каждую функцию, основываясь на аргументе case, передавая strObject в виде строки, а затем обновляет strError на основе любых ошибок, которые вы получаете. Вы можете запросить таблицу после этого процесса, чтобы увидеть, какие записи имеют в них ошибки.

Если кнопка называется cmdRunAll, вот код для нее.

Private Sub cmdRunAll_Click() 
    On Error GoTo ErrHandler 
    Dim rst As DAO.Recordset 
    Set rst = CurrentDb.OpenRecordset("tblCode", dbOpenDynaset, dbSeeChanges) 
    If Not rst.EOF Then 
     With rst 
      .MoveFirst 
      Do While Not .EOF 
       .Edit 
       Select Case !strFunction 
        Case "fExport" 
         !strError = fExport(!strObject) 
       End Select 
       .Update 
       .MoveNext 
      Loop 
     End With 
    End If 
    rst.Close 
    Set rst = Nothing 
    MsgBox "Processes complete" 
Exit Sub 
ErrHandler: 
    Debug.Print Err.Description & " cmdRunAll_Click " & Me.Name 
    Resume Next 
End Sub 

Вот простой пример функции

Public Function fExport(strTable As String) As String 
    On Error GoTo ErrHandler 
    Dim strError As String 
    strError = "" 
    DoCmd.TransferText acExportDelim, , strTable, "C:\users\IusedMyUserNameHere\" & strTable & ".txt" 
    fExport = strError 
Exit Function 
ErrHandler: 
    strError = Err.Description 
    Resume Next 
End Function 
+0

@remou в комплекте с обработкой ошибок :) – HelloW

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