2017-10-30 181 views
0

これは、MS Access OpenRedcordset reading wrong stringのフォローアップの質問です。私はOpenRecordSetメソッドに値を渡すために十分なパラメータ、フィールド宣言を持っていると確信していますが、私はまだ固執しています。MS Access OpenRecordsetでパラメータが少なすぎる

一般的な説明:私のクエリをフィルタし、フォーム上の

  1. ユーザー入力の開始日と終了日を2_Total(単一の値)My query
  2. は、ExcelファイルにクエリをエクスポートするVBA関数を実行します

問題パラメータが少なすぎます。 4エラー SQL

Set rst = qry.OpenRecordset(dbOpenDynaset)の期待Design View

PARAMETERS [BeginDate] DateTime, [EndDate] DateTime; 
SELECT Sum(dbo_SO_SalesHistory.DollarsSold) AS SumOfDollarsSold 
FROM dbo_SO_SalesHistory 
WHERE (((dbo_SO_SalesHistory.InvoiceDate) Between [Forms]![RUN]![textBeginOrderDate] And [Forms]![RUN]![textendorderdate])); 

VBA

Option Compare Database 

Option Explicit 
Public Function Trans2() 

    Dim xlApp As Excel.Application 
    Dim xlWB As Excel.Workbook 
    Dim xlWS As Excel.Worksheet 
    Dim acRng As Variant 
    Dim xlRow As Integer 

    Dim db As DAO.Database 
    Dim qry As QueryDef 
    Dim rst As Recordset 
    Dim prm As DAO.Parameter 
    Dim strSQL As String 

    Set db = CurrentDb 
    Set xlApp = New Excel.Application 
    Set xlWB = xlApp.Workbooks.Open("C:\Users\J\Desktop\August 2017.xlsx") 
    Set xlWS = xlWB.Worksheets("Totals") 

    xlRow = (xlWS.Columns("K").End(xlDown).Row) 

    Set qry = db.QueryDefs("2_Total") 

    qry![BeginDate] = [Forms]![Run]![textBeginOrderDate] 
    qry![EndDate] = [Forms]![Run]![textendorderdate] 

    Set rst = qry.OpenRecordset(dbOpenDynaset) 

    Dim c As Integer 
    c = 11 'C is the one that stores column number, in which c=1 means column A, 11 is for column K, 12 for Column L 
    xlRow = xlRow + 11 

    Do Until rst.EOF 
     For Each acRng In rst.Fields 
      xlWS.Cells(xlRow, c).Formula = acRng 
      c = c + 1 
     Next acRng 
     xlRow = xlRow + 1 
     c = 1 
     rst.MoveNext 
     If xlRow > 25 Then GoTo rq_Exit 
    Loop 


rq_Exit: 
    rst.Close 
    Set rst = Nothing 
    Set xlWS = Nothing 
    xlWB.Close acSaveYes 
    Set xlWB = Nothing 
    xlApp.Quit 
    Set xlApp = Nothing 
    Exit Function 

End Function 

以下は、問題を解決していません。私はまだパラメータが少なすぎます。予想される4エラー。

qry.Parameters("BeginDate").Value = [Forms]![Run]![textBeginOrderDate] 
qry.Parameters("EndDate").Value = [Forms]![Run]![textendorderdate] 
+0

の可能性のある重複した[それは、Microsoft Accessの更新クエリでプログラムパラメータを渡すことは可能ですか?](HTTPS ://stackoverflow.com/questions/16568461/is-it-possible-to-pass-parameters-programmatically-in-a-microsoft-access-update) –

答えて

0

は、構文を試してみてください。qry.Parameters("BeginDate").Value = Forms![Run]![textBeginOrderDate]

ます。また、それはあなたが期待値であることを確認するためにdebug.print Forms![Run]![textBeginOrderDate]の行を追加することができます。

https://stackoverflow.com/a/24535025/78522

別の可能性は、クエリを変更し、BeginDateとSQLでEndDateに句の基準

+0

ありがとうございました。しかし、私はまだ同じエラー、あまりにも少ないarametersを取得します。予期した4. –

0

セットとして例
[Forms]![Run]![textBeginOrderDate]のために使用することです:

PARAMETERS [BeginDate] DateTime, [EndDate] DateTime; 
SELECT Sum(dbo_SO_SalesHistory.DollarsSold) AS SumOfDollarsSold 
FROM dbo_SO_SalesHistory 
WHERE dbo_SO_SalesHistory.InvoiceDate Between [BeginDate] And [EndDate]; 
+0

ここにリンクした最後の質問に答えるのに、[my solution](https://stackoverflow.com/a/46983213/1422451)の方がこの正確なSQLステートメントを使用しました。上記の記事では、パラメータを宣言していますが、使用したことはありません。したがって、エラー。この考え方は、フォーム制御値をVBA内の**外部の**パラメータ**にバインドすることです。 – Parfait

0

はこれを試してみてください。

PARAMETERS 
    [Forms]![RUN]![textBeginOrderDate] DateTime, 
    [Forms]![RUN]![textendorderdate] DateTime; 
SELECT 
    Sum(dbo_SO_SalesHistory.DollarsSold) AS SumOfDollarsSold 
FROM 
    dbo_SO_SalesHistory 
WHERE 
    (((dbo_SO_SalesHistory.InvoiceDate) 
    Between [Forms]![RUN]![textBeginOrderDate] 
    And [Forms]![RUN]![textendorderdate])); 
0

クエリでこのSQLを試してみてください。

SELECT 
     Sum(dbo_so_salesHistory.DollarsSold) AS SumOforderamt, 
     Min(dbo_so_salesHistory.InvoiceDate) AS MinOforderdate, 
     Max(dbo_so_salesHistory.InvoiceDate) AS MaxOforderdate, 
     Count(dbo_so_salesHistory.InvoiceDate) AS CountOforderdate, 
     forms!run![textBeginOrderDate] AS tbegin, 
     forms!run![textendorderdate] AS tend 
    FROM dbo_so_salesHistory 
    WHERE 
     (((dbo_so_salesHistory.InvoiceDate) Between 
     [forms]![run]![textBeginOrderDate] And 
     [forms]![run]![textendorderdate])) 
    GROUP BY 
     forms!run![textBeginOrderDate], 
     forms!run![textendorderdate]; 

と、このVBAコード:

Private Sub cmdRun_Click() 
    Dim db As DAO.Database 
    Dim qry As QueryDef 
    Dim rst As Recordset 

    Set db = CurrentDb 

    Set qry = db.QueryDefs("2_Total") 
    qry.Parameters(0).Value = Forms!Run![textBeginOrderDate] 
    qry.Parameters(1).Value = Forms!Run![textendorderdate] 

    Set rst = qry.OpenRecordset(dbOpenDynaset) 

End Sub 
関連する問題