Этот вопрос действительно является дубликатом других вопросов (например, здесь и здесь ), поскольку многие новички в Access ожидают и хотят иметь возможность ссылаться на переменные VBA непосредственно изв операторах SQL.По сути, это одна и та же проблема, независимо от того, является ли она INSERT, UPDATE, SELECT и т.д.различные причины.Но очень мало комментариев и ответов касаются этой проблемы напрямую, поэтому вот другой вид ответа ...
Access SQL не может напрямую ссылаться на переменные модуля VBA. Однако есть пара альтернатив, которые могутработают, но у них есть свои недостатки.
- Доступ к SQL может напрямую ссылаться на публичные функции, объявленные в модулях VBA.Поскольку функции VBA могут по существу обращаться к любой другой переменной или объекту и возвращать значение, он, безусловно, может возвращать значение переменной, которое в противном случае напрямую не доступно для SQL.
- Самая важная проблема, которую необходимо осознать, заключается в том, что контекст, в котором вызывается такая функция, должен быть гарантирован до выполнения запроса.Если запрос, который ссылается на такую функцию, когда-либо называется «не в порядке» (когда переменная не инициализирована должным образом), то это, конечно, приведет к ожидаемому поведению и / или неверным данным.
'* From within a VBA module *
Private moduleVariable As String
Public Sub MySub()
moduleVariable
End Sub
Public Function GetModuleVariable() As String
GetModuleVariable = moduleVariable
End Function
'--- Example SQL statement ---
'INSERT INTO TblCustomers (ID,FName) VALUES (1, GetModuleVariable())
- Специальный объект, к которому можно получить доступ, называется
TempVars
( документы здесь ).Он действительно был разработан для использования с макросами, но Access предоставляет его как объект, напрямую доступный из оператора SQL, так что это технически допустимо. - Самым большим недостатком является то, что значения хранятся как варианты VBA, и SQL не всегда интерпретирует их правильно.Использование явных функций преобразования может решить эту проблему.Пример демонстрирует это, заключая ссылку
TempVars
в CDbl()
.
'* From within a VBA module *
Public Sub MySub()
TempVars.Add "myVariable", 123.45
End Sub
'--- Example SQL statement ---
'INSERT INTO products (ID, Amount) VALUES (100, CDbl(TempVars!myVariable))