Vba sql: Using Excel VBA to Query a SQL Server Database

Excel VBA. SQL-запросы в подключениях

UPDATE 21.10.15 Добавил «обратный» макрос — VBA в SQL и макрос для доступа к строке запроса SQL

Некоторое время назад я прошел несколько курсов по SQL. И мне было очень интересно — какую часть из мощного инструмента под названием T-SQL можно применять без использования SQL-Server (не дают мне сервачек под мои нужды, хнык-хнык).

Итак… Начнем с простого — подключение через Query Table в VBA. Можно записать через макрорекордер — для этого нужно создать подключение через Microsoft Query.

Выбираем Excel Files, указываем путь к файлу (пытаясь при этом не ругать разработчиков за интерфейс из 90х годов), фильтруем как-угодно поля. Нам сейчас это не важно — главное получить код, который дальше можно будет корректировать.

Должно получится что-то вроде этого:

[code language=»vb»]
Sub Макрос1()
With ActiveSheet.ListObjects.Add(SourceType:=0, Source:=Array(Array( _
«ODBC;DSN=Excel Files;DBQ=D:\Dropbox\Excel\тест excel_SQL-2015. xlsx;DefaultDir=D:\Dropbox\Excel;DriverId=1046;MaxBufferSize=2048;Page» _
), Array(«Timeout=5;»)), Destination:=Range(«$A$1»)).QueryTable
.CommandType = 0
.CommandText = Array( _
«SELECT Продажи.F2, Продажи.F3» & Chr(13) & «FROM `D:\Dropbox\Excel\тест excel_SQL-2015.xlsx`.Продажи Продажи» _
)
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.PreserveColumnInfo = True
.ListObject.DisplayName = «Таблица_Запрос_из_Excel_Files»
.Refresh BackgroundQuery:=False
End With
End Sub
[/code]

Строчка .CommandText = «SELECT…» — отвечает за SQL запрос. Если хотя бы немного почитать поисковую выдачу google по запросу QueryTable можно упростить код до следующего:

[code language=»vb»]
Sub CopyFromRecordset_To_Range()

DBPath = «C:\InputData. xlsx»
sconnect = «Provider=MSDASQL.1;DSN=Excel Files;DBQ=» & DBPath & «;HDR=Yes’;»
Conn.Open sconnect
sSQLSting = «SELECT * FROM [Sheet1$]»

rs.Open sSQLSting, Conn
Set QT1 = ActiveSheet.QueryTables.Add(rs, Range(«A1»))
QT1.Refresh

rs.Close
Conn.Close

End Sub
[/code]

Теперь начинаем копаться глубже — какого уровня запросы можно строить из VBA. Самые-самые базовые, основные конструкции — все работает, все ок.

Заполнение нового столбца одинаковым значением

[code language=»sql»]
SELECT ‘YTikhonov’, *
FROM [Sheet1$]
[/code]

Переименование столбцов

[code language=»sql»]
SELECT [Advertiser] AS ‘Рекламодатель’, [Quantity] AS ‘Количество’
FROM [Sheet1$]
[/code]

Фильтрация записей

[code language=»sql»]
SELECT *
FROM [Sheet1$]
WHERE [Year] = 2014
[/code]

Сортировка

[code language=»sql»]
SELECT *
FROM [Sheet1$]
ORDER BY [Advertiser] DESC
[/code]

Агрегация записей

[code language=»sql»]
SELECT [Advertiser], Sum([Cost])
FROM [Sheet1$]
GROUP BY [Advertiser]
[/code]

Работа с датой

Дату можно впрямую через конструкцию

[code language=»sql»]
[SomeDateField] = {ts ‘2015-01-01 00:00:00’}
[/code]

Но я люблю отталкиваться от текущей даты. За пару текущая дата-время отвечает функция SYSDATETIME() и она может вернуть в том числе текущий день. Для этого нужна еще одна функция  — CONVERT(type,value)

[code language=»sql»]
SELECT CONVERT(date,SYSDATETIME())
[/code]

С функцией DATEFROMPARTS строка запроса в Excel почему-то не дружит, поэтому придется использовать костыли функцию DATEADD:

[code language=»sql»]
DATEADD(minute, 59, DATEADD(hour, 23, DATEADD(month, MONTH(SYSDATETIME())+1, DATEADD(year, YEAR(SYSDATETIME()) — 1900, 0))))-1
[/code]

