2017-10-27 10 views
0

一般的な説明を読んだ:MS AccessのOpenRedcordsetは、間違った文字列に

  1. 単一の値を返す私のクエリ2_Total:

    Access Return

  2. 実行ExcelにクエリをエクスポートするVBA機能ファイル:

    My Excel Output

問題:OpenRecordsetが正しいクエリを読んでいません。私のクエリは、私のExcelファイルにエクスポートする必要があります。しかし、私のVBAは間違ったことを指しています。

私の推測では、qry.SQL = "SELECT * FROM [dbo_SO_SalesHistory]"は十分な情報を提供していないと思いますか?

SQL

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") 

    strSQL = strSQL & " [dbo_SO_SalesHistory].[InvoiceDate] Between #" _ 
    & [Forms]![Run]![textBeginOrderDate] & "# And #" _ 
    & [Forms]![Run]![textendorderdate] & "#" 

    qry.SQL = "SELECT * FROM [dbo_SO_SalesHistory]" 

    Set rst = db.OpenRecordset("2_Total", 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 
+2

あなたは非常に混乱しています:1.どこでも使用されていない文字列 'strSQL'でクエリを準備します。 2.どこでも使用されていないQueryDef 'qry'を定義します。 3. Excelファイルに出力する唯一のものは、最初の行と列を返す2_Totalクエリの結果を取得する '最初のレコードセットが含まれているため、表示されているExcelファイルとは関係ありません。 。すべてこれは私にとって謎です。 –

+0

@ThomasG No.3は今問題があります。私の2_Totalクエリは単一の値を返します。これは私のExcelファイルにエクスポートしたいものです。しかし、それはExcelファイルに無関係な文字列を印刷しています。 –

+0

@ThomasGこの問題に関するアドバイスは高く評価されます。私はVBAの初心者です。私のコードでいくつかの問題を指摘したことを感謝してください –

答えて

2

OpenRecordsetクエリ定義を解放考えてみましょう:

qry.SQL = "SELECT * FROM [dbo_SO_SalesHistory]" 
Set qry = Nothing 

Set rst = db.OpenRecordset("2_Total", dbOpenDynaset) 

かより良いのは、を使用して、querydefから直接レコードセットを開きます。


@ThomasGのコメントでは、コードを慎重にチェックし、それに応じて上記の提案を統合してください。このSELECTステートメントは、1行、1列の結果セットを出力していないようです。ただし、投稿されたSQLは1行/ 1列の集計を返します。

strSQL = "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] & "#" 

qry.SQL = strSQL 

しかし、私はより清潔で安全な保守可能なコードにパラメータ化を使用することをお勧めします。

strSQL = "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];" 

qry.SQL = strSQL 

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

Set rst = qry.OpenRecordset(dbOpenDynaset) 

はい、上記のVBA文字列はAccessクエリオブジェクトとして単独で保存する必要があります。したがって、毎回SQLを書き直す必要はありません。毎回異なる動的パラメータをバインドするだけです!

Set qry = db.QueryDefs("2_Total")  ' ABOVE STRING SQL STATEMENT WITH PARAMETERS 

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

Set rst = qry.OpenRecordset(dbOpenDynaset) 
+0

ありがとうございました。私は十分にあなたに感謝することはできません。あなたは素晴らしいと素晴らしいです。お時間をいただき、ありがとうございました。 –

+0

申し訳ありませんが、フォローアップの質問をしてもらえますか?私は、このコレクションの行に見つからないアイテムを取得しています。qry!BeginDate = [Forms]![Run]![textBeginOrderDate]。これに関するアドバイスは高く評価されます! –

+0

クエリは 'PARAMETERS [BeginDate] Datetime、[EndDate] Datetime;'で始まっていますか?名前を '[...]'で囲むようにしてください。更新を参照してください。 – Parfait

1

私はあまり削除してしまったかもしれませんが、 "2_Totals" SQLコードは正確である場合:

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])); 

その後次のコードはそれを検索しますExcelの参照セルに配置します。私はそれを削除したので、クエリが単一の値を返すので意味がないように見えるループがあった。なぜ最後の行が見つかったのか理解できませんが、11行を追加しますが、間違ったセルが変更された場合は、xlRow = xlRow + 11行をコメントアウトしてください。あなたは公式にそれを保存したことがないので、レコードセットの呼び出しはSQLへの変更をクエリの最後に保存されたインスタンスを使用していないよう

Option Explicit 
Public Function TRANS2() 

    Dim xlApp As Excel.Application 
    Dim xlWB As Excel.Workbook 
    Dim xlWS As Excel.Worksheet 
    Dim xlRow As Integer 
    Dim dblOutput As Double 
    Dim db As DAO.Database 

    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) 

    dblOutput = DLookup("[SumOfDollarsSold]", "2_Totals") 

    xlRow = xlRow + 11 

    xlWS.Cells(xlRow, 11).Value = dblOutput 

rq_Exit: 
    Set xlWS = Nothing 
    xlWB.Close acSaveYes 
    Set xlWB = Nothing 
    xlApp.Quit 
    Set xlApp = Nothing 
    Set db = Nothing 
End Function 
+0

元の生データにDSum()を使用し、DSum()に日付フィルタを組み込むことができます。 – June7

+0

@ June7 trueのように、基準は既に保存されたクエリに組み込まれているようですので、クエリを使用する方が簡単だったようです。 – MoondogsMaDawg

+1

また、該当します。私は決して動的なパラメータ化されたクエリを使用しません。 DSum()は1つ少ないクエリオブジェクトを意味します。 – June7

関連する問題