|
|
|
Обработка выделенного диапазона записей.
|
|||
|---|---|---|---|
|
#18+
Можно ли в табличной форме выделить мышкой диапазон строк и обрабатывать уже только выделенное(в частности - экспорт в Excell)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2003, 10:20 |
|
||
|
Обработка выделенного диапазона записей.
|
|||
|---|---|---|---|
|
#18+
Посмотрите Help по свойствам SelTop, SelHeight ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2003, 10:42 |
|
||
|
Обработка выделенного диапазона записей.
|
|||
|---|---|---|---|
|
#18+
Спасибо! Уже теплее. :) А как этот блок именно обработать, а не только вычислить координаты? Имею ввиду код процедуры. В случае с экспортом в Excell - как на место аргументов "Тип объекта" и "Имя объекта" поместить нечто, что Access поймёт? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2003, 11:23 |
|
||
|
Обработка выделенного диапазона записей.
|
|||
|---|---|---|---|
|
#18+
Я не знаю как вы выполняете экспорт, видимо используете какой-то из методов объекта DoCmd. Я обычно использую Recordset. Поэтому в данном случае, узнав номера выбранных строк я бы просто прошелся по Recordsetclone формы, брал бы нужные значения из полей и вставлял их в ячейки Excel. Можно использовать и метод Excel CopyFromRecordset, но для этого надо сформировать Recordset на основе выбранных записей. Если вам обязательно надо использовать меьоды Docmd, то запоните, например, временную таблицу, выбранными записями и отправте эту таблицу в Excel, например, методом SendObject. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2003, 16:53 |
|
||
|
Обработка выделенного диапазона записей.
|
|||
|---|---|---|---|
|
#18+
> про RecordSetClone Никак не просеку синтаксис программы. Допустим, N_мл = 3 (№ первой записи в диапазоне), N_ст = 7 (№ последней записи). Хоть какую программу приведите обработки. В Help-е только пример возвращения номеров строки. Куда эти 3 и 7 вставлять, это ведь не уникальные коды? Понедельник, утро, туплю...... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2003, 10:33 |
|
||
|
Обработка выделенного диапазона записей.
|
|||
|---|---|---|---|
|
#18+
Навскидку (м.б. очепятки) 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2003, 11:29 |
|
||
|
Обработка выделенного диапазона записей.
|
|||
|---|---|---|---|
|
#18+
Самое интересное осталось между "then" и "end if" :( Навскидку, из кода получается, что если открыть форму и "сортирнуть" её по какому-нибудь полю, а потом выделить диапазон и т.д...., то перебор записей будет происходить в копии рекордсета формы, а в нём запись №1 может быть совсем не той, какая у меня получилась после сортировки в уже открытой форме. Я имею ввиду, что в коде перебор строк получается не привязанный к индексам, а "по месту". Допустим, я "сортирну" записи в табличной форме "по убыванию", выделю первые 3 строки, код, по идее, обработает 3 первые записи в рекордсете, но разве они будут те же, что я выделил? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2003, 17:41 |
|
||
|
Обработка выделенного диапазона записей.
|
|||
|---|---|---|---|
|
#18+
И вдогонку вопрос: На какое событие вешать процедуру? Например, ситуация- сумма по полю в выделенных записях. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2003, 18:30 |
|
||
|
Обработка выделенного диапазона записей.
|
|||
|---|---|---|---|
|
#18+
>Допустим, я "сортирну" записи в табличной форме "по убыванию", выделю >первые 3 строки, код, по идее, обработает 3 первые записи в рекордсете, но >разве они будут те же, что я выделил? Уважаемый АндрейК, проверить ваш вопрос времени надо меньше, чем написать. Откройте свою табличную форму, отсортируйте какое нибудь поле по алфавиту, откройте окно VBA, в окне отладки (Immediate window) наберите ?forms!ИмяФормы.recordsetclone!ИмяПоля Алексей (это я для примера) Измените сортировку в поле, и снова в окно отладки: ?forms!ИмяФормы.recordsetclone!ИмяПоля Яков Ну и .... >Самое интересное осталось между "then" и "end if" :( А что там интересного...? я уже говорил, либо непосредственно вносите значения в ячейки Excel, либо сохраняете выбранный диапазон во временной таблице и ее пихаете в Excel привычным образом. >На какое событие вешать процедуру? Это уж как вам удобно, для меня удобнее кнопка... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2003, 18:49 |
|
||
|
Обработка выделенного диапазона записей.
|
|||
|---|---|---|---|
|
#18+
Кнопка - самое очевидное, конечно. Но, в случае подсчёта суммы, получается лишнее действие - выделить диапазон + нажать на кнопку. Пробовал вешать процедуру на событие "Текущая запись" - не то: если выделено >1 строки, то хрен чего суммирует. "В запасе" события мыши, а больше ничего на ум не приходит... (а, может, некуда приходить? :) ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2003, 10:16 |
|
||
|
Обработка выделенного диапазона записей.
|
|||
|---|---|---|---|
|
#18+
Когда уже некуда вешаться, остается таймер :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2003, 10:31 |
|
||
|
Обработка выделенного диапазона записей.
|
|||
|---|---|---|---|
|
#18+
А еще можно повесить на кнопку панели инструментов... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2003, 11:13 |
|
||
|
Обработка выделенного диапазона записей.
|
|||
|---|---|---|---|
|
#18+
Чтобы не загромождать место на рабочем столе предлагаю вешать все лишнее на нажатие педали под столом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2003, 11:18 |
|
||
|
Обработка выделенного диапазона записей.
|
|||
|---|---|---|---|
|
#18+
Кстати, было бы неплохо сделать Shift с ножным приводом. Когда в одной руке чашка с кофе, то нажимать на Shift было бы удобнее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2003, 11:27 |
|
||
|
Обработка выделенного диапазона записей.
|
|||
|---|---|---|---|
|
#18+
Вам бы всё подъ...! Поставил на событие мыши "кнопка вверх". Проверяю "на левую кнопку" и - вперёд. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2003, 13:42 |
|
||
|
Обработка выделенного диапазона записей.
|
|||
|---|---|---|---|
|
#18+
>Поставил на событие мыши "кнопка вверх". Проверяю "на левую кнопку" и - вперёд. Но выделять можно и клавиатурой, лучше уж таймер ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2003, 13:51 |
|
||
|
Обработка выделенного диапазона записей.
|
|||
|---|---|---|---|
|
#18+
Тема та же, объект - список. Для списка св-ва SelTop и т.д. не подходят. Как сумму по выделенным записям получить - знаю, а вот как кинуть в Excel выделенные в списке записи? Вопрос по самому коду "сборки" того самого RecordSet, который потом через OutputTo уйдёт в Excel. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2003, 15:29 |
|
||
|
Обработка выделенного диапазона записей.
|
|||
|---|---|---|---|
|
#18+
.Selected ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2003, 19:20 |
|
||
|
Обработка выделенного диапазона записей.
|
|||
|---|---|---|---|
|
#18+
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 (рулез, как всегда ;) ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2003, 20:41 |
|
||
|
Обработка выделенного диапазона записей.
|
|||
|---|---|---|---|
|
#18+
...Ага, кажется, промазал :( А все равно их в цикле получать, так, может, через UNION ;) Ну или (если один из столбцов списка - ключ таблицы - то через WHERE id IN(здесь собрать строчку через зпт). В общем, вариантов куча... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2003, 20:46 |
|
||
|
Обработка выделенного диапазона записей.
|
|||
|---|---|---|---|
|
#18+
кстати тема уже обсуждалась.\r /topic/58604&hl= ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2003, 09:59 |
|
||
|
Обработка выделенного диапазона записей.
|
|||
|---|---|---|---|
|
#18+
По ссылке обсуждается как собрать в строку ID выделенных в форме строк, разделяя их запятыми. У меня другая проблема. "Собрать" в RecordSet выделенные строки и отправить его в Excell. Если второй этап мне понятен, то первый - в тумане. Первое, что пришло на ум(?): Создать локальную таблицу и в цикле, перебирая выделенные строки списка, добавлять в неё нужные запросом на добавление. Второе, что пришло, но как предположение: А можно как-то обойтись без таблицы и запросов на добавление? Интуичу, что так должно быть быстрее, но текст собственно "сборки" в голове(?) не рождается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2003, 10:32 |
|
||
|
Обработка выделенного диапазона записей.
|
|||
|---|---|---|---|
|
#18+
>По ссылке обсуждается как собрать в строку ID выделенных в форме строк, разделяя их запятыми. если есть идентификаторы записей через запятую то собрать в рекордсет эти записи проще простого ID_LIST = " 10,20,33,40 " RS.Open "Select * from Mytable where id IN (" & ID_LIST & ")" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2003, 10:53 |
|
||
|
Обработка выделенного диапазона записей.
|
|||
|---|---|---|---|
|
#18+
Не так всё гладко. Запрос-источник данных списка содержит 5 таблиц и 4 условия отбора. Эти условия и требуют параметры при попытке выполнить выражение: Set rs = CurrentDb.OpenRecordset("Select * from MойИсточник where id IN (" & ID_LIST & ")") Т.е надо и параметры прописывать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2003, 12:25 |
|
||
|
Обработка выделенного диапазона записей.
|
|||
|---|---|---|---|
|
#18+
>А можно как-то обойтись без таблицы и запросов на добавление? >Интуичу, что так должно быть быстрее, но текст собственно "сборки" в голове(?) не рождается. Зря, по моему, вы насчет скорости беспокоитесь. С таблицей будет быстро, только база будет подпухать, если большие объемы будете таким образом обрабатывать. А если уж так не хочется, я уже говорил о прямом вводе значений в ячейки 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2003, 12:45 |
|
||
|
Обработка выделенного диапазона записей.
|
|||
|---|---|---|---|
|
#18+
вместо: Set rs = CurrentDb.OpenRecordset("Select * from MойИсточник where id IN (" & ID_LIST & ")") стандартная процедурина: Код: plaintext 1. 2. 3. 4. 5. 6. и Фсе. (Этот прием используется обычно чтобы не обрабатывать "сложные" случаи - такие как дублирование кавычек в строковых "параметрах" и т.п. (или форматирование дат) при передаче данных непосредственно в сборку строки динамик ссыкуля. Хотя и последнее не столь сложно, как может показаться.). ЗЫ. Напомню справку: >>Пользователь имеет возможность создать временный объект QueryDef, задавая пустую строку в аргументе имя при вызове метода CreateQueryDef. Тот же результат будет получен, если задать пустую строку как значение свойства Name нового объекта QueryDef. Временные объекты QueryDef полезны в ситуации, когда требуется повторно выполнять динамические инструкции SQL без создания постоянных объектов в семействе QueryDefs. Временный объект QueryDef нельзя добавить ни в одно семейство, поскольку пустая строка не является допустимым значением имени постоянного объекта QueryDef. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2003, 13:35 |
|
||
|
Обработка выделенного диапазона записей.
|
|||
|---|---|---|---|
|
#18+
Всё сделал, но на заключительную строку: DoCmd.OutputTo rst , , acFormatXLS, , True получаю: "Несоответствие типа" Методом CreateQueryDef пытаюсь создать временный запрос, но столкнулся с проблемой, что придётся прописывать длинное условие WHERE в аргументе SQL указанного метода. Выходит, что указание Parametrs в этом случае бесполезно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2003, 13:52 |
|
||
|
Обработка выделенного диапазона записей.
|
|||
|---|---|---|---|
|
#18+
Dim rst As DAO.Recordset ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2003, 13:54 |
|
||
|
Обработка выделенного диапазона записей.
|
|||
|---|---|---|---|
|
#18+
Полный текст процедуры: 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 ничего не дала) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2003, 14:12 |
|
||
|
Обработка выделенного диапазона записей.
|
|||
|---|---|---|---|
|
#18+
1. Код: plaintext 1. 2. 3. 4. 5. 6. 7. Ищи метод .СopyFromRecordset Ёкселя. Он тут самое то. 2. если в "параметрах" нет никакой бодяги, требующей спец обработки (форматирования дат, дублирования кавычек и т.п.) - просто клей строку в коде и открывай рекордсет. Если хочешь попользовать уже существующую строку "источника данных" самого списка - програмно отрезай от нее заключительное ";" (если есть) и дошивай свои AND (... IN()). Вот именно тогда параметры можешь и передать как предложено. !!!Я то считал, что строка с параметрами [Forms]![...]![...] у Вас _УЖЕ_ есть :0) (правда, если в строке - источнике списка есть ORDER BY, или GROUP, HAVING и т.п. - то можешь программно врезаться _перед_ ними). Но это уже извращение (попадаешь в зависимость от конкретного порядка конструкций SQL. Есть правда предположение, что наилучшее место врезки - это после последнего WHERE в строке. Но оно тоже не всегда верно (подчиненные запросы в условиях отбора)). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2003, 14:19 |
|
||
|
Обработка выделенного диапазона записей.
|
|||
|---|---|---|---|
|
#18+
Как понял их Хелпа - метод OutPutTo применяется с сохранённым объектам. У меня же - временный QueryDef, а про него в Хелпе что-то ничего нет. На методы Ёкселя заморачиваться - последний для меня вариант(хотя остался самый железобетонный - таблицаТемр и занесение в неё записей построчно). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2003, 14:40 |
|
||
|
Обработка выделенного диапазона записей.
|
|||
|---|---|---|---|
|
#18+
в сетке есть статья по скорости вывода разными методами в Ёксель. Так CopyFromRecordset не самый худший. Есть такая шняга - присоединить таблицу Ёкселя и выгружать набор прямо в нее. На местном сайте один из сторонников -Лох Позорный (войди в "Поиск", выбери участника и Excel). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2003, 14:57 |
|
||
|
Обработка выделенного диапазона записей.
|
|||
|---|---|---|---|
|
#18+
Так я не спорю о скорости вывода, я о том, что раз CopyFromRecordset - метод Ёкселя, значит надо заморачиваться на подключение библиотеки, создание ссылки на Ёксель ...., а потом не забыть эту ссылку убить. Значит из Аксесс только через ТемрТаблицу можно решить проблему? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2003, 15:04 |
|
||
|
Обработка выделенного диапазона записей.
|
|||
|---|---|---|---|
|
#18+
1. Подключать библиотеку только на разработку. 2. В процессе разработки объектные переменные определять AS OBJECT 3. Все константы библиотеки заменять значениями (вычислить в дебуггере) 4. Убить только объявленные объекты. (скорее всего один или 2). 5. После разработки отлючить библиотеку на фик. (если ты сделал криейтОлеОбьект как Object, то методы подтягиваются по мере надобности). 6. Преимущество: можешь выгрузить в шаблон хранящийся в твоей таблице - связанный объект XL и сохранить результат на диск только если потребует пользователь. (Не заморачиваешься с путями, именами и прочей лабудой). Правда в этом случае отпадают как OUTPUTTO, так и связывание таблицы (несохраненного файла). По крайней мере до момента, пока не сохранишь. Остается CopyFromRecordset и непосредственное редактирование содержимого ячеек (что много медленнее, но универсальнее). __ Связывание таблицы екселя это не темп таблица. Это табличка, связанная через ISAM ёкселя (пункт Аксесса "внешние данные", тип XL, далее - по пунктам. Можно сделать и программно). Недостаток - надо описать поля на момент связывания, а не просто вывалить все, что получится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2003, 15:19 |
|
||
|
Обработка выделенного диапазона записей.
|
|||
|---|---|---|---|
|
#18+
>Связывание таблицы екселя это не темп таблица я под ТемрТаблицей имел ввиду таблицу в локальной базе, в которую запросом будет добавляться каждая выделенная в списке запись и которую затем можно через OutputTo отоправить в Ёксель. А на вопрос о временном QueryDef + OutputTo мне так и не ответили ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2003, 15:28 |
|
||
|
Обработка выделенного диапазона записей.
|
|||
|---|---|---|---|
|
#18+
>>А на вопрос о временном QueryDef + OutputTo мне так и не ответили мдя. неужели выдержка из справки не внесла прояснение в затуманненный решением задачи мозг? OutputTo требует либо Имя (у темпа его нет) Либо АКтивности объекта на момент выполнения. Попробуйте открыть темповый запрос (как стандартный аксессовский грид, а не как рекордсет) и сделать его окно активным. :) А способов много. Например кинуть данные SQL строки в форму (отчет), и опубликовать в XL уже форму (отчет). Только оно Вам надо? Можно генерить не темповую таблу, а _нормальный_ (именованный) qrydef, озаботясь уникальностью имени на момент создания (для разрешения коллизий промеж пользователями/сеансами), и не забывая порушить его по завершении выгрузки. Благо весь процесс от создания до удаления - в одной процедуре. Т.ч. имя хранить долго не надо. Ну и т.п. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2003, 15:46 |
|
||
|
|

start [/forum/topic.php?all=1&fid=45&tid=1677956]: |
0ms |
get settings: |
9ms |
get forum list: |
20ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
159ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
88ms |
get tp. blocked users: |
2ms |
| others: | 217ms |
| total: | 516ms |

| 0 / 0 |
