Форум программистов, компьютерный форум, киберфорум
Microsoft Access
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/9: Рейтинг темы: голосов - 9, средняя оценка - 5.00
1 / 1 / 0
Регистрация: 27.06.2014
Сообщений: 77
1

Выгрузка данных в Excel с разделенной формы, после применения фильтров

01.07.2014, 10:55. Просмотров 1717. Ответов 6
Метки нет (Все метки)


Здравствуйте! Помогите кто чем может, вроде все перерыл ничего не нашел наталкивающего на решение.

Описание: есть Access 2007, есть разделенная форма, созданная мастером в три клика на основании таблицы "Задачи". В верхней части поля, в нижней - табличная часть. В табличной части можно применять различные фильтры в столбцах, они создаются по умолчанию - очень удобная вещь!! В таблице "Задачи" есть такие поля как "Исполнитель", "Дата".

Проблема: Так вот я в нижней части применил пару фильтров, например выбрал исполнителя, и выбрал дату - в итоге у меня красота - три строки, то есть исполнитель X выполнил три задачи в день Y. Как мне эти данные взять и выгрузить в Excel? Сам алгоритм выгрузки я нашел, но как его применить непосредственно в этой ситуации я не понимаю.
Помогите пожалуйста.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
 
Private Sub Кнопка2_Click()
' Создаем excel файл
    Dim xlApp As Excel.Application
    Dim xlBook As Excel.Workbook
    Dim xlSheet As Excel.Worksheet
    Dim xlFileName As String
     
    ' определяем и проверяем имя файла
    xlFileName = Application.CurrentProject.Path & "\Задачи.xlsx"
    If Dir(xlFileName, vbNormal) = "" Then
        MsgBox "Файл не найден: "
        Exit Sub
    End If
    
    ' Устанавливаем ссылку на страницу
    Set xlApp = CreateObject("Excel.Application") 'Открываем Excel
    Set xlBook = xlApp.Workbooks.Open(FileName:=xlFileName) ' Выбираем файл
    Set xlSheet = xlBook.Sheets("Задачи") ' Выбираем лист книги
    xlApp.Visible = True ' Показываем Excel
         
    
    'Используем запрос из базы данных - здесь я просто выбрал все из таблицы - наверно здесь что то и нужно прописать
    Dim cn As ADODB.Connection, RS As New ADODB.Recordset, SQL As String
    Set cn = Application.CurrentProject.Connection
    SQL = "SELECT * FROM Задачи"
    RS.Open SQL, cn
    xlSheet.Range("A2").CopyFromRecordset RS
    RS.Close
    Set RS = Nothing
End sub
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.07.2014, 10:55
Ответы с готовыми решениями:

Количество записей в леточной форме после применения фильтров
Приветствую как можно узнать кол-во записей в ленточной форме, после применения фильтров?...

Выгрузка данных формы в Excel
Здравствуйте! Помогите, пожалуйста, с таким вопросом. У меня есть форма, в которой создано поле со...

Фиксация формы объекта после применения модификатора.
Доброго времени всем. Подскажите пожалуйста. Я применил к объекту BOX модификатор RIPPLE, после...

Как подключить к таблицам объекты разделенной базы данных (формы) в Access 2010 Runtime
Первый раз сталкиваюсь с таким вопросом. Имеется разделенная база, т.е. связанные таблицы в...

6
3935 / 1342 / 369
Регистрация: 07.08.2013
Сообщений: 3,385
01.07.2014, 11:46 2
пока мыслю так
(все зависит от того насколько хорошо вы знаете VBA)
у формы (подформы) есть свойство filter и свойство filterOn
в свойстве filter прописываются условия отбора записей
по синтаксису то что пишется в этой строке похоже на часть where SQL запроса
filterOn - принимает значение true (разрешить фильтрацию) либо false (запретить)
таким образом что бы адаптировать код который выше
необходимо подсунуть то что написано в filter в запрос открытия рекордсета
ну примерно так
SQL
1
SQL = "SELECT * FROM Задачи " & me.filter
или
SQL
1
SQL = "SELECT * FROM Задачи"& me![имя контрола подчиненной формы].form.filter
применение этих строк возможно при условии что me.filteron=true

