Страницы: 1 2 След.
RSS
Макрос для экспорта графиков из Excel 2010 в Word 2010 в виде картинок
 
Необходим макрос для экспорта графиков из Excel 2010 в Word 2010 в виде картинок.
Есть Excel с множеством графиков - копировать и вставлять как картинку каждый из них очень долго.
А при копировании сразу всех - вставляются форматированными Wordом - ужасно выглядят.  Поэтому нужны именно в виде картинок.
Причём в Excelе имеется несколько страниц для разных лет с одинаковыми графиками, сделанными по строкам.
Необходимо, чтобы графики копировались в следующей очерёдности - с каждого листа подряд все первые. Потом подряд все вторые графики и так далее.
Графиков много - около 400. А компьютер старый. Поэтому виснет только в путь. Думаю, что если макрос будет копировать сразу все 400 графиков, то компьютер зависнет надолго)
Если что не понятно - уточняйте! Если понятно - то очень жду помощи!
Заранее спасибо!
Изменено: МПМ - 01.09.2014 02:15:19
 
Цитата
МПМ пишет: Если что не понятно - уточняйте
Не понятно в чем помочь (именно ПОМОЧЬ, а не все с нуля за Вас сделать).
По теме. Запишите макрорекордером копирование одного графика и полученное вставьте в цикл.
Согласие есть продукт при полном непротивлении сторон
 
Я не знаю как правильно записывать такой макрос - чтобы он копировал подряд сначала только первые графики на каждой странице, потом следующие и после этого ещё их в виде картинок вставлял в Word. При попытке записать просто копирование в Word записывается только действие "Копировать" внутри Excel.
 
Можете взять за основу этот макрос:
http://excelvba.ru/programmes/ExportCharts
 
Спасибо!
Интересная надстройка. Только почему-то не хочет сохранять все диаграммы. Перезагружу компьютер - посмотрю, может нормально станет всё.
 
Перезагрузился. Такая ерунда значит  - надстройка сохраняет только те диаграммы, которые видны на экране. А те, которые не входят в рабочую область - не сохраняет. А так - вполне хорошая штука) Как с этим бороться? И как редактировать этот файл надстройки?

Хотя это не совсем то, что мне нужно, но хотя бы могу быстро сделать картинки для последующей вставки в Word.
Спасибо!
Изменено: МПМ - 01.09.2014 11:06:40
 
Если кто-то в теме как можно сделать макрос для экспорта графиков из Excel 2010 в Word 2010 в виде картинок, то напишите, пожалуйста)
 
Этот макрос пробежится по всем страницам и вставит все встроенные на них графики в новый документ Word в виде картинок.
Только вот он не будет проверять, какие из них в первой строке, какие во второй. Без файла примера это определить невозможно и не нужно.
Поэтому он будет копировать графики в том порядке, в котором они создавались на листе.
Код
Sub test_chrt_copy()
Set WrdApp = CreateObject("Word.Application")
WrdApp.Visible = True
Set WrdDoc = WrdApp.Documents.Add ' create a new document
For Each ws In ThisWorkbook.Worksheets
    For Each Chrt In ws.ChartObjects
        Chrt.CopyPicture
        WrdApp.Selection.Paste
    Next
Next
End Sub
Изменено: Максим Зеленский - 02.09.2014 11:05:02
F1 творит чудеса
 
Максим Зеленский, меня смущает в Вашем макросе ActiveSheet, т.к. я не увидел строки активации листа. Возможно вместо ActiveSheet следует написать ws?

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
JayBhagavan, совершенно верно. Проверял в модуле листа, потому и неправильно написано. Сейчас исправлю
F1 творит чудеса
 
Максим Зеленский , вот спасибо Вам огромное!!!! Работает!)  :D    
100 страниц в Worde)
А перебор - сначала первые с каждой страницы и т.д. - это для того, чтобы подряд шли графики для одного и того же критерия за разные года) Ну да ладно. в ручную переставлю. Всё равно меньше делать уже)
Изменено: МПМ - 02.09.2014 12:29:57
 
Код
Sub qq()
    Set WrdApp = CreateObject("Word.Application")
    WrdApp.Visible = True
    Set WrdDoc = WrdApp.Documents.Add    ' create a new document
    For Each ws In ThisWorkbook.Worksheets
        Dim coll As New Collection
        For Each Chrt In ws.ChartObjects
            Dim arr(1 To 2)
            arr(1) = Chrt.Top
            arr(2) = Chrt.Name
            For i = 1 To coll.Count
                If arr(1) < coll.Item(i)(1) Then Exit For
            Next
            If i > coll.Count Then coll.Add arr Else coll.Add arr, Before:=i
        Next
        For i = 1 To coll.Count
            ThisWorkbook.Sheets(1).ChartObjects(coll(i)(2)).CopyPicture
            WrdApp.Selection.Paste
        Next
    Next
End Sub
 
Этот код скопировал только первый график на первом листе в Word примерно 40 раз и выдал ошибку)
Изменено: МПМ - 02.09.2014 13:13:57
 
Непонятно, почему. У меня он всё правильно сделал, исходя из той логики, конечно, что в него заложена - проверка расположения диаграмм сверху вниз.
Изменено: Максим Зеленский - 02.09.2014 14:19:53
F1 творит чудеса
 
Максим Зеленский, Ваш макрос сделал всё прекрасно) Файл Word, правда, весит 200 мегабайт))) А вот макрос RAN,выдал ошибку - этот макрос почему-то на первом листе Excel взял первый график и скопировал его много-много раз в Word. А потом вышла ошибка -  "Компонент с указанным именем не найден".
Жаль, что нельзя добавить перебор - вообще бы жизнь была малиной)
Изменено: МПМ - 03.09.2014 00:16:37
 
