powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Обработка выделенного диапазона записей.
36 сообщений из 36, показаны все 2 страниц
Обработка выделенного диапазона записей.
    #32332288
АндрейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно ли в табличной форме выделить мышкой диапазон строк и обрабатывать уже только выделенное(в частности - экспорт в Excell)?
...
Рейтинг: 0 / 0
Обработка выделенного диапазона записей.
    #32332293
Фотография Serge Gavrilov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посмотрите Help по свойствам SelTop, SelHeight
...
Рейтинг: 0 / 0
Обработка выделенного диапазона записей.
    #32332298
АндрейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо! Уже теплее. :)
А как этот блок именно обработать, а не только вычислить координаты?
Имею ввиду код процедуры.
В случае с экспортом в Excell - как на место аргументов "Тип объекта" и "Имя объекта" поместить нечто, что Access поймёт?
...
Рейтинг: 0 / 0
Обработка выделенного диапазона записей.
    #32332402
Фотография Serge Gavrilov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не знаю как вы выполняете экспорт, видимо используете какой-то из методов объекта DoCmd. Я обычно использую Recordset. Поэтому в данном случае, узнав номера выбранных строк я бы просто прошелся по Recordsetclone формы, брал бы нужные значения из полей и вставлял их в ячейки Excel. Можно использовать и метод Excel CopyFromRecordset, но для этого надо сформировать Recordset на основе выбранных записей. Если вам обязательно надо использовать меьоды Docmd, то запоните, например, временную таблицу, выбранными записями и отправте эту таблицу в Excel, например, методом SendObject.
...
Рейтинг: 0 / 0
Обработка выделенного диапазона записей.
    #32332635
АндрейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> про RecordSetClone
Никак не просеку синтаксис программы.
Допустим, N_мл = 3 (№ первой записи в диапазоне), N_ст = 7 (№ последней записи). Хоть какую программу приведите обработки. В Help-е только пример возвращения номеров строки.
Куда эти 3 и 7 вставлять, это ведь не уникальные коды?
Понедельник, утро, туплю......
...
Рейтинг: 0 / 0
Обработка выделенного диапазона записей.
    #32332692
Фотография Serge Gavrilov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Навскидку (м.б. очепятки)
i=1
With Me.RecordsetClone
Do Until .Eof
If i >= N_мл And i <= N_ст then
.....
End if
i = i + 1
if i > N_ст Then Exit Do
.MoveNext
Loop
End With
...
Рейтинг: 0 / 0
Обработка выделенного диапазона записей.
    #32333395
АндрейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Самое интересное осталось между "then" и "end if" :(
Навскидку, из кода получается, что если открыть форму и "сортирнуть" её по какому-нибудь полю, а потом выделить диапазон и т.д...., то перебор записей будет происходить в копии рекордсета формы, а в нём запись №1 может быть совсем не той, какая у меня получилась после сортировки в уже открытой форме.
Я имею ввиду, что в коде перебор строк получается не привязанный к индексам, а "по месту".
Допустим, я "сортирну" записи в табличной форме "по убыванию", выделю первые 3 строки, код, по идее, обработает 3 первые записи в рекордсете, но разве они будут те же, что я выделил?
...
Рейтинг: 0 / 0
Обработка выделенного диапазона записей.
    #32333469
АндрейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И вдогонку вопрос:
На какое событие вешать процедуру?
Например, ситуация- сумма по полю в выделенных записях.
...
Рейтинг: 0 / 0
Обработка выделенного диапазона записей.
    #32333495
Фотография Serge Gavrilov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Допустим, я "сортирну" записи в табличной форме "по убыванию", выделю >первые 3 строки, код, по идее, обработает 3 первые записи в рекордсете, но >разве они будут те же, что я выделил?

Уважаемый АндрейК, проверить ваш вопрос времени надо меньше, чем написать.
Откройте свою табличную форму, отсортируйте какое нибудь поле по алфавиту, откройте окно VBA, в окне отладки (Immediate window) наберите ?forms!ИмяФормы.recordsetclone!ИмяПоля
Алексей
(это я для примера)
Измените сортировку в поле, и снова в окно отладки:
?forms!ИмяФормы.recordsetclone!ИмяПоля
Яков
Ну и ....

>Самое интересное осталось между "then" и "end if" :(
А что там интересного...?
я уже говорил, либо непосредственно вносите значения в ячейки Excel, либо сохраняете выбранный диапазон во временной таблице и ее пихаете в Excel привычным образом.

>На какое событие вешать процедуру?

Это уж как вам удобно, для меня удобнее кнопка...
...
Рейтинг: 0 / 0
Обработка выделенного диапазона записей.
    #32333821
АндрейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кнопка - самое очевидное, конечно.
Но, в случае подсчёта суммы, получается лишнее действие - выделить диапазон + нажать на кнопку. Пробовал вешать процедуру на событие "Текущая запись" - не то: если выделено >1 строки, то хрен чего суммирует. "В запасе" события мыши, а больше ничего на ум не приходит...
(а, может, некуда приходить? :) )
...
Рейтинг: 0 / 0
Обработка выделенного диапазона записей.
    #32333844
Фотография Serge Gavrilov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Когда уже некуда вешаться, остается таймер :)
...
Рейтинг: 0 / 0
Обработка выделенного диапазона записей.
    #32333904