Эта строчка в любой день октября 2015 вернет значение — 30.11.15 23:59

А теперь — немного best practice!

Объединение + Агрегация + Join + Подзапросы. И самое интересное — подключение к нескольким источникам:

[code language=»sql»]
SELECT [Year], O.Numbers, SCost, SVolume, SQuantity FROM
(
SELECT [Year], Month, SUM([Cost RUB]) AS SCost, SUM(Volume) AS SVolume, SUM(Quantity) AS SQuantity FROM
(
SELECT Advertiser, 2013 as [Year], Month, [Cost RUB], Quantity, Volume
FROM [N:\GK\Radio\Маркетинг\Служебный\2013. xlsb].[Мониторинг$]
UNION
SELECT Advertiser, 2014 as [Year], Month, [Cost RUB], Quantity, Volume
FROM [N:\GK\Radio\Маркетинг\Служебный\2014.xlsb].[Мониторинг$]
UNION
SELECT Advertiser, 2015 as [Year], Month, [Cost RUB], Quantity, Volume
FROM [N:\GK\Radio\Маркетинг\Служебный\2015.xlsb].[Мониторинг$]
)
WHERE [Advertiser] = ‘METRO GROUP’
GROUP BY [Year], Month
) as T INNER JOIN [C:\test\Month.xlsb].[Test$] AS O
ON T.[Month] = O.[Month]
[/code]

Одна проблема — если осуществлять такого вида запрос для соединения нескольких Excel-файлов, он будет выполняться достаточно медленно. У меня вышло порядка 2 минут. Но не стоит думать что это бесполезно — если подобные запросы выполнять при подключении к SQL-серверу, то время обработки будет 1-2 секунды (само собой, все зависит от сложности запроса, базы, и прочие прочие факторы).

Бонусы

Формировать более-менее сложный запрос SQL вручную в VBA мягко говоря неудобно.  Поэтому я написал мини-макрос, который берет информацию из буфера обмена, и возвращает туда строчки для вставки в VBE.

[code language=»vb»]
‘работа с буфером обмена http://excelvba.ru/code/clipboard
Private Function ClipboardText() ‘ чтение из буфера обмена
With GetObject(«New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}»)
.GetFromClipboard
ClipboardText = .GetText
End With
End Function

Private Sub SetClipboardText(ByVal txt$) ‘ запись в буфер обмена
With GetObject(«New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}»)
.SetText txt$
.PutInClipboard
End With
End Sub

Public Sub SQL_String_To_VBA()

Dim sInput As String, sOut As String
Dim ArrInput, i As Integer

Dim cIdent As Integer: cIdent = 1 ‘Count of tabs
Dim sVar As String: sVar = «strSQL» ‘Name of variable

sInput = ClipboardText()

ArrInput = Split(sInput, Chr(13))

For i = LBound(ArrInput) To UBound(ArrInput)
sOut = sOut & sVar & » = » & sVar & » & » & Chr(34)
sOut = sOut & String(cIdent, Chr(9))
sOut = sOut & Replace(ArrInput(i), Chr(10), «»)
sOut = sOut & Chr(34) & «& chr(10)» & Chr(10)
Next i

SetClipboardText (sOut)

End Sub

Public Sub VBA_String_To_SQL()

Dim sInput As String, sOut As String
Dim ArrInput, i As Integer, sTemp

sInput = ClipboardText()

ArrInput = Split(sInput, Chr(10))

For i = LBound(ArrInput) To UBound(ArrInput)
sTemp = Replace(ArrInput(i), «& chr(10)», «»)
If Right(sTemp, 1) = » » Then sTemp = Left(sTemp, Len(sTemp) — 1)
If Right(sTemp, 1) = Chr(34) Then sTemp = Left(sTemp, Len(sTemp) — 1)

If Len(sTemp) > 0 Then
sTemp = Right(sTemp, Len(sTemp) — InStr(1, sTemp, Chr(34)))
sOut = sOut & Chr(10) & sTemp
End If
Next i

SetClipboardText (sOut)

End Sub
[/code]

Сами запросы просто и удобно создавать, например, используя Notepad++. Создали многострочный запрос SQL, копируете его в буфер обмена, запускаете макрос и вуаля — в буфере обмена строчки кода, готовые для вставки в ваши макросы. При желании вы можете настроить название переменной и количество табуляций.

