Есть таблица Excel, данные которой загружаются в запрос на выборку Access В запросе можно указать разные способы загрузки данных: 1. Загружаются данные всего листа: SELECT [Лист1$].* FROM [Лист1$] IN '' [Excel 12.0;HDR=Yes;IMEX=1;DATABASE=С:\База данных\Файл.xlsx]; 2. Загружаются данные заданных полей: SELECT [Лист1$].[Поле1], [Лист1$].[Поле2],[Лист1$].[Поле3] FROM [Excel 12.0;HDR=YES;IMEX=1;DATABASE= С:\База данных\Файл.xlsx].[Лист1$]
Нужен третий вариант: загрузка данных именованного диапазона или заданного диапазона, например A3:K20. Подскажите, можно ли загружать напрямую из Excel в ЗАПРОС Access данные диапазона? Если да, то как? Знаю как загружать именованный диапазон в Access с помощью сводных таблиц, но нужна загрузка в запрос
B.Key, так не получается... Сборка по теме с учетом моих экспериментов: 1. Данные всего листа SELECT [Лист1$].* FROM [Лист1$] IN '' [Excel 12.0XML;HDR=Yes;IMEX=1;DATABASE=С:\База данных\Файл.xlsx];
2. Данные заданных полей (поля должны стоять в первой строке) SELECT [Лист1$].[Поле1], [Лист1$].[Поле2],[Лист1$].[Поле3] FROM [Excel 12.0XML;HDR=YES;IMEX=1;DATABASE= С:\База данных\Файл.xlsx].[Лист1$]
3. Данные по заданному диапазону SELECT * FROM [Лист1$A6:A11] IN '' [Excel 12.0XML;HDR=Yes;IMEX=1;DATABASE=С:\База данных\Файл.xlsx];
4. Данные по именованному диапазону SELECT * FROM [имя диапазона] IN '' [Excel 12.0XML;HDR=Yes;IMEX=1;DATABASE=С:\База данных\Файл.xlsx];
Загрузка в запрос - не правильная постановка задачи (формулировка). Если я правильно понял, то вам нужно использовать значения из именованного диапазона в запросе на выборку в базе Access. Тогда я бы сделал так: Сначала создаем связанную таблицу в этой базе (линкуем данные), а потом в самой базе выполняем нужный запрос с использованием этой таблицы без заморочек. После выполнения запроса связанную таблицу удаляем.
LVL, обмен данными идет постоянно - это не разовая акция. Поэтому, как я понимаю, при удалении связанной таблицы, данные перестанут загружаться в запрос. Изначально я так и делал, как вы описали (делал связанные таблицы в Access и обращался к ним запросами), но мои эксперименты показали, что если сразу обращаться к данным в файле Excel из запроса с помощью SQL, то скорость обмена данными выше, а заморочек меньше. Если Вы линкуете, то перегружаете базу дополнительными таблицами, мне кажется - это лишнее промежуточное звено, особенно если нужно получать данные не с одного, а с нескольких таких файлов
Ram-zes пишет: обмен данными идет постоянно - это не разовая акция
В чем проблема, не удаляйте связанную таблицу
Цитата
Ram-zes пишет: мои эксперименты показали, что если сразу обращаться к данным в файлеExcel из запроса с помощью SQL, то скорость обмена данными выше
Доля правды в этом есть, вернее даже не так... Варианта 2: 1. Работаете с таблицами посредством SQL (в данном случае прилинковывая таблицу) 2. Формируете запрос с ограничениями сразу в нем (WHERE и т.д.)
Лично я предпочту первый вариант, он более прозрачен и его проще поддерживать, что касается производительности, то да, в теории второй вариант быстрее, но это только в теории, на практике время выполнения запроса врятле будет отличаться значительно. На самом деле вопрос несколько в ином, насколько сложно сформировать запрос сразу со всеми ограничениями? + Нужно ли будет его корректировать и как часто... Поэтому, как я уже сказал, я предпочту первый вариант.
Перечитал ещё раз тему... Хочу уточнить - где находятся данные и куда их нужно вернуть? Я предполагал, что данные находятся в базе Access и вы хотите получать их с помощью запроса в файл Excel, при этом в тексте запроса использовать ограничения указанные в файле Excel... Я правильно вас понял?
Вообще коммуникация очень сложная... Но если коротко то примерно так: Есть файл Excel, куда вносится первичная информация (одно из полей Отдел). Информация поступает в Access и там идет нарезка этой информации на отделы, т.е. в Access есть запросы, которые и делают эту нарезку, скажем на 10 отделов (ну понятно, что в каждом запросе стоит свое условие - название отдела). C этих запросов информация отправляется в другие файлы Excel - по отделам. Там вносится необходимая информация. Затем в Access работают другие запросы, которые уже обращаются к этим файлам Excel и получают информацию в базу, есть консолидирующий запрос, который после, отправляет все данные в исходный файл. При сохранении файлов Excel информация попадает в Access. При обновлении данных в Excel информация закачивается из Access. Ну вот как-то так.
Antubas, может DAO.Recordset и спасет... Но мне об этом не ведомо. Я не профессиональный IT и к сожалению об DAO.Recordset пока ничего не знаю. Можете показать пример кода, я попробую
LVL, ну сейчас с запросами и получением (обменом) информации между файлами проблем нет. Есть другая проблема:
Почему при обновлении данных в файле Excel открывается другой файл, связанный с ним через запрос Access?
Есть файл данные_1.xlsx. Он связан с файлом данные_2.xlsx через запрос Access. Все файлы находятся в локальной сети. Подключение к базе данных Access в Excel идет по ссылке на сетевой диск Data Source=P:\База\... При обновлении файла данные_1.xlsx на компьютере_1 происходит запуск на этом же компьютере файла данные_2.xlsx (в режиме для чтения), если он одновременно открыт на компьютере_2. Если файл данные_2.xlsx закрыт, то обновление в файле данные_1.xlsx происходит без открытия связанного файла Из-за чего так происходит и что сделать, что бы при обновлении файла данные_1.xlsx не запускался файл данные_2.xlsx
Можно ли решить эту проблему через настройку свойств подключения в Excel? В частности в настройке прав доступа: Права доступа (Read - только чтение; ReadWrite - чтение и запись; Share Deny None - никому не отказывать ни в чтении, ни в записи; Share Deny Read - запретить всем работу в режиме чтения; Share Deny Write - запретить всем работу в режиме записи; Share Exclusive - запретить всем работу в режиме чтения/записи; Write - только запись).
Когда я создавал эту тему, то хотел упростить (упорядочить) работу в Access, обнаружил в интернете информацию про прямое обращение к файлам Excel с помощью запросов из Access, но там не было информации о том, как делать такие запросы на диапазоны. Пока ждал помощи, сам разобрался с этими запросами, но вот появилась новая проблемы с обновлением данных (описал выше)
Function status()
Dim db As Database
Dim rst As DAO.Recordset
Dim strSQL As String
Set db = CurrentDb
strSQL = "SELECT [Лист1$].* FROM [Лист1$] IN '' [Excel 12.0;HDR=Yes;IMEX=1;DATABASE=С:\База данных\Файл.xlsx];"
Set rst = db.OpenRecordset(strSQL)
rst.MoveFirst
While Not rst.EOF
rst.Fields("Столбец").Value
rst.MoveNext
Wend
Set rst = Nothing
rst.Close
End Function
Да, совсем забыл, есть еще одно огромное преимущество у SQL запросов перед связанными таблицами. Вы знаете, что Access не берет более 255 столбцов... В моем случае в файлах ведется учет рабочего времени и там создана шкала времени на весь год, т.е. более 360 столбцов. Если вы делаете связанную таблицу, то она возьмет в Access только первы 255 столбцов. Даже если вы создадите именованный диапазон на столбцы после 255 и попытаетесь создать связанную таблицу в Access на этот диапазон, то он ее не подцепит. А вот SQL запрос берет с этого листа любые диапазоны. В начале мне приходилось дублировать вторую половину года на отдельный лист и с него делать связанную таблицу, сейчас же все на одном листе
попробуйте так - при обновлении запроса должно выскочить окно - там и указать ячейку или др (см вроде бы в свойствах выходной таблицы - параметры)...
Код
select * from packs where packs.prday = [?]
или заново сформируйте параметрический (!) запрос через ms query... см пост№23 здесь p.s. и все запросы сваливать в эту ветку, наверно, не надо - лучше см. Правила форума - чуть что, я вас предупредила...
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)