Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.06.2012, 13:51   #1
dmiry74
Новичок
Джуниор
 
Регистрация: 24.06.2012
Сообщений: 2
Вопрос Сохранение скриншота в excel

Может кто подскажет, как решить проблему сохранения скриншота диапазона ячеек в формате jpg. Вчера после нескольких часов копания форумов и экспериментирования получилось сделать сохранение в формате emf... а в jpg вообще никак не получается...(((


Использую такой код:

Private Sub CommandButton1_Click()
Worksheets("Лист1").Range("A1:H20") .CopyPicture xlScreen, Format:=xlBitmap
Set oPic = PastePicture(xlScreen)
SavePicture oPic, "C:\" & Replace(Time, ":", "_") & ".jpg"
End Sub


Function PastePicture(Optional lXlPicType As Long = xlBitmap) As IPicture
'Some pointers
Dim h As Long, hPicAvail As Long, hPtr As Long, hPal As Long, lPicType As Long, hCopy As Long
'Convert the type of picture requested from the xl constant to the API constant
lPicType = IIf(lXlPicType = xlBitmap, CF_BITMAP, CF_ENHMETAFILE)
'Check if the clipboard contains the required format
hPicAvail = IsClipboardFormatAvailable(lPicType )
If hPicAvail <> 0 Then
'Get access to the clipboard
h = OpenClipboard(0&)
If h > 0 Then
'Get a handle to the image data
hPtr = GetClipboardData(lPicType)
'Create our own copy of the image on the clipboard, in the appropriate format.
If lPicType = CF_BITMAP Then
hCopy = CopyImage(hPtr, IMAGE_BITMAP, 0, 0, LR_COPYRETURNORG)
Else
hCopy = CopyEnhMetaFile(hPtr, vbNullString)
End If
'Release the clipboard to other programs
h = CloseClipboard
'If we got a handle to the image, convert it into a Picture object and return it
If hPtr <> 0 Then Set PastePicture = CreatePicture(hCopy, 0, lPicType)
End If
End If

Если кто в курсе, как сделать - подскажите пожалуйста! Работоспособный файл с сохранением в emf прилагается.

Cкриншоты.zip
dmiry74 вне форума Ответить с цитированием
Старый 24.06.2012, 14:41   #2
doober
Старожил
 
Аватар для doober
 
Регистрация: 02.05.2009
Сообщений: 3,907
По умолчанию

Код:
Sub RngToJPG()
    Dim rng As Range, oChart As ChartObject
    Application.DisplayAlerts = False
    Application.ScreenUpdating = False
    Set rng = Range("A1:D10")
    With rng
        .CopyPicture
        Set oChart = ActiveSheet.ChartObjects.Add(.Left, .Top, .Width, .Height)
        With oChart.Chart
            .ChartArea.Border.LineStyle = 0
            .Paste
            .Export "C:\Pic1.jpg"
            .Parent.Delete
        End With
    End With
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
End Sub
Анализ,обработка данных Недорого

Последний раз редактировалось doober; 24.06.2012 в 14:50.
doober вне форума Ответить с цитированием
Старый 24.06.2012, 14:54   #3
dmiry74
Новичок
Джуниор
 
Регистрация: 24.06.2012
Сообщений: 2
По умолчанию

Ого! Спасибо огромное, отлично работает! Вы просто волшебник!

Один только вопрос - справа и снизу скриншота появляется широкая белая полоса... от нее можно избавиться?

Последний раз редактировалось dmiry74; 24.06.2012 в 14:58.
dmiry74 вне форума Ответить с цитированием
Старый 24.06.2012, 15:08   #4
doober
Старожил
 
Аватар для doober
 
Регистрация: 02.05.2009
Сообщений: 3,907
По умолчанию

Она идет по периметру.
Вы же получаете картинку диаграммы.
От нее не избавитесь
Анализ,обработка данных Недорого
doober вне форума Ответить с цитированием
Старый 24.06.2012, 22:04   #5
ikki_pf
Форумчанин
 
Регистрация: 25.02.2012
Сообщений: 166
По умолчанию

среди приложений MSOffice сохранять вставленные картинки в формате jpg умеет MS PowerPoint

если макрос doober'а в Excel'e оставить в таком виде:
Код:
Sub RngToJPG()
    Dim rng As Range, oChart As ChartObject
    Application.DisplayAlerts = False
    Application.ScreenUpdating = False
    Set rng = Range("A1:D10")
    rng.CopyPicture
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
End Sub
затем открыть PP, вставить картинку из буфера и сохранить в jpg, то макрорекодер PP даёт примерно такой код:
Код:
Sub Макрос1()
  ActiveWindow.View.Paste
  ActiveWindow.Selection.Unselect
  ActiveWindow.Selection.SlideRange.Shapes("Picture 5").Select
  ActivePresentation.SaveAs FileName:="D:\Рисунок1.jpg", FileFormat:=ppSaveAsJPG, EmbedTrueTypeFonts:=msoFalse
End Sub
но у меня не получилось "соединить" эти два фрагмента

что-то вроде
Код:
Sub RngToJPG()
    Dim rng As Range, oChart As ChartObject, ppApp As Object

    Application.DisplayAlerts = False
    Application.ScreenUpdating = False
    Set rng = Range("A1:D10")
    rng.CopyPicture
    Set ppApp = CreateObject("PowerPoint.Application")
    Set x = ppApp.Presentations.Add
    Set y = x.Slides.Add(1, ppLayoutBlank)
    With ppApp.ActiveWindow
      .View.Paste
      .SlideRange.Shapes(1).SaveAs Filename:="D:\123.jpg", FileFormat:=ppSaveAsJPG, EmbedTrueTypeFonts:=msoFalse
    End With
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
End Sub
ругается нехорошими словами ("Application.ActiveWindow : Invalid request. There is no currently active document window") на строку с With

что я делаю неправильно?

Последний раз редактировалось ikki_pf; 24.06.2012 в 22:13.
ikki_pf вне форума Ответить с цитированием
Старый 24.06.2012, 23:00   #6
ikki_pf
Форумчанин
 
Регистрация: 25.02.2012
Сообщений: 166
По умолчанию

вот так отрабатывает без ругани. но результат совершенно другой

Код:
Sub RngToJPG()
    Dim rng As Range, oChart As ChartObject, ppApp As Object

    Application.DisplayAlerts = False
    Application.ScreenUpdating = False
    Set rng = Range("A1:D10")
    rng.CopyPicture
    Set ppApp = CreateObject("PowerPoint.Application")
    ppApp.Visible = True
    Set x = ppApp.Presentations.Add
    Set y = x.Slides.Add(1, ppLayoutBlank)
    y.Shapes.Paste.Select
    x.SaveAs Filename:="D:\123.jpg", FileFormat:=ppSaveAsJPG, EmbedTrueTypeFonts:=msoFalse
    ppApp.Quit
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
End Sub
ikki_pf вне форума Ответить с цитированием
Старый 24.06.2012, 23:18   #7
ikki_pf
Форумчанин
 
Регистрация: 25.02.2012
Сообщений: 166
По умолчанию

вывод: макрорекодер PowerPoint'а нагло врёт

сохранение отдельного рисунка (пункт "Сохранить как рисунок") контекстного меню рисунка НЕ ИМЕЕТ аналога в объектной модели PP.
у объекта Shape нет даже отдаленно похожего метода, а метод SaveAs объекта Presentation приводит к созданию папки с указанным именем (без расширения) и набором jpg-файлов, каждый из которых представляет целиком слайд.

вот так-то.
ikki_pf вне форума Ответить с цитированием
Старый 24.06.2012, 23:41   #8
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,858
По умолчанию

Цитата:
Сообщение от ikki_pf Посмотреть сообщение
вот так отрабатывает без ругани. но результат совершенно другой

Код:
...
    x.SaveAs Filename:="D:\123.jpg", FileFormat:=ppSaveAsJPG, EmbedTrueTypeFonts:=msoFalse
   ...
вывод: макрорекодер PowerPoint'а нагло врёт
Знаете, что меня смущает?
Вы создаёте экземпляр объекта ppApp через CreateObject, что неявно, но подразумевает отсутствие ссылки на PowerPoint в Tools-References.
В то же время, в коде вы используете константы PowerPoint (например, ppSaveAsJPG), забыв заменить из значениями.

Если ссылки на PowerPoint в Tools-References нет, то Excel не знает, чему равно ppSaveAsJPG, и из-за этого код может работать неверно.

Может, макрорекодер PowerPoint'а всё-таки не врёт, а кто-то при переносе кода чего-то напутал? ))
EducatedFool вне форума Ответить с цитированием
Старый 24.06.2012, 23:50   #9
ikki_pf
Форумчанин
 
Регистрация: 25.02.2012
Сообщений: 166
По умолчанию

да всё может быть...
но ссылка в референсах есть.
ikki_pf вне форума Ответить с цитированием
Старый 24.06.2012, 23:53   #10
ikki_pf
Форумчанин
 
Регистрация: 25.02.2012
Сообщений: 166
По умолчанию

ну вот, заменил позднее связывание на раннее:
Код:
Dim rng As Range, oChart As ChartObject, ppApp As New PowerPoint.Application
легче не стало
ikki_pf вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Редактирование и сохранение excel из dbgrid Q012 БД в Delphi 5 22.08.2012 21:24
Сохранение StringGrid в Excel kta87 Общие вопросы Delphi 1 20.02.2012 06:10
Сохранение массива в excel файл ikostalker Общие вопросы Delphi 2 15.06.2010 11:01
Delphi Excel (сохранение записи в Excel) Кас Алина Общие вопросы Delphi 4 28.05.2010 09:17
Корректное сохранение в Excel artemavd БД в Delphi 1 19.07.2009 20:57