И еще один небольшой бонус. Если у вас есть отчет по менеджерам/руководителям, построенный на запросах, то вам наверняка потребуется получать доступ к строке запроса через VBA. Сделать это можно через замечательную команду .CommandText — работает на чтение и запись. Мне для формирования отчета на 25 человек очень пригодился.

[code language=»vb»]
Public Sub ReplaceCommandText()

Dim con As WorkbookConnection
Dim sTemp As String

For Each con In ActiveWorkbook.Connections
sTemp = con.ODBCConnection.CommandText
con.ODBCConnection.CommandText = sTemp
con.Refresh
Next con

End Sub
[/code]

PS Ссылка с ответом на вопрос — как вставить данные из Excel в SQL
https://www.simple-talk.com/sql/t-sql-programming/questions-about-using-tsql-to-import-excel-data-you-were-too-shy-to-ask/

 

Приятного использования!

Резюме «Аналитик данных (Python, SQL, VBA, 1С, Excel, Power Pivot, BI)», Одесса — Work.

ua

Резюме от 31 мая 2023Подробнее»>PRO

Аналитик данных (Python, SQL, VBA, 1С, Excel, Power Pivot, BI), 50 000 грн

Занятость:
Полная занятость.
Возраст:
35 лет
Город:
Одесса

Соискатель указал
телефонПодробнее» data-original-title=»» title=»»>,
эл. почту и
адрес.

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

Получить контакты этого кандидата можно на странице www.work.ua/resumes/3420068


Опыт работы

Аналитик баз данных

с 07.2021 по наст. время
(1 год 11 месяцев)
Rea Head Family Corporation, Одесса (Розничная торговля)

— Анализ баз данных с помощью различных методов и систем (Excel, VBA, Python, Power Pivot, PowerBI, 1С)

— Пишу сложные программы на VBA (макросы) и Python для анализа данных

— Полная автоматизация отчетов и процессов (которые возможно автоматизировать)

— Создание telegram ботов на асинхронной библиотеке aiogram

— Обратный инжиниринг

— Другие необходимые программы

— Готов предоставить работы.

Быстро, самостоятельно изучаю новые методы и направления (Django, PyQt, PostgreSQL, MySQL, SQLite, HTML, CSS и т. д.) если это необходимо в проекте.

Аналитик программист

с 11.2017 по 07.2021
(3 года 8 месяцев)
ТД Интмакс, Одесса (Энергетика)

Обязанности:

— Аналитика структур и методов работы предприятия (по согласованию с директором).

— Выявление слабых мест.

— Разработка предложений и методов по устранению слабых мест.

— Внедрение методов.

— Анализ систем и программ написанных уже не работающими инженерами, полный их разбор по программному коду и внедрению более надежной их версии.

Достижение:

Самостоятельно изучил систему производства, на основании чего

разработал, написал и внедрил несколько больших систем для автоматического расчета данных важных для предприятия.

Программы были написаны мной на базе Эксель (Могу предоставить примеры на собеседовании).

Так же, на базе 1С были предложены и, с помощью программистов 1С, внедрены некоторые доработки по ведению складского учета, расчета предварительной себестоимости и т. д.

Руководитель коммерческой службы и экспорта товара

с 06.2015 по 11.2017
(2 года 5 месяцев)
ООО «Форес», Одесса (Пищевая промышленность)

— Разработка и внедрение структуры производства,

— Разработка плана продаж, бюджета,

— Расчёт плановой прибыли, себестоимости,

— Создание резервных фондов, фонда развития,

— Расчёт мотивации сотрудников.

— Контроль выполнения поставленных задач на производстве, снабжении, сбыта.

— Контроль дебиторской задолженности.

— Разработка методов по продвижению товара.

— Опыт в бух. и управленческом учете. Контроль над бухгалтерией, отделом продаж, отделом снабжения, отделом ВЭД, производством.

— Отчётность напрямую с собственником компании.

— Выезды в командировки для контроля дистрибьюторов, решение конфликтных ситуаций с клиентами (в том числе и зарубежные),

— Контроль региональных менеджеров, постановка задач.

— Активное участие в налоговых проверках, активное участие в разработке нового кадрового учёта (контроль над количеством сотрудников и их верное оформление).