Можно. Но гадать, где ошибка, я не буду.
 
RAN,Всё равно спасибо) Я то вообще не разбираюсь в этом) Тем более ошибки не увижу)
 
ThisWorkbook.Sheets(1).ChartObjects(coll(i)(2)).CopyPicture
Код
ws.ChartObjects(coll(i)(2)).CopyPicture
Изменено: RAN - 03.09.2014 00:25:06
 
RAN,теперь стало ещё интереснее) На первом листе 40 графиков - все 40 прошли одинаковыми - копии первого графика. На втором листе образовалось чередование - первый график, а за ним второй, первый график - а за ним третий и т.д. и опять выдал ошибку)
Так. В общем в таком виде сейчас макрос) Что он делает - это загадка)

Код
Sub qq()
    Set WrdApp = CreateObject("Word.Application")
    WrdApp.Visible = True
    Set WrdDoc = WrdApp.Documents.Add    ' create a new document
    For Each ws In ThisWorkbook.Worksheets
        Dim coll As New Collection
        For Each Chrt In ws.ChartObjects
            Dim arr(1 To 2)
            arr(1) = Chrt.Top
            arr(2) = Chrt.Name
            For i = 1 To coll.Count
                If arr(1) < coll.Item(i)(1) Then Exit For
            Next
            If i > coll.Count Then coll.Add arr Else coll.Add arr, Before:=i
        Next
        For i = 1 To coll.Count
            ws.ChartObjects(coll(i)(2)).CopyPicture
            WrdApp.Selection.Paste
        Next
    Next
End Sub 
Изменено: МПМ - 03.09.2014 00:53:44
 
Цитата
МПМ пишет:
макрос изменился самой программой
Какой программой? )
 
Юрий М,Excelем, видимо) пересохранил уже с новой строкой) Теперь код остался неизменным)
 
МПМ, я имел ввиду, что макрос от RAN у меня хорошо сработал )))
F1 творит чудеса
 
У меня графики идут на каждом листе один под одним. Не знаю важно это или нет) Просто уточняю)
Изменено: МПМ - 03.09.2014 01:23:35
 
Нашлась пропажа

Код
Sub qq()
    Set WrdApp = CreateObject("Word.Application") 
    WrdApp.Visible = True
    Set WrdDoc = WrdApp.Documents.Add    ' create a new document
    For Each ws In ThisWorkbook.Worksheets
        Dim coll As New Collection
        For Each Chrt In ws.ChartObjects
            Dim arr(1 To 2)
            arr(1) = Chrt.Top
            arr(2) = Chrt.Name
            For i = 1 To coll.Count
                If arr(1) < coll.Item(i)(1) Then Exit For
            Next
            If i > coll.Count Then coll.Add arr Else coll.Add arr, Before:=i
        Next
        a = ws.Name
        For i = 1 To coll.Count
            ws.ChartObjects(coll(i)(2)).CopyPicture
            WrdApp.Selection.Paste
        Next
        Set coll = Nothing
    Next
End Sub
 
Цитата
МПМ пишет:
У меня графики идут на каждом листе один под одним. Не знаю важно это или нет) Просто уточняю)
С небольшой доработкой последний код RAN должен сортировать ваши графики правильно (первые со всех листов, затем вторые со всех листов и т.д.)
См. файл
F1 творит чудеса
 
RAN,нет. Не получается. Вот кусок Excelя для примера.
https://cloud.mail.ru/public/9492a1e2ea3a%2F%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%8­0.xlsm
Изменено: МПМ - 03.09.2014 13:33:56
 
RAN, а для чего 16-я строчка?
Код
a = ws.Name

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Максим Зеленский,сейчас попробую. Позже отпишусь.
 
Цитата
МПМ пишет: Не получается
У вас на листе 2005 все диаграммы имеют одинаковое имя "Диаграмма 1". Как вы этого достигли - не важно, но макросу от этого не легче.
Вот так работает:
Код
Sub qq()
    Dim ws As Worksheet, Chrt As ChartObject, i&, arr2, k&, n&
    Dim WrdApp As Object, WrdDoc As Object
    Set WrdApp = CreateObject("Word.Application")
    Set WrdDoc = WrdApp.Documents.Add
    ReDim arr2(1 To 1)
    For Each ws In ThisWorkbook.Worksheets
        Dim coll As New Collection
        For Each Chrt In ws.ChartObjects
            Dim arr(1 To 3)
            arr(1) = Chrt.Top
            arr(2) = Chrt.Index
            arr(3) = ws.Name
            For i = 1 To coll.Count
                If arr(1) < coll.Item(i)(1) Then Exit For
            Next
            If i > coll.Count Then coll.Add arr Else coll.Add arr, Before:=i
        Next
        If coll.Count > 0 Then
            If n < coll.Count Then n = coll.Count
            k = k + 1
            ReDim Preserve arr2(1 To k)
            Set arr2(k) = coll
        End If
        Set coll = Nothing
    Next

        For i = 1 To n
            For k = 1 To UBound(arr2)
                Worksheets(arr2(k)(i)(3)).ChartObjects(arr2(k)(i)(2)).CopyPicture
                WrdApp.Selection.Paste
            Next
        Next
WrdApp.Visible = True
End Sub
F1 творит чудеса
 
Максим Зеленский, Вот спасибо! Всё получилось! Просто огромное Спасибо! Кучу времени и сил сэкономили мне! )
Где можно эти тонкости узнать программирования? Чтобы людей не напрягать лишний раз?)
Или это только с опытом понимание приходит как лучше написать?)
Страницы: 1 2 След.
Читают тему
Наверх