IgorM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А еще можно повесить на кнопку панели инструментов...
...
Рейтинг: 0 / 0
Обработка выделенного диапазона записей.
    #32333914
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чтобы не загромождать место на рабочем столе предлагаю вешать все лишнее на нажатие педали под столом.
...
Рейтинг: 0 / 0
Обработка выделенного диапазона записей.
    #32333935
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Кстати, было бы неплохо сделать Shift с ножным приводом. Когда в одной руке чашка с кофе, то нажимать на Shift было бы удобнее.
...
Рейтинг: 0 / 0
Обработка выделенного диапазона записей.
    #32334176
АндрейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вам бы всё подъ...!
Поставил на событие мыши "кнопка вверх". Проверяю "на левую кнопку" и - вперёд.
...
Рейтинг: 0 / 0
Обработка выделенного диапазона записей.
    #32334189
Фотография Serge Gavrilov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Поставил на событие мыши "кнопка вверх". Проверяю "на левую кнопку" и - вперёд.

Но выделять можно и клавиатурой, лучше уж таймер
...
Рейтинг: 0 / 0
Обработка выделенного диапазона записей.
    #32336892
АндрейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тема та же, объект - список.
Для списка св-ва SelTop и т.д. не подходят.
Как сумму по выделенным записям получить - знаю, а вот как кинуть в Excel выделенные в списке записи?
Вопрос по самому коду "сборки" того самого RecordSet, который потом через OutputTo уйдёт в Excel.
...
Рейтинг: 0 / 0
Обработка выделенного диапазона записей.
    #32337184
фыыф
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
.Selected
...
Рейтинг: 0 / 0
Обработка выделенного диапазона записей.
    #32337211
Фотография AlexJuice
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
The next example uses the same list box control, but prints the values of each column for each selected row in the list box, instead of only the values in the bound column.

Sub AllSelectedData()
Dim frm As Form, ctl As Control
Dim varItm As Variant, intI As Integer

Set frm = Forms!Contacts
Set ctl = frm!Names
For Each varItm In ctl.ItemsSelected
For intI = 0 To ctl.ColumnCount - 1
Debug.Print ctl.Column(intI, varItm)
Next intI
Debug.Print
Next varItm
End Sub

(с) RTFM (рулез, как всегда ;) )
...
Рейтинг: 0 / 0
Обработка выделенного диапазона записей.
    #32337212