— Разработка и внедрение в 1С 8.3 всей структуры работы и контроля для управленческого учета.

— Создание и внедрение новых дизайнов товара,

— Переход на новое ДСТУ 2017 года.

Менеджер ВЭД

с 01.2008 по 06.2015
(7 лет 5 месяцев)
ОМЖК, Хай рейз констракшн,, Одесса (Экспорт, импорт)

Все операции связанные с Экспортом, импортом различных товаров.


Образование

ОНПУ

РТФ, Одесса
Высшее, с 1999 по 2004 (4 года 9 месяцев)


Знания и навыки

MS Excel
MS Word
Adobe Photoshop
1С УТП
Программирование
SQL
MS Power BI
Python
MySQL
Pandas
Power Pivot
Mathplotlib
Aiogram
DAX
VBA


Дополнительная информация

Навыки:

— Специалист 1С УТП и УПП 8. 3 (Полное ведение, обучение, работа с консолью отчетов.)

— Работа с конфигуратором, проверка работы доработок программистами, создание инструкций, как для программистов, так и для пользователей.

— Знание управленческого учета. Бух учет – базовый уровень.

— Поставил (с нуля) несколько учетных систем на рынке 7км на базе 1С УТП 8.3 для нескольких сетей магазинов, обучил сотрудников. До сих пор консультирую при необходимости.

— Эксель уверенный пользователь в стандартной базе. Так же программист на VBA Excel.

— Написал несколько сложных программ на базе Эксель, как доработки для 1С, для аналитики и инженерного отдела.

— Так же, на базе Эксель, написал несколько учетных систем, типа учет склада, взаиморасчетов и т.д.

— Очень быстро обучаюсь и подстраиваюсь под нужды компании и её задачи.

-Владение иностранным языком: Английский – Intermediate.

-ПК, уверенный пользователь: MS office, 1C 8.3.

-Владение автомобилем:

Категория «В» с 2002 года

Хобби: Чтение, музыка, спорт.

Дополнительная информация:

— Аналитический склад ума

— Очень быстро адаптируюсь и обучаюсь

— Лидерские качества

— Нацеленность на результат

-Общительный

-Целеустремленный

-Коммуникабельный

-Пунктуальный

-Внимательный

-Стрессоустойчивый.

-Без вредных привычек.


Предложить вакансию


Использование Excel VBA для запросов к базе данных SQL Server

Автор: mandy.doward

Теги: 

VBA, Excel, Access, SQL Server 0 комментариев

Хотя мы можем создавать внешние наборы данных в Excel, которые извлекают информацию из База данных SQL Server бывают случаи, когда вы хотите проверить значение или найти значение в базовой базе данных SQL Server непосредственно из формулы Excel.

С помощью VBA мы можем сделать это!

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

 

VBA для запроса к базе данных SQL Server

Следующая функция VBA может использоваться из проекта Excel VBA. Однако сначала вам потребуется добавить в проект библиотеку ADODB.

 Открытая функция LookupAWCustomerRevenue (intID As Long) как валюта
    Dim conn As ADODB.Connection
    Dim rs As ADODB.Recordset
    Dim strConnString как строка
 
    Если intID = 0 Тогда
        LookupAWCustomerRevenue = 0
    Еще
        strConnString = "Поставщик = SQLOLEDB; Источник данных = W10NBMJD\SQL2014;" _
                        & "Исходный каталог=AdventureWorks2014;Интегрированная безопасность=SSPI;"
        
        Установить conn = новый ADODB.Connection
        conn.Open strConnString
        Установите rs = conn.Execute («ВЫБЕРИТЕ СУММУ (TotalDue) AS CustRev FROM Sales.SalesOrderHeader WHERE CustomerID = « & intID)
        
        Если Не ЯвляетсяЧисловым(rs.Fields("CustRev").Value) Then
            LookupAWCustomerRevenue = 0
        Еще
            LookupAWCustomerRevenue = rs. Fields("CustRev").Value
            rs.Закрыть
        Конец, если
    Конец, если
    
Завершить функцию 

