Необходим макрос для экспорта графиков из Excel 2010 в Word 2010 в виде картинок. Есть Excel с множеством графиков - копировать и вставлять как картинку каждый из них очень долго. А при копировании сразу всех - вставляются форматированными Wordом - ужасно выглядят. Поэтому нужны именно в виде картинок. Причём в Excelе имеется несколько страниц для разных лет с одинаковыми графиками, сделанными по строкам. Необходимо, чтобы графики копировались в следующей очерёдности - с каждого листа подряд все первые. Потом подряд все вторые графики и так далее. Графиков много - около 400. А компьютер старый. Поэтому виснет только в путь. Думаю, что если макрос будет копировать сразу все 400 графиков, то компьютер зависнет надолго) Если что не понятно - уточняйте! Если понятно - то очень жду помощи! Заранее спасибо!
Не понятно в чем помочь (именно ПОМОЧЬ, а не все с нуля за Вас сделать). По теме. Запишите макрорекордером копирование одного графика и полученное вставьте в цикл.
Согласие есть продукт при полном непротивлении сторон
Я не знаю как правильно записывать такой макрос - чтобы он копировал подряд сначала только первые графики на каждой странице, потом следующие и после этого ещё их в виде картинок вставлял в Word. При попытке записать просто копирование в Word записывается только действие "Копировать" внутри Excel.
Перезагрузился. Такая ерунда значит - надстройка сохраняет только те диаграммы, которые видны на экране. А те, которые не входят в рабочую область - не сохраняет. А так - вполне хорошая штука) Как с этим бороться? И как редактировать этот файл надстройки?
Хотя это не совсем то, что мне нужно, но хотя бы могу быстро сделать картинки для последующей вставки в Word. Спасибо!
Этот макрос пробежится по всем страницам и вставит все встроенные на них графики в новый документ 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
Максим Зеленский , вот спасибо Вам огромное!!!! Работает!) 100 страниц в Worde) А перебор - сначала первые с каждой страницы и т.д. - это для того, чтобы подряд шли графики для одного и того же критерия за разные года) Ну да ладно. в ручную переставлю. Всё равно меньше делать уже)
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, правда, весит 200 мегабайт))) А вот макрос RAN,выдал ошибку - этот макрос почему-то на первом листе Excel взял первый график и скопировал его много-много раз в Word. А потом вышла ошибка - "Компонент с указанным именем не найден". Жаль, что нельзя добавить перебор - вообще бы жизнь была малиной)
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
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 должен сортировать ваши графики правильно (первые со всех листов, затем вторые со всех листов и т.д.) См. файл
У вас на листе 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
Максим Зеленский, Вот спасибо! Всё получилось! Просто огромное Спасибо! Кучу времени и сил сэкономили мне! ) Где можно эти тонкости узнать программирования? Чтобы людей не напрягать лишний раз?) Или это только с опытом понимание приходит как лучше написать?)