Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MS Access > Сделать отчет в EXCEL


Автор: VirusE 9.2.2007, 10:40
Скорее всего подобное на форуме есть, но у меня интернет через мобильник, по этому лопатить все просто не могу себе позволить.
Проблема такая.
Делаю Базу данных в Access, но отчеты по ней нужны в Excel (при чем не стандартный отчет).
Имеем таблицу
| Дата | Номер заготовки | Тип заготовки | Дефект |
Дата - дата осмотра
Номер - номер присваивается при производстве
Тип заготовки - сортамент (размеры)
Дефект - если пустое поле, то годная, если нет, описание и код (по перечню)


Нужно сделать таблицы в Exele нажатием кнопки в форме в Access

Табличка нужна такая:

Столбцы - дата
Строки количество деффектов (по виду)
Типа
|                        |     Дата 1     |     Дата 2     |     Дата 3      |
|    Дефект 1     |                     |                     |                      |
|    Дефект 2     |                     |                     |                      |
|    Дефект 3     |                     |                     |                      |
Каждый Тип заготовки на своем листе

Скрипты в Access и Excel я написать могу, но
Я не знаю как (и не боюсь в этом сознаться):
Открыть новый документ Excel (сам Excel открывается, но дальше не получается), при чем активным он должен стать после завершения создания отчета).
Вносить данные в этот документ, подразумевается (управление данными в ячейке Exele командой из Access.

В принципе, как выделить данные из базы я знаю
Алгоритм приблизительно такой (знак вопроса, там, где я не знаю, как сделать)
1 Открываем форму для указания месяца и года   
2 Открываем Пустую книгу и присваеваем ей имя (год/месяц выборки + дата составления) (?)
3 Запрос к БД - узнаем типы Заготовок в этом месяце
4 Запускаем цикл по каждому типу заготовки
  4.1 Создаем лист с именем соответствующим типу заготовки   (?)
  4.2 Запрос к БД - узнаем Виды дефектов за этот месяц по этому типу заготовки.
  4.3 Запускаем цикл по каждому виду дефекта
       4.3.1 Создаем в Exele строку с именем дефекта (пустое поле - годная)   (?)
       4.3.2 Запрос в БД - узнаем даты осмотров (еще не решил делать по всем датам или только по имеющимся)
       4.3.3 Цикл по датам
               4.3.3.1 Создаем заголовок столбца с датой
               4.3.3.2 Запрос в БД - поиск количества записей по дате, дефекту, сорту
               4.3.3.3 Присваиваем получившееся значение ячейке.  (?)

Принцип понятен. непонятно только, как обращаться к Excel из Access
Я конечно мог бы и сам разобраться, но время жмет.

PS. И еще подскажите верный синтаксис UPDATE в скрипте, вносить данные в таблицу  могу, а исправлять не получается.

Set con = Application.CurrentProject.Connection
    Set rs = CreateObject("ADODB.Recordset")
    stSql = "SELECT * FROM [Таблица] "
    stSql = stSql & "WHERE [Значение1]=" & A & " AND [Значение2]=" & B
    rs.Open stSql, con, 1 

При присвоении stSql запроса "Delete" работает а "update" нет.

Автор: VirusE 9.2.2007, 21:51
Вроде во все разобрался (нашел ошибку в коде), но появился вопрос с форматированием ячеек.
Частично работает, но многое - нет.
Не обрабатывается:
Выравнивание текста, границы ячеек.
(Код делал в Excel через запись макроса и вставлял (подкорректировав) в свой.

Автор: bopoha 10.2.2007, 01:00
Так вот просто подсказать не видя кода очень тяжело. Попробуй следующий метод: сделай лист настроек. В нем определенным ячейкам присвой нужный формат. Потом копируй формат (опять же макросом код запиши) на лист данных в нужную область ячеек. Этот метод гораздо гибче.

Автор: VirusE 11.2.2007, 12:07
Код приблизительно такой:

    Dim ExcelApp As Object
    Dim NewWorkbook As Object
    Dim NewSheet As Object
    Set ExcelApp = CreateObject("Excel.Application")
    
    On Error Resume Next
ExcelApp.UserControl = True
ExcelApp.Workbooks.Add
Set NewWorkbook = ExcelApp.ActiveWorkbook
...
Сдесь запрос к базе данных (поиск типов детали) и начало цикла по ним
...
    NewWorkbook.sheets.Add
    Set NewSheet = NewWorkbook.ActiveSheet
    NewSheet.Name =" Значение типа детали из запроса "
With NewSheet
.Range("A7:A12").NumberFormat = "@"     'Выполняется
.Cells(7, 1) = "n/n"     'Выполняется
.Range("A7:A8").Merge       'Выполняется
.Range("A7:A8").HorizontalAlignment = xlCenter     'НЕ выполняется
 .Range("A7:A13").LineStyle = xlContinuous     'НЕ выполняется

    Selection.Borders(xlDiagonalDown).LineStyle = xlNone     ' и далее НЕ выполняется но и ошибки не выдает (думаю считает параметры типа xlNone, xlContinuous не определенными (при проверке по строчно показывает их =empty???))
    Selection.Borders(xlDiagonalUp).LineStyle = xlNone
    With Selection.Borders(xlEdgeLeft)
        .LineStyle = xlContinuous
        .Weight = xlMedium
        .ColorIndex = xlAutomatic
    End With
    With Selection.Borders(xlEdgeTop)
        .LineStyle = xlContinuous
        .Weight = xlMedium
        .ColorIndex = xlAutomatic
    End With
    With Selection.Borders(xlEdgeBottom)
        .LineStyle = xlContinuous
        .Weight = xlMedium
        .ColorIndex = xlAutomatic
    End With
    With Selection.Borders(xlEdgeRight)
        .LineStyle = xlContinuous
        .Weight = xlMedium
        .ColorIndex = xlAutomatic
    End With
    With Selection.Borders(xlInsideHorizontal)
        .LineStyle = xlContinuous
        .Weight = xlThin
        .ColorIndex = xlAutomatic
    End With
    End With

Я не совсем понял про лист настроек, нужно его создать и сохранить, а потом каждый раз при запуске копировать формат или записать макрос при его создании?
В принципе я делал лист с настройками ячеек, и записывал при этом макрос, но вот его то код и не работает.

Автор: bopoha 11.2.2007, 14:58
:-) какой ты веселый.

напиши в начале модуля Option Explicit и код даже не выполниться! Потому что константы xlCenter и пр. определены только в Excel. Выхода отсюда 2-а:
1. добавить в mdb ссылку (Reference) на Excel.exe
2. объявить исопльзуемые константы (типа Long, елси не ошибаюсь). Значения их можно получить в окне отладки (Ctrl+G) в Excel. Например: ?xlCenter

PS: чтобы при создании модулия редактор всегда вставлял Option Explicit необходимо в окне редактора выбрать Tools->Options. В открывшемся окне поставить галочку напротив Requare Variable Declaration, а с пункта Auto Syntax Check можно убрать - чтобы он надоедающее окошко не показывал, но красным цветом код с ошибкой выделять будет.

Автор: VirusE 11.2.2007, 20:56
То что это константы, я уже понял, даже узнал типы и знычения (Valueв цифирях) (в помощи к VBA Excel есть перечень групп констант, их имена и значения). Пробывал вместо констант забивать цифры, но не пошло, есть подозрение, что числовые значения тоже отличаются. Помучаю еще.
smile
А веселый такой я потому, что программирую по необходимости, по причине большой лени, не во всех делах начальство любит автоматизацию (и спец проги не предоставляет, а отчет по нескольким сотням а то и тысячам записей делать не весело), первая прога была полностью в EXCEL, но там все записи в одной таблице и просто по циклу сортировались по разделам отчета, и страницы форматировались. Но работала она **** долго. Вот сейчас доделываю вторую, в Access.

Автор: VirusE 4.3.2007, 19:24
Новая проблема, прошу срочно помочь если кто-то имел с этим дело.
В вышеуказанном отчете нужно сделать диаграмму,
Опробывал много вариантов, но не получается ее форматировать.
Вариант первый диаграмма вставляется в книгу, назначаются диапозон данных, имена и т.п. Но после назначения листа (.Location где она должна быть), контроль над ней пропадает (нужно изменить расположение на листе и размер).
Если диаграмма вставляется сразу в лист, контролянет вообще, но зато размеры, те которые требуются.
Код


'Вариант один:
NewWorkbook.Charts.Add
With NewWorkbook.Activechart
name_di = .Name
    .ChartType = 51
    .SeriesCollection(1).XValues = NewWorkbook.sheets(name_sort).Range(NewWorkbook.sheets(name_sort).cells(13, 2), NewWorkbook.sheets(name_sort).cells(12 + kol_i_def, 2))
    .SeriesCollection(1).Values = NewWorkbook.sheets(name_sort).Range(NewWorkbook.sheets(name_sort).cells(13, 3 + kol_i_date), NewWorkbook.sheets(name_sort).cells(12 + kol_i_def, 3 + kol_i_date))
    .HasTitle = True
    .ChartTitle.Characters.Text = "название"
    .Axes(1, 1).HasTitle = True
    .Axes(1, 1).AxisTitle.Characters.Text = "осьХ"
    .Axes(2, 1).HasTitle = True
    .Axes(2, 1).AxisTitle.Characters.Text = "осьУ"
    .HasLegend = False
    n = .Name
    .Location Where:=2, Name:=name_sort
End With

'Вариант два

Dim MyCO As Object
Dim MyC  As Object
Set MyCO = NewWorkbook.Activesheet.ChartObjects.Add(25, 300, 600, 350)
Set MyC = NewWorkbook.Activesheet.Activechart
name_dia = MyCO.Name

With NewWorkbook.Activesheet.ChartObjects(name_dia)
.RoundedCorners = False
.Shadow = False
End With

'Дальше не работает, показана одна из попыток, поэтому код корявый

With NewWorkbook.sheets(name_sort).Shape(name_dia).ChartObjects.Chart
    .SeriesCollection(1).XValues = NewWorkbook.sheets(name_sort).Range(NewWorkbook.sheets(name_sort).cells(13, 2), NewWorkbook.sheets(name_sort).cells(12 + kol_i_def, 2))
    .SeriesCollection(1).Values = NewWorkbook.sheets(name_sort).Range(NewWorkbook.sheets(name_sort).cells(13, 3 + kol_i_date), NewWorkbook.sheets(name_sort).cells(12 + kol_i_def, 3 + kol_i_date))
    .ChartType = 51
.HasLegend = False
.HasTitle = True
With .ChartTitle
.Characters.Text = "строка"
.Font.Size = 14
End With

End With

Как правильно написать обращение к диаграме в EXCEL из макроса в Access
Задолбался, два дня пробывал различные варианты

Автор: bopoha 4.3.2007, 20:02
Вариант с шаблоном (xlt) не подходит? Т.е. создаешь диаграму, настраиваешь и сохраняешь как шаблон. А в коде создаешь новый документ на основании шаблона, только впечатываешь данные и определяешь диапазон данных для диаграммы.

Автор: Akina 5.3.2007, 00:23
Модератор: Используйте тег Код

Автор: VirusE 5.3.2007, 09:52
А пример можно? (как это сделать)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)