Фотография AlexJuice
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...Ага, кажется, промазал :(

А все равно их в цикле получать, так, может, через UNION ;)
Ну или (если один из столбцов списка - ключ таблицы - то через WHERE id IN(здесь собрать строчку через зпт).
В общем, вариантов куча...
...
Рейтинг: 0 / 0
Обработка выделенного диапазона записей.
    #32337434
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кстати тема уже обсуждалась.\r
/topic/58604&hl=
...
Рейтинг: 0 / 0
Обработка выделенного диапазона записей.
    #32337472
АндрейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По ссылке обсуждается как собрать в строку ID выделенных в форме строк, разделяя их запятыми.
У меня другая проблема.
"Собрать" в RecordSet выделенные строки и отправить его в Excell.
Если второй этап мне понятен, то первый - в тумане.
Первое, что пришло на ум(?):
Создать локальную таблицу и в цикле, перебирая выделенные строки списка, добавлять в неё нужные запросом на добавление.
Второе, что пришло, но как предположение:
А можно как-то обойтись без таблицы и запросов на добавление?
Интуичу, что так должно быть быстрее, но текст собственно "сборки" в голове(?) не рождается.
...
Рейтинг: 0 / 0
Обработка выделенного диапазона записей.
    #32337511
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>По ссылке обсуждается как собрать в строку ID выделенных в форме строк, разделяя их запятыми.

если есть идентификаторы записей через запятую то собрать в рекордсет эти записи проще простого

ID_LIST = " 10,20,33,40 "

RS.Open "Select * from Mytable where id IN (" & ID_LIST & ")"
...
Рейтинг: 0 / 0
Обработка выделенного диапазона записей.
    #32337632
АндрейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не так всё гладко.
Запрос-источник данных списка содержит 5 таблиц и 4 условия отбора.
Эти условия и требуют параметры при попытке выполнить выражение:
Set rs = CurrentDb.OpenRecordset("Select * from MойИсточник where id IN (" & ID_LIST & ")")
Т.е надо и параметры прописывать?
...
Рейтинг: 0 / 0
Обработка выделенного диапазона записей.
    #32337662
Фотография Serge Gavrilov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>А можно как-то обойтись без таблицы и запросов на добавление?
>Интуичу, что так должно быть быстрее, но текст собственно "сборки" в голове(?) не рождается.

Зря, по моему, вы насчет скорости беспокоитесь. С таблицей будет быстро, только база будет подпухать, если большие объемы будете таким образом обрабатывать.
А если уж так не хочется, я уже говорил о прямом вводе значений в ячейки Excel. Только схема:
Dim n As Long
Dim oEx As Object
Set oEx = CreateObject("Excel.Application")
oEx.Application.Workbooks.Add
oEx.Application.Workbooks(1).Worksheets(1).Name = "Test"
With Me!Tbl1.Form
.RecordsetClone.MoveFirst
.RecordsetClone.Move .SelTop - 1
Do
n = n + 1
oEx.Range("A" & n) = !Поле1 ' Имена полей
oEx.Range("B" & n) = !Поле2
...................
.RecordsetClone.MoveNext
Loop Until n = .SelHeight
End With
oEx.Visible = True
...
Рейтинг: 0 / 0
Обработка выделенного диапазона записей.
    #32337749
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вместо:
Set rs = CurrentDb.OpenRecordset("Select * from MойИсточник where id IN (" & ID_LIST & ")")
стандартная процедурина:

Код: plaintext
1.
2.
3.
4.
5.
6.
  Set db = CurrentDB()
Dim qdf As QueryDef
  Set qdf = db.CreateQueryDef("")
  qdf.SQL = mySQL
  qdf.Parameters( 0 ) = ...
  qdf.Parameters( 1 ) = ...
  Set rst = qdf.OpenRecordset()

и Фсе. (Этот прием используется обычно чтобы не обрабатывать "сложные" случаи - такие как дублирование кавычек в строковых "параметрах" и т.п. (или форматирование дат) при передаче данных непосредственно в сборку строки динамик ссыкуля. Хотя и последнее не столь сложно, как может показаться.).

ЗЫ. Напомню справку:

>>Пользователь имеет возможность создать временный объект QueryDef, задавая пустую строку в аргументе имя при вызове метода CreateQueryDef. Тот же результат будет получен, если задать пустую строку как значение свойства Name нового объекта QueryDef. Временные объекты QueryDef полезны в ситуации, когда требуется повторно выполнять динамические инструкции SQL без создания постоянных объектов в семействе QueryDefs. Временный объект QueryDef нельзя добавить ни в одно семейство, поскольку пустая строка не является допустимым значением имени постоянного объекта QueryDef.
...
Рейтинг: 0 / 0
Обработка выделенного диапазона записей.
    #32337788
АндрейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всё сделал, но на заключительную строку:
DoCmd.OutputTo rst , , acFormatXLS, , True
получаю: "Несоответствие типа"

Методом CreateQueryDef пытаюсь создать временный запрос, но столкнулся с проблемой, что придётся прописывать длинное условие WHERE в аргументе SQL указанного метода.

Выходит, что указание Parametrs в этом случае бесполезно?
...
Рейтинг: 0 / 0
Обработка выделенного диапазона записей.
    #32337793
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Dim rst As DAO.Recordset
...
Рейтинг: 0 / 0
Обработка выделенного диапазона записей.
    #32337834
АндрейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Полный текст процедуры:
Dim ctl As Control
Dim vItm As Variant
Dim Filtr As String
Dim rs As DAO.Recordset
Dim qd As QueryDef

Set ctl = Me!lСписок
For Each vItm In ctl.ItemsSelected
Filtr = Filtr & ctl.Column(0, vItm) & ", "
Next vItm
Filtr = Left(Filtr, Len(Filtr) - 2)
Set qd = CurrentDb.CreateQueryDef("")
qd.SQL = "Select * from истСписок where ID IN (" & Filtr & ")"

qd.Parameters(0) = [Forms]![мояФорма]![От]
qd.Parameters(1) = [Forms]![мояФорма]![По]
qd.Parameters(2) = [Forms]![мояФорма]![Клиент]
qd.Parameters(3) = [Forms]![мояФорма]![Отбор]

Set rs = qd.OpenRecordset()
DoCmd.OutputTo rs, , acFormatXLS, , True
На последней строке - знакомое сообщение о несоответствии типа и указание на переменную rs (замена её на qd ничего не дала)
...
Рейтинг: 0 / 0
Обработка выделенного диапазона записей.
    #32337842
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
DoCmd.OutputTo типОбъекта [, имяОбъекта] [, форматВывода] [, имяФайла] [, автозагрузка][, файлШаблона]

типОбъекта	Одна из следующих встроенных констант:
acOutputForm (форма)
acOutputModule (модуль)
acOutputQuery (запрос)
acOutputReport (отчет)
acOutputTable (таблица)


Ищи метод .СopyFromRecordset Ёкселя. Он тут самое то.


2.
если в "параметрах" нет никакой бодяги, требующей спец обработки (форматирования дат, дублирования кавычек и т.п.) - просто клей строку в коде и открывай рекордсет.

Если хочешь попользовать уже существующую строку "источника данных" самого списка - програмно отрезай от нее заключительное ";" (если есть) и дошивай свои AND (... IN()). Вот именно тогда параметры можешь и передать как предложено.
!!!Я то считал, что строка с параметрами [Forms]![...]![...] у Вас _УЖЕ_ есть :0)

