2016-06-24 3 views
0

Im new при попытке построить запросы из vba. Я пытаюсь понять, как передать переменную внутри синтаксиса VBA. Помнишь, где я немой?Pass VBA Variable to Access Query (Excel VBA)

Я пробовал это ниже, но появляется ошибка автоматизации, которая появляется. Ive заметил от игры aroudn, что ошибки автоматизации возникают, когда вы просто получили синтаксис неправильно, так что, надеюсь, что-то маленькое?

Любая помощь очень ценится

Sub GetDataFromAccess() 
    Dim cmd As New ADODB.Command, rs As ADODB.Recordset 
    Dim recordNum As Integer 

    recordNum = 7 

    cmd.ActiveConnection = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Ashleysaurus\Desktop" & "\" & "xyzmanu3.accdb" 
    cmd.CommandType = adCmdText 

    cmd.CommandText = "SELECT * FROM Invoice WHERE OrderNumber <" & "'" & recordNum & "'" & "ORDER BY OrderNumber ASC" 

    Set rs = cmd.Execute 
    Sheet1.Range("A2").CopyFromRecordset rs 

    rs.Close 
    cmd.ActiveConnection.Close 

    Debug.Print "Done!" 
End Sub 
+1

Вы помещаете одинарные кавычки вокруг чисел? '... er <" & recordNum & "ORD ..." убедитесь, что вы помещаете пробелы внутри кавычек, или строка все перемешалась. –

+0

Пространства сделали это, geez я знал, что это было что-то простое. Я даже удалил одинарные кавычки b/c, которые им необходимы. Опубликуйте ответ и получите восхитительные отзывы :) –

+1

ах, отдать его Полю X, сегодня я чувствую себя ленивым. –

ответ

2

Предполагая ORDERNUMBER это число, не используйте кавычки. Также убедитесь, что у вас есть пространство перед заказом By:

cmd.CommandText = "SELECT * FROM Invoice WHERE OrderNumber <" & recordNum & " ORDER BY OrderNumber ASC" 
+0

вы забыли процитировать, но вы получите отзывы, когда я позволю мне проверить это как ответ –

3

В процессе обучения для построения VBA запросов, рассмотрим параметризованные запросы и избежать необходимости цитат! Это лучшая практика в отрасли на всех языках при передаче значений в динамических SQL-запросах.

Sub GetDataFromAccess() 
    Dim cmd As New ADODB.Command, rs As ADODB.Recordset 
    Dim recordNum As Integer 

    recordNum = 7 

    With cmd 
     .ActiveConnection = "Provider=Microsoft.ACE.OLEDB.12.0;" _ 
       & "Data Source=C:\Users\Ashleysaurus\Desktop" & "\" & "xyzmanu3.accdb" 
     .CommandType = adCmdText 
     .CommandText = "SELECT * FROM Invoice" _ 
         & " WHERE OrderNumber < ? ORDER BY OrderNumber ASC"  
    End With 

    cmd.Parameters.Append cmd.CreateParameter("recordNumParam", adInteger, adParamInput, 10) 
    cmd.Parameters(0).Value = recordNum 

    Set rs = cmd.Execute 
    Sheet1.Range("A2").CopyFromRecordset rs 

    rs.Close 
    cmd.ActiveConnection.Close 

    Debug.Print "Done!" 

End Sub 
+0

Насколько мне нравится эта обратная связь, ее немного выше моего текущего уровня на данный момент. Я сохраню эту ссылку и научусь настраивать, но в настоящее время я все еще учусь, как «заставить ее работать», я знаю? –

+0

если вы хотите связать мне некоторую документацию, чтобы помочь мне, это будет волной –

+1

Я вас слышу. Изучите это, когда идете. Google - ваш друг по * параметризованным запросам *, поскольку есть много, много, много учебников, блогов, сообщений, других SO-ответов о его использовании и важности – Parfait