Автоматизация PowerPoint из MS Access .... запросы к диаграмме? - PullRequest
3 голосов
/ 17 мая 2009

Эй, ребята! Мне интересно, есть ли кто-нибудь, кто мог бы помочь мне с этим ...

У меня есть база данных Access, которую я использую для отслеживания метрик, в которых я работаю, и «сокращение чисел» для данных, которые я использую для создания презентаций ppt. Мне обычно приходится делать около 40 ppt в месяц, и они составляют 98% графиков.

Прямо сейчас я запускаю запросы по одному (используя операторы SQL), беру полученные данные, копирую и вставляю их в шаблон Excel (просто я создал фиктивную таблицу в этом «шаблоне», так что диаграмма уже построено и отформатировано), затем скопируйте диаграмму как рисунок в шаблон ppt.

Так что есть много ручной работы, которая не была бы такой плохой, только у меня есть тонус этого, чтобы сделать через месяц.

ТАК ..... как я могу в первую очередь выполнить несколько запросов в Access с VBA для одного и того же набора данных / таблицы (я должен делать продажи по кварталам, месяцам, регионам, штатам, сайтам .. .и все они являются совокупностью Top5, отсюда и причины для диаграмм), а затем отправляют полученные данные в конкретную книгу Excel, в то же время определяя, что входит в какой диапазон ячеек ???

Если я получу все данные в Excel и у меня будут готовые диаграммы, то есть ли какой-нибудь VBA, который возьмет диаграммы из Excel (activeworksheet) и вставит их в powerpoint в виде картинок в макете четырехугольного представления? *

Могу ли я сделать то же самое с подходом Access to PowerPoint и вырезать Excel вместе?

Я новичок в лучшем случае! ЛЮБОЙ и ВСЕМ помощь, советы, советы с благодарностью!

Ответы [ 3 ]

4 голосов
/ 29 июля 2009

Вам не нужно использовать Excel вообще! Используйте MS Access Charts в отчете и некоторый код VBA для непосредственного помещения их в Powerpoint. Уже есть пример здесь

Один «уловок» - это если вы генерируете графики в группе, т.е. вы создаете отчет с графиком, который находится внутри группы, поэтому при запуске отчета вы получите множество созданных графиков.

Немного сложно достать каждый из этих графиков и перенести их в Powerpoint, но вот код, который позаботится об этом. Это работает в Access 2003

'Loop through all the controls in this report and pickout all the graphs
For Each c In pReport.Controls

    'Graphs initially appear to be in an Object Frame
    If TypeOf c Is ObjectFrame Then

        'Check the Class of the object to make sure its a Chart
        If Left$(c.Class, 13) = "MSGraph.Chart" Then

            'Check if this graph must be cloned (required if the graph is in a group in the MS Access report)
            If Not IsGraphToBeCloned(pReport.Name, c.ControlName) Then

                InsertGraphToPptSlide c, "", pReport.Name
            Else
                InsertGraphGroupToPpt pReport.Name, c
            End If
        End If
    End If
Next

Это найдет все графики в отчете, если график находится в группе, мы вызываем функцию InsertGraphGroupToPPt.

Хитрость в том, что мы знаем, что у нас есть один и тот же базовый граф несколько раз - но он заполнен разными данными. Поэтому в Powerpoint нужно вставить базовый граф в слайды Powerpoint n раз - где n - количество групп, а затем обновить свойства запроса графиков

например

