Загрузка данных из Access с использованием даты окончания месяца и функции - PullRequest
0 голосов
/ 17 июня 2019

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

В настоящее время у меня возникают проблемы с получением информации для загрузки из Access.

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

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

Я читал в Интернете, что мне нужно использовать функцию для получения моей переменной из поля ввода (box) для работы в запросе Access.Мне интересно, связано ли это с тем, как я настроил свою функцию.Или есть проблема с моим запросом доступа.

Sub Expense_Download()
    '
    ' Expense_Download Macro
    '
    Dim cnn As ADODB.Connection, rs As ADODB.Recordset, sQRY As String, strFilePath As String, box As Variant, myvar As Variant
    strFilePath = "C:\Users\NVanWyk\Documents\Fidato\Lunch And Learn\Lunch and Learn Access DB\Nate's Expenses DB.accdb"   'Replace the ‘DatabaseFolder’ and ‘myDB.accdb’ with your DB path and DB name

    Set cnn = New ADODB.Connection
    Set rs = New ADODB.Recordset

    box = InputBox("What month do you want expense data for? Please use the MM/DD/YYYY format.", "Expense Month?")

    If Not IsDate(box) Then MsgBox "Value entered is not a valid date, please try again.", , "Input Value is Not Correct"
    End

    myvar = box

    cnn.Open "provider = microsoft.ace.oledb.12.0;" & _
        "Data Source=" & strFilePath & ";"
    'have to indent the data source or the code does not run

    sQRY = "SELECT * FROM Expenses Where Expenses.Expense_Month=myvar()" 'Replace ‘tblData’ with your Access DB Table name or Query name from which you want to download the data"

    rs.CursorLocation = adUseClient
    rs.Open myvar(), sQRY, cnn, adOpenStatic, adLockReadOnly

    Application.ScreenUpdating = False

    Sheet1.Range("A2").CopyFromRecordset rs
    'sheet 1 for whatever reason still pastes to the "expense" sheet

    rs.Close
    Set rs = Nothing

    cnn.Close
    Set cnn = Nothing

    Exit Sub
End Sub

Ответы [ 2 ]

0 голосов
/ 17 июня 2019

Спасибо за помощь всем!

Я внес изменения выше и провел некоторые другие исследования и смог заставить код работать.Я думаю, что загвоздка была в том, что я использовал дату (MM/DD/YYYY) в качестве переменной, мне нужно было добавить знаки # в запрос, чтобы Access распознал переменную как дату.

Sub Expense_Download()
    '
    ' Expense_Download Macro
    '
    Dim cnn As ADODB.Connection, rs As ADODB.Recordset, sQRY As String, strFilePath As String, box As Variant, myvar As Variant

    strFilePath = "C:\Users\NVanWyk\Documents\Fidato\Lunch And Learn\Lunch and Learn Access DB\Nate's Expenses DB.accdb"   'Replace the ‘DatabaseFolder’ and ‘myDB.accdb’ with your DB path and DB name

    Set cnn = New ADODB.Connection
    Set rs = New ADODB.Recordset

    box = InputBox("What month do you want expense data for? Please use the MM/DD/YYYY format.", "Expense Month?")
    If Not IsDate(box) Then
        MsgBox "Value entered is not a valid date, please try again.", , "Input Value is Not Correct"
        End
    End If
    myvar = box

    cnn.Open "provider = microsoft.ace.oledb.12.0;" & _
        "Data Source=" & strFilePath & ";"
    'have to indent the data source or the code does not run

    sQRY = "SELECT * FROM Expenses Where Expenses.Expense_Month= #" & myvar & "#" 'Replace ‘tblData’ with your Access DB Table name or Query name from which you want to download the data"
    ' access query
    ' # before and after the "myvar" variable are necessary for access to recognize the variable as a date and to run the query successfully.

    rs.CursorLocation = adUseClient

    rs.Open sQRY, cnn, adOpenStatic, adLockReadOnly

    Application.ScreenUpdating = False

    Sheet1.Range("A2").CopyFromRecordset rs
    'sheet 1 for whatever reason still pastes to the "expense" sheet

    rs.Close
    Set rs = Nothing

    cnn.Close
    Set cnn = Nothing

    Exit Sub
End Sub
0 голосов
/ 17 июня 2019

Прежде всего, строка, содержащая только слово «End», остановит выполнение.

Если вы хотите остановить выполнение в случае неправильного ввода пользователя, сделайте следующее:

If Not IsDate(box) Then
    MsgBox "Value entered is not a valid date, please try again.", , "Input Value is Not Correct"
    End 'or Exit Sub
End If

Вы сохраняете введенные пользователем месячные в переменной myvar, но фактически не добавляете их в запрос выбора.

Вместо этого:

sQRY = "SELECT * FROM Expenses Where Expenses.Expense_Month=myvar()"

Попробуйте это:

sQRY = "SELECT * FROM Expenses Where Expenses.Expense_Month= " & myvar

Однако ожидаемое в InputBox значение не очевидно. Я предполагаю, что это число от 1 до 12, а поле Expense_Month тоже есть в вашей базе данных. Если он также содержит год в формате ГГГГ-ММ и является varchar, вам необходимо изменить код следующим образом:

sQRY = "SELECT * FROM Expenses Where Expenses.Expense_Month= '" & myvar & "'"

Любое из вышеперечисленного верно, IsDate не является правильной функцией для проверки правильности ввода. Например, если пользователь введет 20 в поле, он вернет True, поскольку это дата, но 20 января 1900 года.

Также удалите из этой строки первый параметр myvar () .

rs.Open myvar(), sQRY, cnn, adOpenStatic, adLockReadOnly

rs.Open sQRY, cnn, adOpenStatic, adLockReadOnly

На основании вашего дополнительного ввода я рекомендую использовать YYYY-MM-DD в качестве пользовательского ввода. Таким образом, ваш запрос будет определен как:

sQRY = "SELECT * FROM Expenses Where Expenses.Expense_Month= '" & myvar & "'"

Чтобы проверить ваш запрос, откройте окна Locals в редакторе VB, посмотрите, каково значение sQRY, когда выполнение достигнет этой точки, и запустите его в редакторе SQL Access, чтобы увидеть, будет ли оно работать.

...