(правда, если в строке - источнике списка есть ORDER BY, или GROUP, HAVING и т.п. - то можешь программно врезаться _перед_ ними). Но это уже извращение (попадаешь в зависимость от конкретного порядка конструкций SQL. Есть правда предположение, что наилучшее место врезки - это после последнего WHERE в строке. Но оно тоже не всегда верно (подчиненные запросы в условиях отбора)).
...
Рейтинг: 0 / 0
Обработка выделенного диапазона записей.
    #32337858
АндрейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как понял их Хелпа - метод OutPutTo применяется с сохранённым объектам. У меня же - временный QueryDef, а про него в Хелпе что-то ничего нет.
На методы Ёкселя заморачиваться - последний для меня вариант(хотя остался самый железобетонный - таблицаТемр и занесение в неё записей построчно).
...
Рейтинг: 0 / 0
Обработка выделенного диапазона записей.
    #32337883
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в сетке есть статья по скорости вывода разными методами в Ёксель. Так CopyFromRecordset не самый худший.

Есть такая шняга - присоединить таблицу Ёкселя и выгружать набор прямо в нее. На местном сайте один из сторонников -Лох Позорный (войди в "Поиск", выбери участника и Excel).
...
Рейтинг: 0 / 0
Обработка выделенного диапазона записей.
    #32337898
АндрейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так я не спорю о скорости вывода, я о том, что раз CopyFromRecordset - метод Ёкселя, значит надо заморачиваться на подключение библиотеки, создание ссылки на Ёксель ...., а потом не забыть эту ссылку убить.
Значит из Аксесс только через ТемрТаблицу можно решить проблему?
...
Рейтинг: 0 / 0
Обработка выделенного диапазона записей.
    #32337922
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Подключать библиотеку только на разработку.
2. В процессе разработки объектные переменные определять AS OBJECT
3. Все константы библиотеки заменять значениями (вычислить в дебуггере)
4. Убить только объявленные объекты. (скорее всего один или 2).
5. После разработки отлючить библиотеку на фик. (если ты сделал криейтОлеОбьект как Object, то методы подтягиваются по мере надобности).
6. Преимущество: можешь выгрузить в шаблон хранящийся в твоей таблице - связанный объект XL и сохранить результат на диск только если потребует пользователь. (Не заморачиваешься с путями, именами и прочей лабудой). Правда в этом случае отпадают как OUTPUTTO, так и связывание таблицы (несохраненного файла). По крайней мере до момента, пока не сохранишь. Остается CopyFromRecordset и непосредственное редактирование содержимого ячеек (что много медленнее, но универсальнее).

__
Связывание таблицы екселя это не темп таблица. Это табличка, связанная через ISAM ёкселя (пункт Аксесса "внешние данные", тип XL, далее - по пунктам. Можно сделать и программно). Недостаток - надо описать поля на момент связывания, а не просто вывалить все, что получится.
...
Рейтинг: 0 / 0
Обработка выделенного диапазона записей.
    #32337942
АндрейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Связывание таблицы екселя это не темп таблица
я под ТемрТаблицей имел ввиду таблицу в локальной базе, в которую запросом будет добавляться каждая выделенная в списке запись и которую затем можно через OutputTo отоправить в Ёксель.
А на вопрос о временном QueryDef + OutputTo мне так и не ответили ...
...
Рейтинг: 0 / 0
Обработка выделенного диапазона записей.
    #32337964
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>>А на вопрос о временном QueryDef + OutputTo мне так и не ответили

мдя. неужели выдержка из справки не внесла прояснение в затуманненный решением задачи мозг? OutputTo требует либо Имя (у темпа его нет) Либо АКтивности объекта на момент выполнения. Попробуйте открыть темповый запрос (как стандартный аксессовский грид, а не как рекордсет) и сделать его окно активным. :)

А способов много. Например кинуть данные SQL строки в форму (отчет), и опубликовать в XL уже форму (отчет). Только оно Вам надо? Можно генерить не темповую таблу, а _нормальный_ (именованный) qrydef, озаботясь уникальностью имени на момент создания (для разрешения коллизий промеж пользователями/сеансами), и не забывая порушить его по завершении выгрузки. Благо весь процесс от создания до удаления - в одной процедуре. Т.ч. имя хранить долго не надо. Ну и т.п.
...
Рейтинг: 0 / 0
36 сообщений из 36, показаны все 2 страниц
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Обработка выделенного диапазона записей.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]