В этом примере мы используем подключение ADO для подключения к экземпляру SQL Server (DBSRV\SQL2014):

 strConnString = "Provider=SQLOLEDB;Источник данных=DBSRV\SQL2014;" _
                        & "Исходный каталог=AdventureWorks2014;Интегрированная безопасность=SSPI;" 
  • Параметр Provider указывает, что будет установлено соединение OLDEB, а параметр Data Source указывает на экземпляр SQL Server.
  • Параметр Initial Catalog идентифицирует запрашиваемую базу данных (AdventureWorks2014)
  • Параметр «Встроенная безопасность» указывает, что для проверки подлинности с помощью SQL Server будет использоваться проверка подлинности Windows.

Объект RecordSet (rs) используется для создания набора записей из оператора SELECT:

 Set rs = conn.Execute("SELECT SUM(TotalDue) AS CustRev FROM Sales.SalesOrderHeader WHERE CustomerID = " & intID) 

Оператор SELECT состоит из буквальной строки и значения переменной intID, которое передается в функцию при ее вызове.

Оператор If в начале проверяет значение intID, равное 0. Целочисленные переменные по умолчанию имеют нулевое значение, если они не инициализированы (другими словами, если при вызове функции не указано значение). Если в функцию не передается значение, в качестве значения дохода возвращается значение 0 .

 Если intID = 0 Тогда
               LookupAWCustomerRevenue = 0 

Второй оператор If проверяет нечисловое значение, возвращаемое оператором SELECT. Если идентификатор клиента, переданный в функцию, действителен, но они не разместили ни одного заказа, выражение SUM(TotalDue) вернет значение 9.0047 Значение NULL . Если это произойдет, функция вместо этого вернет значение 0.

 Если не числовой(rs.Fields("CustRev").Value) Then
            LookupAWCustomerRevenue = 0 

Сценарий со значением NULL показан на следующем снимке экрана.

 

Я поместил точку останова в строку кода VBA, содержащую оператор If, и открыл окно Locals , чтобы увидеть все значения переменных в этой точке выполнения.

Я проверил функцию, выполнив ее из окна Immediate в редакторе VBA:

 ?LookupAWCustomerRevenue(1) 

С установленной точкой останова выполнение кода автоматически останавливается на отмеченной строке и позволяет нам просматривать среду в этой точке. исполнения.

Окно Locals на приведенном выше снимке экрана показывает объектную переменную Recordset rs и, в частности, значение первого поля из rs, «CustRev». Мы видим, что он установлен на Нуль . Это связано с тем, что клиент со значением CustomerID, равным 1, не разместил ни одного заказа и, следовательно, не имеет результирующего значения дохода.

На следующем снимке экрана показано, что запрос возвращает NULL при выполнении непосредственно на экземпляре SQL Server:

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

 LookupAWCustomerRevenue = rs.Fields("CustRev").Value 

 

Вызов функции VBA из формулы Excel

Вызов функции VBA из формулы Excel прост. Когда вы создаете формулу Excel, вводя ее в ячейку, intellisense отобразит соответствующие функции VBA, а также встроенные функции. На следующем снимке экрана показано это:

 

Вы можете видеть, что есть две перечисленные выше функции VBA, которые начинаются с Lo : LookupAWCustomerRevenue и LookupPersonName .

В следующем примере показано, как функция LookupAWCustomerRevemue используется в ячейке для вычисления общего дохода для значения CustomerID, указанного в столбце A листа: кодирование, некоторые методы обработки ошибок и отладки VBA, и мы увидели, как мы можем вызывать функции VBA из формулы Excel. Не стесняйтесь обращаться к нам по электронной почте [email protected], если у вас есть какие-либо вопросы, касающиеся этой статьи. Существует также версия этой статьи для Access.

Если вы хотите узнать больше о каких-либо методах, описанных в этой статье, или о программировании VBA, почему бы не взглянуть на наши учебные курсы Excel и Access VBA.

Если вы хотите узнать больше о работе с базой данных SQL Server, посмотрите наши учебные курсы по SQL Server.

Вы можете обнаружить, что эти курсы время от времени появляются в предложении поздней доступности, предлагая экономию в размере 30%.

 

 

 

Поделиться этой публикацией

Создание операторов SQL, включающих переменные и элементы управления

  • Статья

При работе с объектами доступа к данным (DAO) или объектами данных ActiveX (ADO) может потребоваться создание оператора SQL в коде. Это иногда называют «встроенным» кодом SQL.

