2017-10-27 1 views
0

일반 설명을 읽기 :MS 액세스 OpenRedcordset 잘못 문자열을

  1. 단일 값을 반환 내 쿼리 2_Total :

    Access Return

  2. 실행 엑셀에 쿼리를 내 보냅니다 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 파일에 출력 할 수있는 것은 첫 번째 행과 열만 반환하는 결과를 가져 오는 '첫 번째'레코드 세트의 포함입니다. 따라서 표시된 Excel 파일과 아무 관계가 없습니다. . 이 모든 것이 나에게 신비 다. –

+0

@ThomasG No.3은 내가 지금 가지고있는 문제/문제입니다. 내 2_Total 쿼리는 내 Excel 파일로 내보낼 수있는 단일 값을 반환합니다. 그러나 Excel 파일에는 관련없는 문자열이 인쇄됩니다. –

+0

@ThomasG이 문제에 대한 조언은 높이 평가 될 것입니다. 나는 VBA의 초보자입니다. 감사합니다. 내 코드에서 몇 가지 문제점을 지적했음을 감사합니다. –

답변

2

저장 OpenRecordset 전에 된 QueryDef을 방출 고려 더 나은 아직, QueryDef.OpenRecordset을 사용하여 querydef에서 레코드 세트를 직접 엽니 다.


@ThomasG의 의견대로 코드를 신중히 확인하고 그에 따라 적절하게 통합하십시오. 이 SELECT 문은 한 행, 한 열 결과 집합을 출력하지 않는 것 같습니다. 그러나 게시 된 SQL은 한 행/한 열 집계를 반환합니다. 귀하가 의도 한 것으로 의심됩니다 :

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 줄을 주석으로 처리하십시오.

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

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

또는를 : 레코드 호출하면 이후 절대 공식은 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 사실, 기준은 이미 저장된 쿼리에 내장되어 있으므로 쿼리를 사용하는 것이 더 쉬워 보입니다. – MoondogsMaDawg

+1

또한 해당됩니다. 나는 동적 인 매개 변수화 된 쿼리를 사용하지 않습니다. DSum()은 쿼리 개체가 1 개 적은 것을 의미 할 수 있습니다. – June7