Доступ к vba-коду без экспорта в EXCEL "Слишком мало параметров. Ожидается 1." - PullRequest
0 голосов
/ 19 марта 2020

У меня есть некоторый код, который я ранее получил из одной из моих других баз данных Access, который работает нормально. Его целью было скопировать результаты, которые были помещены в рабочую таблицу, в пустой лист Excel, а затем отформатировать столбцы.

Однако я скопировал код и немного подправил его. То, что я пытаюсь сделать с помощью скопированного кода, все еще экспортирует мои результаты в чистый лист Excel, однако на этот раз я копируюсь не из таблицы make, а из запроса select. Я не уверен, если это возможно, но у меня нет другого способа превратить это в таблицу make, это должен быть запрос select. Есть ли способ помочь кому-нибудь? Код, который у меня сейчас есть:

Option Compare Database
Public Function Export_EXCEL()


Dim dbs As DAO.Database
Dim Response As Integer
Dim strSQL As String
Dim Query1 As String
Dim LTotal As String
  Dim Excel_App As Excel.Application 'Creates Blank Excel File
  Dim strTable As String ' Table in access
    Dim queryDelete As String 'SQL to delete records in local table
    Dim strAssigned As DAO.Recordset

'-------------------------------------------------------------------------------
strTable = "Select * From cso_sup_SETUP" 'Access Query I am trying to copy

    Set Excel_App = CreateObject("Excel.Application")
        Set dbs = CurrentDb
'-------------------------------------------------------------------------------
Dim rs As DAO.Recordset
Set rs = dbs.OpenRecordset(strTable)

    Excel_App.Visible = True

Dim wkb As Excel.Workbook
  Set wkb = Excel_App.Workbooks.Add

Dim rg As Excel.Range
Dim i As Long
' Add the headings
For i = 0 To rs.Fields.Count - 1
    wkb.Sheets(1).Cells(1, i + 1).Value = rs.Fields(i).Name
Next i

Set rg = wkb.Sheets(1).Cells(2, 1)
rg.CopyFromRecordset rs

' make pretty
rg.CurrentRegion.EntireColumn.AutoFit


Set rs = Nothing
Set wkb = Nothing
Set dbs = Nothing

End Function

Это модифицированный код ниже:

Option Compare Database
Public Function Export_EXCEL()


Dim dbs As DAO.Database
Dim Response As Integer
Dim strSQL As String
Dim Query1 As String
Dim LTotal As String
  Dim Excel_App As Excel.Application 'Creates Blank Excel File
  Dim strTable As String ' Table in access
   Dim queryDelete As String 'SQL to delete records in local table
   Dim strAssigned As DAO.Recordset

 Dim rs As DAO.Recordset
 Dim db As DAO.Database
 Dim prm As DAO.Parameter
 Dim qdf As DAO.QueryDef

 '-------------------------------------------------------------------------------
 strTable = "Select * From cso_sup_SETUP" 'Access Query I am trying to copy

Set Excel_App = New Excel.Application
    Set dbs = CurrentDb
 '-------------------------------------------------------------------------------

Set rs = QuerDef.OpenRecordset(strTable)

Excel_App.Visible = True

Dim wkb As Excel.Workbook
  Set wkb = Excel_App.Workbooks.Add

Dim rg As Excel.Range
Dim i As Long
 ' Add the headings
For i = 0 To rs.Fields.Count - 1
   wkb.Sheets(1).Cells(1, i + 1).Value = rs.Fields(i).Name
 Next i

Set rg = wkb.Sheets(1).Cells(2, 1)
rg.CopyFromRecordset rs

' make pretty
rg.CurrentRegion.EntireColumn.AutoFit


 Set rs = Nothing
 Set wkb = Nothing
 Set dbs = Nothing

 End Function

Ответы [ 2 ]

1 голос
/ 22 марта 2020

У вас есть доступ QueryDef (сохраненный запрос) с именем "cso_sup_SETUP" . Этот запрос ссылается на элемент управления в форме ... что-то вроде Forms!MyForm!MyTextbox. Когда вы открываете этот запрос в конструкторе запросов Access, он может получить значение текстового поля, в котором нуждается запрос. Однако, когда вы пытаетесь использовать запрос с методом DAO OpenRecordset, он не может извлечь значение текстового поля и обрабатывает Forms!MyForm!MyTextbox как параметр, для которого вы не указали значение.

Вы можете загрузить Recordset, задав для переменной объекта значение QueryDef, а затем указав значение элемента управления формы в виде Parameter перед вызовом метода QueryDef.OpenRecordset.

Примечание ваша проблема на самом деле не имеет ничего общего с Excel --- это чисто проблема доступа. Итак, вот код Access VBA, который должен дать вам Recordset Я думаю, что вам нужно. Предложите вам создать новую процедуру в вашем модуле кода, чтобы проверить это. Как только он заработает, добавьте биты Excel из исходной процедуры или адаптируйте оригинал, чтобы использовать это.

Также настоятельно рекомендуем добавить Option Explicit в раздел Объявления вашего модуля. Поместите его на новую строку сразу под Option Compare Database

Dim rs As DAO.Recordset
Dim db As DAO.Database
Dim prm As DAO.Parameter
Dim qdf As DAO.QueryDef

Set db = CurrentDb
Set qdf = db.QueryDefs("cso_sup_SETUP")
For Each prm In qdf.Parameters
    prm.value = Eval(prm.Name)
Next
Set rs = qdf.OpenRecordset(dbOpenDynaset)
1 голос
/ 20 марта 2020

Эта ошибка имеет одну из двух причин:

Причина 1 - Вы указали имя поля в запросе cso_sup_SETUP, которого нет в базовой таблице. В этом случае Access обрабатывает несуществующее поле как «параметр» и выдает ошибку Too few parameters, если вы пытаетесь открыть его в коде.

Причина 2 - У вас есть определил параметр в запросе cso_sup_SETUP, но не предоставил значение в коде.

Исправления:

Исправление 1 - Удалить несуществующее поле или исправить орфография (ищите Expr1)

Fix 2 - Введите значение параметра в коде согласно предложению HansUp.

...