возможно что значение что выдает filter придется немного подделать под себя (например убрать " и заменить их на ')
0
1172 / 625 / 37
Регистрация: 30.05.2010
Сообщений: 712
01.07.2014, 21:53 3
Здравствуйте Makc1985.
При использовании метода CopyFromRecordset, к сожалению фильтрация с рекордсета
слетает, т.е. передается полный набор данных.
Можно конечно прочесть значение фильтра и использовать его в качестве условий отбора
для создаваемого рекордсета, но можно получив массив данных функцией GetRows поместить
его на лист Excel (конечно предварительно транспонировать), думаю это не сложнее.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Sub toExcel()
Dim i&, j&
Dim XLT As Object, XL As Object '''As Excel.Application
Dim rs As ADODB.Recordset, vA1(), vA2()
Set XL = CreateObject("Excel.Application")
XL.Workbooks.Add ' или Open - как у Вас
Set XLT = XL.Worksheets(1) ' или .Sheets("Задачи") если лист существует
On Error Resume Next
With XLT
    Set rs = Forms("ИмяФормы").Recordset
    vA1 = rs.GetRows
    ReDim vA2(UBound(vA1, 2), UBound(vA1))
    For i = LBound(vA1) To UBound(vA1)
        For j = LBound(vA2) To UBound(vA2)
            vA2(j, i) = vA1(i, j)
        Next
    Next
    .range(.[a2], .cells(UBound(vA2) + 1, UBound(vA1) + 1)).Value = vA2
   Set rs = Nothing
End With
XL.Application.Visible = True
Set XLT = Nothing: Set XL = Nothing
End Sub
Евгений.
0
Эксперт MS Access
26609 / 14308 / 3166
Регистрация: 28.04.2012
Сообщений: 15,690
01.07.2014, 22:49 4
Лучший ответ Сообщение было отмечено Makc1985 как решение

Решение

Зачем все эти сложности, когда можно (и нужно!) для экспорта применить рекордсет самой формы? Он уже отфильтрован, построен. Лучший кандидат :-)
Visual Basic
1
2
Me.recordsetclone.Movefirst
xlSheet.Range("A2").CopyFromRecordset Me.recordsetclone
3
1 / 1 / 0
Регистрация: 27.06.2014
Сообщений: 77
02.07.2014, 02:25  [ТС] 5
Действительно! Вот и выход из ситуации! Все оказывается легко и просто!
mobile - сила
0
0 / 0 / 0
Регистрация: 07.11.2017
Сообщений: 8
20.11.2017, 20:00 6
Вы не могли бы подсказать как мне использовать Ваш метод здесь:

PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Private Sub exel_load_Click()
Dim app As Excel.Application
Dim strDOT As String
Dim MyTable As DAO.Recordset
Set app = New Excel.Application
app.Visible = True
strDOT = CurrentProject.Path & "\" & "Реестр.xlt"
app.Workbooks.Add strDOT
Set MyTable = CurrentDb.OpenRecordset("SELECT Главная.[Код], Главная.[Объект], Главная.[Область_нарушения], Главная.[Дата_выявления], Главная.[Субподрядчик], Главная.[Статус] FROM Главная;")
i = 3
Do While Not MyTable.EOF
        app.Parent.Range("a" & i).Select
        app.Parent.ActiveCell.FormulaR1C1 = CStr(MyTable.Fields("Код"))
        app.Parent.Range("b" & i).Select
        app.Parent.ActiveCell.FormulaR1C1 = CStr(MyTable.Fields("Объект"))
        app.Parent.Range("c" & i).Select
        app.Parent.ActiveCell.FormulaR1C1 = CStr(MyTable.Fields("Область_нарушения"))
        app.Parent.Range("d" & i).Select
        app.Parent.ActiveCell.FormulaR1C1 = CStr(MyTable.Fields("Дата_выявления"))
        app.Parent.Range("f" & i).Select
        app.Parent.ActiveCell.FormulaR1C1 = CStr(Nz(MyTable.Fields("Субподрядчик"), ""))
    i = i + 1
    MyTable.MoveNext
Loop
MyTable.Close
End Sub
В файл высыпаются все записи, а мне нужны только те, которые получаются при фильтрации

Спасибо заранее

Добавлено через 12 минут
mobile, Вы не могли бы подсказать как мне использовать Ваш метод здесь:
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Private Sub exel_load_Click()
Dim app As Excel.Application
Dim strDOT As String
Dim MyTable As DAO.Recordset
Set app = New Excel.Application
app.Visible = True
strDOT = CurrentProject.Path & "\" & "Реестр.xlt"
app.Workbooks.Add strDOT
Set MyTable = CurrentDb.OpenRecordset("SELECT Главная.[Код], Главная.[Объект], Главная.[Область_нарушения], Главная.[Дата_выявления], Главная.[Субподрядчик], Главная.[Статус] FROM Главная;")
i = 3
Do While Not MyTable.EOF
        app.Parent.Range("a" & i).Select
        app.Parent.ActiveCell.FormulaR1C1 = CStr(MyTable.Fields("Код"))
        app.Parent.Range("b" & i).Select
        app.Parent.ActiveCell.FormulaR1C1 = CStr(MyTable.Fields("Объект"))
        app.Parent.Range("c" & i).Select
        app.Parent.ActiveCell.FormulaR1C1 = CStr(MyTable.Fields("Область_нарушения"))
        app.Parent.Range("d" & i).Select
        app.Parent.ActiveCell.FormulaR1C1 = CStr(MyTable.Fields("Дата_выявления"))
        app.Parent.Range("f" & i).Select
        app.Parent.ActiveCell.FormulaR1C1 = CStr(Nz(MyTable.Fields("Субподрядчик"), ""))
    i = i + 1
    MyTable.MoveNext
Loop
MyTable.Close
End Sub
В файл высыпаются все записи, а мне нужны только те, которые получаются при фильтрации

Спасибо заранее
0
Эксперт MS Access
26609 / 14308 / 3166
Регистрация: 28.04.2012
Сообщений: 15,690
20.11.2017, 21:21 7
Цитата Сообщение от vkotov30 Посмотреть сообщение
В файл высыпаются все записи, а мне нужны только те, которые получаются при фильтрации
Есть существенная разница между Вашей постановкой и вопросом ТС. Рекордсет формы изначально отфильтрован, в Вашей задаче, не привязанной к форме, эти фильтры надо задавать в запросе.
Если же Вы хотите использовать уже отфильтрованный рекордсет формы, то зачем строить еще одно SQL-выражение? Почему бы не использовать уже имеющийся рекордсет? Словом ситуация неясная, неопределенная. Вам надо прояснить ее, чтобы получить рекомендацию.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.11.2017, 21:21

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Сохранение и закрытие шаблона Excel после внесения данных из формы Access
День добрый. По нажатию кнопки происходит открытие шаблона Excel c последующим его заполнением...

Выгрузка данных в Excel
Здравствуйте! Помогите реализовать выгрузку данных в Excel. Задумка такая. Есть форма, на ней DGV...

Выгрузка данных в Excel
Добрый день! Посмотрите пожалуйста. Есть в обработке таблица значений, в которую я выгружаю данные...

Выгрузка данных из БД в excel
Итак есть вывод данных в excel но она заполняется с перовой строчки, а нужно что б началась...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.