Function UpdateGraphInPowerpoint(sql As String, OrigGraph As ObjectFrame, Groups As dao.Recordset, GroupName As String, ReportName As String) As Boolean


    //Copyright Innova Associates Ltd, 2009
    On Error GoTo ERR_CGFF
    On Error GoTo ERR_CGFF

    Dim oDataSheet As DataSheet
    Dim Graph As Graph.Chart
    Dim lRowCnt, lColCnt, lValue As Long, CGFF_FldCnt As Integer
    Dim CGFF_Rs As dao.Recordset
    Dim CGFF_field As dao.Field
    Dim CGFF_PwrPntloaded As Boolean
    Dim lheight, lwidth, LLeft, lTop As Single
    Dim slidenum As Integer
    Dim GraphSQL As String
    Dim lGrpPos As Long

    'Loop thru groups
    Do While Not Groups.EOF

        'We want content to be added to the end of the presentation - so find out how many slides we already have
        slidenum = gPwrPntPres.Slides.Count
        OrigGraph.Action = acOLECopy            'Copy to clipboard
        slidenum = slidenum + 1                 'Increment the Ppt slide number
        gPwrPntPres.Slides.Add slidenum, ppLayoutTitleOnly   'Add a Ppt slide

        'On Error Resume Next    'Ignore errors related to Graph caption
        gPwrPntPres.Slides(slidenum).Shapes(1).TextFrame.TextRange.Text = ReportName & vbCrLf & "(" & Groups.Fields(0).Value & ")" 'Set slide title to match graph title
        gPwrPntPres.Slides(slidenum).Shapes(1).TextFrame.TextRange.Font.Size = 16

        gPwrPntPres.Slides(slidenum).Shapes.Paste  'Paste graph into ppt from clipboard

        Set Graph = gPwrPntPres.Slides(slidenum).Shapes(2).OLEFormat.Object

        Set oDataSheet = Graph.Application.DataSheet    ' Set the reference to the datasheet collection.
        oDataSheet.Cells.Clear                          ' Clear the datasheet.

        GraphSQL = Replace(sql, "<%WHERE%>", " where " & GroupName & " = '" & Groups.Fields(0).Value & "'")
        Set CGFF_Rs = ExecQuery(GraphSQL)


        CGFF_FldCnt = 1
        ' Loop through the fields collection and get the field names.
        For Each CGFF_field In CGFF_Rs.Fields
            oDataSheet.Cells(1, CGFF_FldCnt).Value = CGFF_Rs.Fields(CGFF_FldCnt - 1).Name
           CGFF_FldCnt = CGFF_FldCnt + 1
        Next CGFF_field

        lRowCnt = 2
        ' Loop through the recordset.
        Do While Not CGFF_Rs.EOF

            CGFF_FldCnt = 1
            ' Put the values for the fields in the datasheet.
            For Each CGFF_field In CGFF_Rs.Fields
               oDataSheet.Cells(lRowCnt, CGFF_FldCnt).Value = IIf(IsNull(CGFF_field.Value), "", CGFF_field.Value)
               CGFF_FldCnt = CGFF_FldCnt + 1

            Next CGFF_field

            lRowCnt = lRowCnt + 1
            CGFF_Rs.MoveNext
        Loop

        ' Update the graph.
        Graph.Application.Update

        DoEvents

        CGFF_Rs.Close
        DoEvents
        Groups.MoveNext
    Loop

    UpdateGraphInPowerpoint = True
    Exit Function


End Function
1 голос
/ 17 мая 2009

Поскольку вы новичок, возможно, вам следует разбить задачу на части и автоматизировать части по одной. Каждый шаг обеспечит преимущества (т. Е. Экономию времени), и вы сможете учиться по ходу дела.

Трудно дать конкретные рекомендации на основании отсутствия конкретной информации (какая версия и т. Д.). При этом, возможно, хорошим первым шагом было бы связать таблицы Excel с запросами доступа, чтобы электронные таблицы могли автоматически обновляться каждый месяц, и вам не придется вырезать и вставлять данные из Access в Excel. Вы можете сделать эту ссылку полностью в Excel.

Если вы используете Excel 2007, нажмите «Данные» на ленте, а затем нажмите «Из доступа».

0 голосов
/ 18 мая 2009

То, что вы спрашиваете, это большая работа:

Через VBA вам нужно будет открыть Excel (манипуляции приложения Excel из Access), обновить ваши диаграммы (манипуляции с диапазоном, обновление данных), если у вас есть права, тогда я бы предложил подключить ваши сводные диаграммы к данным Access, а не вставлен в рабочую книгу, тем не менее я был в достаточном количестве ситуаций, когда это было невозможно. Затем вам придется открыть презентацию PowerPoint и скопировать из Excel в PowerPoint. Я сделал все это и знаю, сколько работы можно сэкономить, создав для этого макрос (через VBA). Это много кода.

...