Например, если вы создаете новый объект QueryDef, вы должны установить для его свойства SQL допустимую строку SQL. Но если вы используете объект набора записей ADO, вы должны установить для его свойства Source допустимую строку SQL.

Чтобы создать оператор SQL, создайте запрос в сетке конструктора запросов, переключитесь в представление SQL, а затем скопируйте и вставьте соответствующий оператор SQL в свой код.

Часто запрос должен основываться на значениях, которые предоставляет пользователь, или на значениях, которые изменяются в различных ситуациях. В этом случае вам необходимо включить в запрос переменные или управляющие значения. Ядро базы данных Access обрабатывает все операторы SQL, но не переменные или элементы управления. Таким образом, вы должны построить свою инструкцию SQL так, чтобы Access сначала определял эти значения, а затем объединял их в инструкцию SQL, которая передается в ядро ​​базы данных Access.

В следующем примере показано, как создать объект QueryDef с помощью простого оператора SQL. Этот запрос возвращает все заказы из таблицы Orders, размещенные после 31 марта 2006 г.

 Public Sub GetOrders()
 
   Dim dbs как DAO.Database
   Dim qdf как DAO.QueryDef
   Dim strSQL как строка
 
   Установите dbs = CurrentDb
   strSQL = "SELECT * FROM Orders WHERE OrderDate >#3-31-2006#;"
   Установите qdf = dbs.CreateQueryDef("Вторая четверть", strSQL)
 
Конец сабвуфера
 

В следующем примере создаются те же QueryDef с использованием значения, хранящегося в переменной. Имейте в виду, что знаки номера (#), которые обозначают значения даты, должны быть включены в строку, чтобы они были объединены со значением даты.

 Dim dbs как база данных, qdf как QueryDef, strSQL как строка
Dim dteStart As Date
dteStart = #3-31-2006#
Установите dbs = CurrentDb
strSQL = "SELECT * FROM Orders WHERE OrderDate" _
    & "> #" & dteStart & "#;"
Установите qdf = dbs. CreateQueryDef("Вторая четверть", strSQL)
 

В следующем примере создается объект QueryDef с использованием значения в элементе управления с именем OrderDate в форме Orders. Имейте в виду, что вы предоставляете полную ссылку на элемент управления и включаете числовые знаки (#), которые обозначают дату в строке.

 Dim dbs как база данных, qdf как QueryDef, strSQL как строка
Установите dbs = CurrentDb
strSQL = "SELECT * FROM Orders WHERE OrderDate" _
    & "> #" & Формы!Заказы!ДатаЗаказа & "#;"
Установите qdf = dbs.CreateQueryDef("Вторая четверть", strSQL)
 

В этом разделе вы создадите те же операторы, что и в предыдущем разделе, но на этот раз с использованием ADO в качестве метода доступа к данным.

В следующем примере кода показано, как создать объект QueryDef с помощью простой инструкции SQL. Этот запрос возвращает все заказы из таблицы Orders, размещенные после 31 марта 2006 г.

 Dim dbs As Database, qdf As QueryDef, strSQL As String
Установите dbs = CurrentDb
strSQL = "SELECT * FROM Orders WHERE OrderDate >#3-31-2006#;"
Установите qdf = dbs. CreateQueryDef("Вторая четверть", strSQL)
 

В следующем примере создается тот же объект QueryDef с использованием значения, хранящегося в переменной. Имейте в виду, что знаки номера (#), которые обозначают значения даты, должны быть включены в строку, чтобы они были объединены со значением даты.

 Dim dbs как база данных, qdf как QueryDef, strSQL как строка
Dim dteStart As Date
dteStart = #3-31-2006#
Установите dbs = CurrentDb
strSQL = "SELECT * FROM Orders WHERE OrderDate" _
    & "> #" & dteStart & "#;"
Установите qdf = dbs.CreateQueryDef("Вторая четверть", strSQL)
 

В следующем примере кода создается объект QueryDef с использованием значения в элементе управления с именем OrderDate в форме Orders. Имейте в виду, что он предоставляет полную ссылку на элемент управления и включает числовые знаки, обозначающие дату в строке.

 Dim dbs как база данных, qdf как QueryDef, strSQL как строка
Установите dbs = CurrentDb
strSQL = "SELECT * FROM Orders WHERE OrderDate" _
& "> #" & Формы!Заказы!ДатаЗаказа & "#;"
Установите qdf = dbs.