Картинки в файл vba excel

I have an Excel file which includes pictures in column B and I want like to export them into several files as .jpg (or any other picture file format). The name of the file should be generated from text in column A. I tried following VBA macro:

Private Sub CommandButton1_Click()
Dim oTxt As Object
 For Each cell In Ark1.Range("A1:A" & Ark1.UsedRange.Rows.Count)
 ' you can change the sheet1 to your own choice
 saveText = cell.Text
 Open "H:Webshop_ZpiderStrukturbildene" & saveText & ".jpg" For Output As #1
 Print #1, cell.Offset(0, 1).text
 Close #1
 Next cell
End Sub

The result is that it generates files (jpg), without any content. I assume the line Print #1, cell.Offset(0, 1).text. is wrong.
I don’t know what I need to change it into, cell.Offset(0, 1).pix?

Can anybody help me? Thanks!

asked Aug 14, 2013 at 13:24

KEK79's user avatar

5

If i remember correctly, you need to use the «Shapes» property of your sheet.

Each Shape object has a TopLeftCell and BottomRightCell attributes that tell you the position of the image.

Here’s a piece of code i used a while ago, roughly adapted to your needs. I don’t remember the specifics about all those ChartObjects and whatnot, but here it is:

For Each oShape In ActiveSheet.Shapes
    strImageName = ActiveSheet.Cells(oShape.TopLeftCell.Row, 1).Value
    oShape.Select
    'Picture format initialization
    Selection.ShapeRange.PictureFormat.Contrast = 0.5: Selection.ShapeRange.PictureFormat.Brightness = 0.5: Selection.ShapeRange.PictureFormat.ColorType = msoPictureAutomatic: Selection.ShapeRange.PictureFormat.TransparentBackground = msoFalse: Selection.ShapeRange.Fill.Visible = msoFalse: Selection.ShapeRange.Line.Visible = msoFalse: Selection.ShapeRange.Rotation = 0#: Selection.ShapeRange.PictureFormat.CropLeft = 0#: Selection.ShapeRange.PictureFormat.CropRight = 0#: Selection.ShapeRange.PictureFormat.CropTop = 0#: Selection.ShapeRange.PictureFormat.CropBottom = 0#: Selection.ShapeRange.ScaleHeight 1#, msoTrue, msoScaleFromTopLeft: Selection.ShapeRange.ScaleWidth 1#, msoTrue, msoScaleFromTopLeft
    '/Picture format initialization
    Application.Selection.CopyPicture
    Set oDia = ActiveSheet.ChartObjects.Add(0, 0, oShape.Width, oShape.Height)
    Set oChartArea = oDia.Chart
    oDia.Activate
    With oChartArea
        .ChartArea.Select
        .Paste
        .Export ("H:Webshop_ZpiderStrukturbildene" & strImageName & ".jpg")
    End With
    oDia.Delete 'oChartArea.Delete
Next

answered Aug 14, 2013 at 14:10

Jean Robert's user avatar

Jean RobertJean Robert

2762 silver badges4 bronze badges

1

This code:

Option Explicit

Sub ExportMyPicture()

     Dim MyChart As String, MyPicture As String
     Dim PicWidth As Long, PicHeight As Long

     Application.ScreenUpdating = False
     On Error GoTo Finish

     MyPicture = Selection.Name
     With Selection
           PicHeight = .ShapeRange.Height
           PicWidth = .ShapeRange.Width
     End With

     Charts.Add
     ActiveChart.Location Where:=xlLocationAsObject, Name:="Sheet1"
     Selection.Border.LineStyle = 0
     MyChart = Selection.Name & " " & Split(ActiveChart.Name, " ")(2)

     With ActiveSheet
           With .Shapes(MyChart)
                 .Width = PicWidth
                 .Height = PicHeight
           End With

           .Shapes(MyPicture).Copy

           With ActiveChart
                 .ChartArea.Select
                 .Paste
           End With

           .ChartObjects(1).Chart.Export Filename:="MyPic.jpg", FilterName:="jpg"
           .Shapes(MyChart).Cut
     End With

     Application.ScreenUpdating = True
     Exit Sub

Finish:
     MsgBox "You must select a picture"
End Sub

was copied directly from here, and works beautifully for the cases I tested.

answered Aug 14, 2013 at 14:06

Stewbob's user avatar

StewbobStewbob

16.7k9 gold badges66 silver badges107 bronze badges

»’ Set Range you want to export to the folder

Workbooks(«your workbook name»).Sheets(«yoursheet name»).Select

Dim rgExp As Range: Set rgExp = Range("A1:H31")
''' Copy range as picture onto Clipboard
rgExp.CopyPicture Appearance:=xlScreen, Format:=xlBitmap
''' Create an empty chart with exact size of range copied
With ActiveSheet.ChartObjects.Add(Left:=rgExp.Left, Top:=rgExp.Top, _
Width:=rgExp.Width, Height:=rgExp.Height)
.Name = "ChartVolumeMetricsDevEXPORT"
.Activate
End With
''' Paste into chart area, export to file, delete chart.
ActiveChart.Paste
ActiveSheet.ChartObjects("ChartVolumeMetricsDevEXPORT").Chart.Export "C:ExportmyChart.jpg"
ActiveSheet.ChartObjects("ChartVolumeMetricsDevEXPORT").Delete

answered Apr 16, 2017 at 5:28

Vikash Kumar Singh's user avatar

Dim filepath as string
Sheets("Sheet 1").ChartObjects("Chart 1").Chart.Export filepath & "Name.jpg"

Slimmed down the code to the absolute minimum if needed.

Noam Hacker's user avatar

Noam Hacker

4,5637 gold badges33 silver badges55 bronze badges

answered Feb 16, 2017 at 18:58

Ian Brigmann's user avatar

0

New versions of excel have made old answers obsolete. It took a long time to make this, but it does a pretty good job. Note that the maximum image size is limited and the aspect ratio is ever so slightly off, as I was not able to perfectly optimize the reshaping math. Note that I’ve named one of my worksheets wsTMP, you can replace it with Sheet1 or the like. Takes about 1 second to print the screenshot to target path.

Option Explicit

Private Declare PtrSafe Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)

Sub weGucciFam()

Dim tmp As Variant, str As String, h As Double, w As Double

Application.PrintCommunication = False
Application.EnableEvents = False
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
If Application.StatusBar = False Then Application.StatusBar = "EVENTS DISABLED"

keybd_event vbKeyMenu, 0, 0, 0 'these do just active window
keybd_event vbKeySnapshot, 0, 0, 0
keybd_event vbKeySnapshot, 0, 2, 0
keybd_event vbKeyMenu, 0, 2, 0 'sendkeys alt+printscreen doesn't work
wsTMP.Paste
DoEvents
Const dw As Double = 1186.56
Const dh As Double = 755.28

str = "C:UsersYOURUSERNAMEHEREDesktopScreenshot.jpeg"
w = wsTMP.Shapes(1).Width
h = wsTMP.Shapes(1).Height

Application.DisplayAlerts = False
Set tmp = Charts.Add
On Error Resume Next
With tmp
    .PageSetup.PaperSize = xlPaper11x17
    .PageSetup.TopMargin = IIf(w > dw, dh - dw * h / w, dh - h) + 28
    .PageSetup.BottomMargin = 0
    .PageSetup.RightMargin = IIf(h > dh, dw - dh * w / h, dw - w) + 36
    .PageSetup.LeftMargin = 0
    .PageSetup.HeaderMargin = 0
    .PageSetup.FooterMargin = 0
    .SeriesCollection(1).Delete
    DoEvents
    .Paste
    DoEvents
    .Export Filename:=str, Filtername:="jpeg"
    .Delete
End With
On Error GoTo 0
Do Until wsTMP.Shapes.Count < 1
    wsTMP.Shapes(1).Delete
Loop

Application.PrintCommunication = True
Application.EnableEvents = True
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
Application.StatusBar = False

End Sub

answered Oct 2, 2018 at 20:59

Dexterious22's user avatar

Thanks for the ideas! I used the above ideas to make a macro to do a bulk file conversion—convert every file of one format in a folder to another format.

This code requires a sheet with cells named «FilePath» (which must end in a «»), «StartExt» (original file extension), and «EndExt» (desired file extension). Warning: it doesn’t ask for confirmation before replacing existing files with the same name and extension.

Private Sub CommandButton1_Click()
    Dim path As String
    Dim pathExt As String
    Dim file As String
    Dim oldExt As String
    Dim newExt As String
    Dim newFile As String
    Dim shp As Picture
    Dim chrt As ChartObject
    Dim chrtArea As Chart

    Application.ScreenUpdating = False
    Application.DisplayAlerts = False

    'Get settings entered by user
    path = Range("FilePath")
    oldExt = Range("StartExt")
    pathExt = path & "*." & oldExt
    newExt = Range("EndExt")

    file = Dir(pathExt)

    Do While Not file = "" 'cycle through all images in folder of selected format
        Set shp = ActiveSheet.Pictures.Insert(path & file) 'Import image
        newFile = Replace(file, "." & oldExt, "." & newExt) 'Determine new file name
        Set chrt = ActiveSheet.ChartObjects.Add(0, 0, shp.Width, shp.Height) 'Create blank chart for embedding image
        Set chrtArea = chrt.Chart
        shp.CopyPicture 'Copy image to clipboard
        With chrtArea 'Paste image to chart, then export
            .ChartArea.Select
            .Paste
            .Export (path & newFile)
        End With
        chrt.Delete 'Delete chart
        shp.Delete 'Delete imported image

        file = Dir 'Advance to next file
    Loop

    Application.ScreenUpdating = True
    Application.DisplayAlerts = True


End Sub

answered Aug 16, 2019 at 14:55

Alex Sch's user avatar

Here is another cool way to do it- using en external viewer that accepts command line switches (IrfanView in this case) :
* I based the loop on what Michal Krzych has written above.

Sub ExportPicturesToFiles()
    Const saveSceenshotTo As String = "C:temp"
    Const pictureFormat As String = ".jpg"

    Dim pic As Shape
    Dim sFileName As String
    Dim i As Long

    i = 1

    For Each pic In ActiveSheet.Shapes
        pic.Copy
        sFileName = saveSceenshotTo & Range("A" & i).Text & pictureFormat

        Call ExportPicWithIfran(sFileName)

        i = i + 1
    Next
End Sub

Public Sub ExportPicWithIfran(sSaveAsPath As String)
    Const sIfranPath As String = "C:Program FilesIrfanViewi_view32.exe"
    Dim sRunIfran As String

    sRunIfran = sIfranPath & " /clippaste /convert=" & _
                            sSaveAsPath & " /killmesoftly"

    ' Shell is no good here. If you have more than 1 pic, it will
    ' mess things up (pics will over run other pics, becuase Shell does
    ' not make vba wait for the script to finish).
    ' Shell sRunIfran, vbHide

    ' Correct way (it will now wait for the batch to finish):
    call MyShell(sRunIfran )
End Sub

Edit:

  Private Sub MyShell(strShell As String)
  ' based on:
    ' http://stackoverflow.com/questions/15951837/excel-vba-wait-for-shell-command-to-complete
   ' by Nate Hekman

    Dim wsh As Object
    Dim waitOnReturn As Boolean:
    Dim windowStyle As VbAppWinStyle

    Set wsh = VBA.CreateObject("WScript.Shell")
    waitOnReturn = True
    windowStyle = vbHide

    wsh.Run strShell, windowStyle, waitOnReturn
End Sub

answered Mar 7, 2015 at 11:52

El Scripto's user avatar

El ScriptoEl Scripto

5765 silver badges8 bronze badges

VBA Code Save AS Picture File Macro

Excel Save As Picture

Not As Easy As You’d Think…

One would think that saving something as a picture file (png, jpg, etc…) inside Excel with VBA would be a pretty straightforward exercise. Unfortunately, the “Save as Picture” functionality only exists for saving images of Charts (called exporting). This leaves saving pictures of shapes, icons, and cell ranges void of any VBA automation.

However, with a little bit of creativity, we can utilize the chart object to store our desired image and use the chart object’s Export function to create the image file that we can manually generate by right-clicking and selecting Save as Picture…

In this article I’ll walk you through the basic concept of what the VBA code is doing and also go through two VBA macro examples pertaining to saving shapes/icons and cell ranges in various file formats.

Methodology

Not many people know this but Charts can actually store shapes/objects inside of them. For example, if you have ever copied a textbox and pasted it while a chart is selected, you’ll notice the textbox object appears to be grouped with the chart. Meaning, if you move the chart to a different location, the textbox would move right along with it. What is actually occurring is the textbox is getting embedded within the chart and is essentially now a component of the chart object (think legend, chart title, chart series, axis, etc…).

Notice that the chart object is selected while selecting the textbox? This indicates the textbox has been embedded into the chart object.

Notice that the chart object is selected while selecting the textbox? This indicates the textbox has been embedded into the chart object.

The fact that charts in Excel can absorb other objects is what we will be utilizing to workaround the fact that shapes and other objects cannot be saved as a picture in VBA.

Before we dive into the VBA code, the concept the macro will be utilizing will be to isolate the object you want to save as a picture file and also generating a blank/empty chart object.

VBA Code To Save As Image File

With those two objects in place, the VBA code will simply paste the desired object into the Chart Object (kind of like converting it into a chart!).

VBA Code To Save As Image File

With this concept in mind, let’s take a look at the VBA code I’ve proposed to get this job done!

Save Shape As A PNG File [VBA Code]

Hopefully the following VBA macro is easily to follow along, but I’ll outline essentially the steps it is doing so you can customize it accordingly if needed.

  1. Determine if a shape is selected, if not, don’t proceed. Store the selected shape to a variable (ActiveShape)

  2. Generate a Chart Object that is the exact same size as the selected shape

  3. Remove the chart’s Fill and Border to make the background transparent

  4. Copy the selected shape and Paste it into the Chart Object

  5. Export the Chart Object as a PNG file and save to the user’s desktop

  6. Delete the chart so it appears like nothing has occurred to the user

Sub SaveShapeAsPicture()
‘PURPOSE: Save a selected shape/icon as a PNG file to computer’s desktop
‘SOURCE: www.thespreadsheetguru.com

Dim cht As ChartObject
Dim ActiveShape As Shape
Dim UserSelection As Variant

‘Ensure a Shape is selected
  On Error GoTo NoShapeSelected
    Set UserSelection = ActiveWindow.Selection
    Set ActiveShape = ActiveSheet.Shapes(UserSelection.Name)
  On Error GoTo 0

‘Create a temporary chart object (same size as shape)
  Set cht = ActiveSheet.ChartObjects.Add( _
    Left:=ActiveCell.Left, _
    Width:=ActiveShape.Width, _
    Top:=ActiveCell.Top, _
    Height:=ActiveShape.Height)

‘Format temporary chart to have a transparent background
  cht.ShapeRange.Fill.Visible = msoFalse
  cht.ShapeRange.Line.Visible = msoFalse

    ‘Copy/Paste Shape inside temporary chart
  ActiveShape.Copy
  cht.Activate
  ActiveChart.Paste

   ‘Save chart to User’s Desktop as PNG File
  cht.Chart.Export Environ(«USERPROFILE») & «Desktop» & ActiveShape.Name & «.png»

‘Delete temporary Chart
  cht.Delete

‘Re-Select Shape (appears like nothing happened!)
  ActiveShape.Select

Exit Sub

‘ERROR HANDLERS
NoShapeSelected:
  MsgBox «You do not have a single shape selected!»
  Exit Sub

End Sub

Save Range As A JPG File [VBA Code]

Hopefully the following VBA macro is easily to follow along, but I’ll outline essentially the steps it is doing so you can customize it accordingly if needed.

  1. Determine if a cell range is selected, if not, don’t proceed.

  2. Copy/Paste the range as a picture and store the picture to a variable (ActiveShape)

  3. Generate a Chart Object that is the exact same size as the selected shape

  4. Remove the chart’s Fill and Border to make the background transparent

  5. Copy the selected shape and Paste it into the Chart Object

  6. Export the Chart Object as a PNG file and save to the user’s desktop

  7. Delete the generated chart & picture so it appears like nothing has occurred to the user

Sub SaveRangeAsPicture()
‘PURPOSE: Save a selected cell range as a JPG file to computer’s desktop
‘SOURCE: www.thespreadsheetguru.com

Dim cht As ChartObject
Dim ActiveShape As Shape

‘Confirm if a Cell Range is currently selected
  If TypeName(Selection) <> «Range» Then
    MsgBox «You do not have a single shape selected!»
    Exit Sub
  End If

‘Copy/Paste Cell Range as a Picture
  Selection.Copy
  ActiveSheet.Pictures.Paste(link:=False).Select
  Set ActiveShape = ActiveSheet.Shapes(ActiveWindow.Selection.Name)

  ‘Create a temporary chart object (same size as shape)
  Set cht = ActiveSheet.ChartObjects.Add( _
    Left:=ActiveCell.Left, _
    Width:=ActiveShape.Width, _
    Top:=ActiveCell.Top, _
    Height:=ActiveShape.Height)

‘Format temporary chart to have a transparent background
  cht.ShapeRange.Fill.Visible = msoFalse
  cht.ShapeRange.Line.Visible = msoFalse

    ‘Copy/Paste Shape inside temporary chart
  ActiveShape.Copy
  cht.Activate
  ActiveChart.Paste

   ‘Save chart to User’s Desktop as PNG File
  cht.Chart.Export Environ(«USERPROFILE») & «Desktop» & ActiveShape.Name & «.jpg»

‘Delete temporary Chart
  cht.Delete
  ActiveShape.Delete

‘Re-Select Shape (appears like nothing happened!)
  ActiveShape.Select

End Sub

I Hope This Helped!

Hopefully, I was able to explain how you can use VBA to create image files in Excel. If you have any questions about this technique or suggestions on how to improve it, please let me know in the comments section below.

Chris Newman 2020 - TheSpreadsheetGuru

About The Author

Hey there! I’m Chris and I run TheSpreadsheetGuru website in my spare time. By day, I’m actually a finance professional who relies on Microsoft Excel quite heavily in the corporate world. I love taking the things I learn in the “real world” and sharing them with everyone here on this site so that you too can become a spreadsheet guru at your company.

Through my years in the corporate world, I’ve been able to pick up on opportunities to make working with Excel better and have built a variety of Excel add-ins, from inserting tickmark symbols to automating copy/pasting from Excel to PowerPoint. If you’d like to keep up to date with the latest Excel news and directly get emailed the most meaningful Excel tips I’ve learned over the years, you can sign up for my free newsletters. I hope I was able to provide you some value today and hope to see you back here soon! — Chris

Хитрости »

1 Май 2011              182181 просмотров


Получили по почте файл-прайс с изображениями товара и эти картинки нужны в отдельной папки, а не на листе? Например для загрузки на сайт. Или для других целей. Подобной команды в Excel нет. Вставить картинки можно, а вот обратно к сожалению никак. Хорошо, если картинок штук 10, а если 100? А если таких книг много? И из всех надо сохранить картинки? Решил поделиться кодами, которые могут сохранять картинки из листа Excel в папку.
Если не знаете как применять коды Visual Basic for Applications, то настоятельно рекомендую к прочтению эти статьи:
Что такое макрос и где его искать?
Что такое модуль? Какие бывают модули?
Если хотите использовать один из нижеприведенных кодов, то следует создать стандартный модуль, скопировать нужные код и вставить его в этот модуль.

  • Сохранение выделенной картинки в файл
  • Сохранение всех картинок из всех выбранных файлов Excel в папку
  • Сохранить выделенный диапазон в картинку
  • Сохраняем все картинки с листа в папку с записью в ячейки имен картинок
  • Сохранить картинки с листа с именами картинок из ячеек
Сохранение выделенной картинки в файл

Все, что потребуется это выделить объект/картинку и выполнить нижеприведенный код:

Sub Save_Sel_Object_As_Picture()
    Dim sName As String, oObj As Object, wsTmpSh As Worksheet
    If VarType(Selection) <> vbObject Then
        MsgBox "Выделенная область не является объектом!", vbCritical, "www.excel-vba.ru"
    Exit Sub
    End If
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    Set oObj = Selection: oObj.Copy
    Set wsTmpSh = ThisWorkbook.Sheets.Add
    sName = ActiveWorkbook.FullName & "_" & ActiveSheet.Name & "_" & oObj.Name
    With wsTmpSh.ChartObjects.Add(0, 0, oObj.Width, oObj.Height).Chart
        .ChartArea.Border.LineStyle = 0
        .Parent.Select
        .Paste
        .Export Filename:=sName & ".gif", FilterName:="GIF"
        .Parent.Delete
    End With
    wsTmpSh.Delete
    Application.ScreenUpdating = True
    Application.DisplayAlerts = True
End Sub

Если необходимо сохранить не только картинки, но и другие объекты, то необходимо в коде в строке: If oObj.Type = 13 Then изменить цифру. В коде комментариями указано, какая цифра какой тип обозначает. Так же можно изменить и расширение итогового файла с «.gif» на «.jpg». Достаточно найти расширение gif в коде(в двух местах) и заменить их на jpg. Если ни один объект не выделен, то ничего не произойдет.


Сохранение всех картинок из всех выбранных файлов Excel в папку

Sub Save_Object_As_Picture()
    Dim avFiles, li As Long, oObj As Object, wsSh As Worksheet, wsTmpSh As Worksheet
    Dim sImagesPath As String, sBookName As String, sName As String
    Dim wbAct As Workbook
    Dim IsForEachWbFolder As Boolean
 
    avFiles = Application.GetOpenFilename("Excel Files(*.xls*),*.xls*", , "Выбрать файлы", , True)
    If VarType(avFiles) = vbBoolean Then Exit Sub
 
    IsForEachWbFolder = (MsgBox("Сохранять картинки каждой книги в отдельную папку?", vbQuestion + vbYesNo, "www.excel-vba.ru") = vbYes)
 
    If Not IsForEachWbFolder Then
        sImagesPath = Environ("userprofile") & "desktopimages" '"
        If Dir(sImagesPath, 16) = "" Then
            MkDir sImagesPath
        End If
    End If
    On Error Resume Next
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    Set wsTmpSh = ThisWorkbook.Sheets.Add
    For li = LBound(avFiles) To UBound(avFiles)
        Set wbAct = Workbooks.Open(avFiles(li), False)
        'создаем папку для сохранения картинок
        If IsForEachWbFolder Then
            sImagesPath = wbAct.Path & "" & wbAct.Name & "_images"
            If Dir(sImagesPath, 16) = "" Then
                MkDir sImagesPath
            End If
        End If
        sBookName = wbAct.Name
        For Each wsSh In Sheets
            For Each oObj In wsSh.Shapes
                If oObj.Type = 13 Then
                    '13 - картинки
                    '1 - автофигуры
                    '3 - диаграммы
                    oObj.Copy
                    sName = ActiveWorkbook.Name & "_" & wsSh.Name & "_" & oObj.Name
                    With wsTmpSh.ChartObjects.Add(0, 0, oObj.Width, oObj.Height).Chart
                        .ChartArea.Border.LineStyle = 0
                        .Parent.Select
                        .Paste
                        .Export Filename:=sImagesPath & sName & ".jpg", FilterName:="JPG"
                        .Parent.Delete
                    End With
                End If
            Next oObj
        Next wsSh
        wbAct.Close 0
    Next li
    Set oObj = Nothing: Set wsSh = Nothing
    wsTmpSh.Delete
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
    MsgBox "Объекты сохранены", vbInformation, "www.excel-vba.ru"
End Sub

Код позволяет выбрать одну или несколько книг Excel и сохраняет все картинки со всех листов выбранных книг. При запуске кода предлагается выбрать файлы Excel, картинки из которых надо сохранить. После этого появится запрос: «Сохранять картинки каждой книги в отдельную папку?»

  • Да — для каждой книги будет создана своя папка images, в которую будут сохранены картинки с именами вида: ИмяКниги_ИмяЛиста_ИмяФигуры
  • Нет — на рабочем столе пользователя будет создана папка images, в которую будут сохранены картинки с именами вида: ИмяКниги_ИмяЛиста_ИмяФигуры

Если необходимо сохранить не только картинки, но и другие объекты, то необходимо в коде в строке: If oObj.Type = 13 Then изменить цифру. В коде комментариями указано, какая цифра какой тип обозначает. Так же можно изменить и расширение итогового файла с «.jpg» на «.gif». Достаточно найти расширение jpg в коде(в двух местах) и заменить их на gif. В данном коде я намеренно сделал сохранение в формат jpg, чтобы можно было сравнить с предыдущим кодом и увидеть как правильно менять расширение(формат) файла.


Сохранить выделенный диапазон в картинку

Данные код сохраняет выделенный на листе диапазон в картинку.

Sub Range_to_Picture()
    Dim sName As String, wsTmpSh As Worksheet
    If TypeName(Selection) <> "Range" Then
        MsgBox "Выделенная область не является диапазоном!", vbCritical, "www.excel-vba.ru"
        Exit Sub
    End If
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    With Selection
        .CopyPicture
        Set wsTmpSh = ThisWorkbook.Sheets.Add
        sName = ActiveWorkbook.FullName & "_" & ActiveSheet.Name & "_Range"
        With wsTmpSh.ChartObjects.Add(0, 0, .Width, .Height).Chart
            .ChartArea.Border.LineStyle = 0
            .Parent.Select
            .Paste
            .Export Filename:=sName & ".gif", FilterName:="GIF"
            .Parent.Delete
        End With
    End With
    wsTmpSh.Delete
    Application.ScreenUpdating = True
    Application.DisplayAlerts = True
End Sub

Просто выделяем диапазон, который необходимо сохранить как картинку и запускаем код. Картинка будет сохранена в папку с активной книгой.


СОХРАНЯЕМ ВСЕ КАРТИНКИ С ЛИСТА В ПАПКУ С ЗАПИСЬЮ В ЯЧЕЙКИ ИМЕН КАРТИНОК

Картинки на текст
Код ниже сохраняет все картинки на активном листе в папку

images

, которая создается в папке с книгой Excel, картинки из которой сохраняются. Если папки

images

нет — она будет создана. Картинкам даются имена

«img1», «img2», «img3»

и т.д. Картинки из ячеек удаляются, а на их место записывается имя картинки. Актуально, наверное, для тех, кто из таких файлов делает потом выгрузки в интернет-магазины и пр.

Sub Save_Object_As_Picture()
    Dim li As Long, oObj As Shape, wsSh As Worksheet, wsTmpSh As Worksheet
    Dim sImagesPath As String, sName As String
 
    sImagesPath = ActiveWorkbook.Path & "images" '"
    If Dir(sImagesPath, 16) = "" Then
        MkDir sImagesPath
    End If
    On Error Resume Next
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    Set wsSh = ActiveSheet
    Set wsTmpSh = ActiveWorkbook.Sheets.Add
    For Each oObj In wsSh.Shapes
        If oObj.Type = 13 Then
            li = li + 1
            oObj.Copy
            sName = "img" & li
            With wsTmpSh.ChartObjects.Add(0, 0, oObj.Width, oObj.Height).Chart
                .ChartArea.Border.LineStyle = 0
                .Parent.Select
                .Paste
                .Export Filename:=sImagesPath & sName & ".jpg", FilterName:="JPG"
                .Parent.Delete
            End With
            oObj.TopLeftCell.Value = sName
            oObj.Delete 'удаляем картинку с листа
        End If
    Next oObj
    Set oObj = Nothing: Set wsSh = Nothing
    wsTmpSh.Delete
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
    MsgBox "Объекты сохранены в папке: " & sImagesPath, vbInformation, "www.excel-vba.ru"
End Sub

В коде все так же, как в кодах выше(можно сохранять другие объекты, можно изменить формат сохраняемых картинок). Только при этом в ячейку, в которой была картинка записывается имя, с которым эта картинка была сохранена в папку на компьютере. Сама картинка при этом удаляется. Если удалять не надо, то необходимо просто удалить строку:
oObj.Delete ‘удаляем картинку с листа
Если необходимо записать в ячейку не только имя картинки, но и полный путь(включая путь к папке и расширение картинки), то надо вместо строки:
oObj.TopLeftCell.Value = sName
записать такую:
oObj.TopLeftCell.Value = sImagesPath & sName & «.jpg»


Сохранить картинки с листа с именами картинок из ячеек

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

Sub Save_Object_As_Picture_NamesFromCells()
    Dim li As Long, oObj As Shape, wsSh As Worksheet, wsTmpSh As Worksheet
    Dim sImagesPath As String, sName As String
    Dim lNamesCol As Long, s As String
 
    s = InputBox("Укажите номер столбца с именами для картинок" & vbNewLine & _
                 "(0 - столбец в котором сама картинка)", "www.excel-vba.ru", "")
    If StrPtr(s) = 0 Then Exit Sub
    lNamesCol = Val(s)
 
    sImagesPath = ActiveWorkbook.Path & "images" '"
    If Dir(sImagesPath, 16) = "" Then
        MkDir sImagesPath
    End If
'    On Error Resume Next
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    Set wsSh = ActiveSheet
    Set wsTmpSh = ActiveWorkbook.Sheets.Add
    For Each oObj In wsSh.Shapes
        If oObj.Type = 13 Then
            oObj.Copy
            If lNamesCol = 0 Then
                sName = oObj.TopLeftCell.Value
            Else
                sName = wsSh.Cells(oObj.TopLeftCell.Row, lNamesCol).Value
            End If
            'если в ячейке были символы, запрещенные
            'для использования в качестве имен для файлов - удаляем
            sName = CheckName(sName)
            'если sName в результате пусто - даем имя unnamed_ с порядковым номером
            If sName = "" Then
                li = li + 1
                sName = "unnamed_" & li
            End If
            With wsTmpSh.ChartObjects.Add(0, 0, oObj.Width, oObj.Height).Chart
                .ChartArea.Border.LineStyle = 0
                .Parent.Select
                .Paste
                .Export Filename:=sImagesPath & sName & ".jpg", FilterName:="JPG"
                .Parent.Delete
            End With
        End If
    Next oObj
    Set oObj = Nothing: Set wsSh = Nothing
    wsTmpSh.Delete
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
    MsgBox "Объекты сохранены в папке: " & sImagesPath, vbInformation, "www.excel-vba.ru"
End Sub
'---------------------------------------------------------------------------------------
' Procedure : CheckName
' Purpose   : Функция проверки правильности имени
'---------------------------------------------------------------------------------------
Function CheckName(sName As String)
    Dim objRegExp As Object
    Dim s As String
    Set objRegExp = CreateObject("VBScript.RegExp")
    objRegExp.Global = True: objRegExp.IgnoreCase = True
    objRegExp.Pattern = "[:,\,/,?,*,<,>,',|,""""]"
    s = objRegExp.Replace(sName, "")
    CheckName = s
End Function

Укажите номер столбца с именами для картинок — указывается порядковый номер столбца на листе, из которого брать имя для сохраняемой картинки. Например, сами картинки в столбце H, а имена для них записаны в столбце B. Надо указать 2. Тогда для картинки в ячейке H3 будет использовано имя, записанное в ячейке В3. Расширение для картинки указывать не надо(например — image1, image2, image_product_sell1 и т.п.).
Если номер не указывать или указать 0 — то имя для картинок будет взято из тех ячеек, в которых находятся эти картинки.
Так же проверяется корректность значений в ячейках, т.к. они могут содержать символы, недопустимые в именах файлов(слеши и пр.). В этом случаи эти символы будут удалены. И если после удаления этих символов значение будет пустым — имена картинкам будут даваться с префиксом «unnamed_» и порядковым номером таких картинок.

Скачать пример

  Tips_Macro_Save_Object_As_Picture.xls (76,0 KiB, 15 154 скачиваний)

Также см.:
Сохранить диаграммы в графический файл
Сохранение выделенного диапазона в графический файл
Как скопировать картинку из примечания?


Статья помогла? Поделись ссылкой с друзьями!

  Плейлист   Видеоуроки


Поиск по меткам



Access
apple watch
Multex
Power Query и Power BI
VBA управление кодами
Бесплатные надстройки
Дата и время
Записки
ИП
Надстройки
Печать
Политика Конфиденциальности
Почта
Программы
Работа с приложениями
Разработка приложений
Росстат
Тренинги и вебинары
Финансовые
Форматирование
Функции Excel
акции MulTEx
ссылки
статистика

Сохранить картинку в файл с именем ячейки

vladFo

Дата: Суббота, 21.11.2015, 15:58 |
Сообщение № 1

Группа: Пользователи

Ранг: Новичок

Сообщений: 12


Репутация:

0

±

Замечаний:
0% ±


Excel 2013

Есть файл с каталогом товаров — в нем каждому товару соответствуют картинки, которые надо выгрузить и привязать имя файла к нужной строке. Я вытаскивал картинки несколькими способами — при помощи надстройки которая сохраняет все картинки с листа и сохраняя лист как веб-страницу, и переименовывая исходный xlsx файл в zip или rar архив — однако нужного порядка в именах файлов не было — вместо сквозной нумерации наблюдается хаос какой-то, например, картинка в ячейке A2 — и самая первая в списке товаров — оказывается под именем image33… и тд…В каталоге 400 товаров и вручную прописывать каждому товару соответствующее имя файла картинки это просто безумно долго…каталог подготавливается для csv импорта на сайт…Вобщем помогите с решением…есть ли какой макрос сохраняющий картинки по ячейке или в порядке нахождения на листе?

 

Ответить

Roman777

Дата: Суббота, 21.11.2015, 16:31 |
Сообщение № 2

Группа: Проверенные

Ранг: Ветеран

Сообщений: 980


Репутация:

127

±

Замечаний:
0% ±


Excel 2007, Excel 2013

vladFo, Примерчик облегчил бы понимание ситуации).


Много чего не знаю!!!!

 

Ответить

vladFo

Дата: Суббота, 21.11.2015, 16:56 |
Сообщение № 3

Группа: Пользователи

Ранг: Новичок

Сообщений: 12


Репутация:

0

±

Замечаний:
0% ±


Excel 2013

Roman777, сам файл с картинками 8 МБ, я его обрезал до 8 товаров — но все равно 200 КБ — а форум ругается не более 100… меньше нет смысла…
поэтому сделал скриншот каталога — это начало…

К сообщению приложен файл:

7534753.png
(85.0 Kb)

 

Ответить

Roman777

Дата: Суббота, 21.11.2015, 16:59 |
Сообщение № 4

Группа: Проверенные

Ранг: Ветеран

Сообщений: 980


Репутация:

127

±

Замечаний:
0% ±


Excel 2007, Excel 2013

vladFo, скиньте тогда файлик без картинок… или оставьте одну и попробуйте в Архиве) Ограничения 100кБ на загрузку.


Много чего не знаю!!!!

 

Ответить

vladFo

Дата: Суббота, 21.11.2015, 17:00 |
Сообщение № 5

Группа: Пользователи

Ранг: Новичок

Сообщений: 12


Репутация:

0

±

Замечаний:
0% ±


Excel 2013

А это выгрузка при помощи надстройки…Как видите картинок тех товаров что в начале каталога находятся и в помине нет…

К сообщению приложен файл:

5039002.jpg
(47.3 Kb)

 

Ответить

vladFo

Дата: Суббота, 21.11.2015, 17:05 |
Сообщение № 6

Группа: Пользователи

Ранг: Новичок

Сообщений: 12


Репутация:

0

±

Замечаний:
0% ±


Excel 2013

Вот оставил 3 картинки…

К сообщению приложен файл:

6319365.xlsx
(83.7 Kb)

 

Ответить

vladFo

Дата: Суббота, 21.11.2015, 17:08 |
Сообщение № 7

Группа: Пользователи

Ранг: Новичок

Сообщений: 12


Репутация:

0

±

Замечаний:
0% ±


Excel 2013

У картинки есть свойтсво Замещающий текст — описание — там водимо старое имя файла — у меня получилось его вытащить в соседнюю ячейку при помощи макроса который я нашел в интернете — а дальше не знаю что делать…как можно сохранить файлы по этому свойству?

 

Ответить

Roman777

Дата: Суббота, 21.11.2015, 17:10 |
Сообщение № 8

Группа: Проверенные

Ранг: Ветеран

Сообщений: 980


Репутация:

127

±

Замечаний:
0% ±


Excel 2007, Excel 2013

vladFo, Вы хотите выгрузить картинки и присвоить им имя — артикул товара?


Много чего не знаю!!!!

 

Ответить

vladFo

Дата: Суббота, 21.11.2015, 17:17 |
Сообщение № 9

Группа: Пользователи

Ранг: Новичок

Сообщений: 12


Репутация:

0

±

Замечаний:
0% ±


Excel 2013

Roman777, Можно и так…если это возможно.. просто я почти не разбираюсь в VBA, что-то пытаюсь сейчас читать, но задача срочная и пока я въеду в тему пройдет уйма времени…Поэтому решил спросить совета у знатоков)

 

Ответить

vladFo

Дата: Суббота, 21.11.2015, 17:19 |
Сообщение № 10

Группа: Пользователи

Ранг: Новичок

Сообщений: 12


Репутация:

0

±

Замечаний:
0% ±


Excel 2013

Находил много топиков, в которых решают обратную задачу — загрузить картинки в книгу по списку файлов…

 

Ответить

Roman777

Дата: Суббота, 21.11.2015, 17:48 |
Сообщение № 11

Группа: Проверенные

Ранг: Ветеран

Сообщений: 980


Репутация:

127

±

Замечаний:
0% ±


Excel 2007, Excel 2013

vladFo, Вот так сойдёт?
[vba]

Код

Sub kartinki_von()
Dim i As Long, i_n As Long
Dim obj As shape
Dim NWS As Worksheet, AWS As Worksheet
Set AWS = ActiveSheet
Set NWS = ActiveWorkbook.Sheets.Add
i_n = AWS.Cells(Rows.Count, 2).End(xlUp).Row
For i = 2 To i_n
For Each obj In AWS.Shapes
  If obj.Type = 13 Then
    If AWS.Cells(i, 2).Top = obj.BottomRightCell.Top Then
       obj.Copy
       With NWS.ChartObjects.Add(0, 0, obj.Width, obj.Height).Chart
           .ChartArea.Border.LineStyle = 0
           .Paste
           .Export Filename:=ActiveWorkbook.Path & «» & AWS.Cells(i, 2) & «.jpg», FilterName:=»JPG»
           .Parent.Delete
       End With
    End If
  End If
Next obj
Next i
Application.DisplayAlerts = False
NWS.Delete
Application.DisplayAlerts = True
End Sub

[/vba]
Пока сохраняет в корень папки, где лежит файлик, если надо, можно сделать, чтобы он в корне создавал отдельную папку и туда сохранял.

К сообщению приложен файл:

0022164.xlsm
(57.8 Kb)


Много чего не знаю!!!!

 

Ответить

vladFo

Дата: Суббота, 21.11.2015, 18:04 |
Сообщение № 12

Группа: Пользователи

Ранг: Новичок

Сообщений: 12


Репутация:

0

±

Замечаний:
0% ±


Excel 2013

Roman777, Круто!))) Все получилось! Вы — МАСТЕР!)) СПАСИБО ВАМ ОГРОМНОЕ!))) hands
Даже не знаю как Вас благодарить!?

 

Ответить

Roman777

Дата: Суббота, 21.11.2015, 18:13 |
Сообщение № 13

Группа: Проверенные

Ранг: Ветеран

Сообщений: 980


Репутация:

127

±

Замечаний:
0% ±


Excel 2007, Excel 2013

vladFo, Благодарить нужно не меня, а создателей, администраторов и модераторов этого и подобных сайтов, которые позволяют нам получать подобные знания))).
Рад что смог помочь).


Много чего не знаю!!!!

Сообщение отредактировал Roman777Суббота, 21.11.2015, 18:14

 

Ответить

vladFo

Дата: Суббота, 21.11.2015, 18:31 |
Сообщение № 14

Группа: Пользователи

Ранг: Новичок

Сообщений: 12


Репутация:

0

±

Замечаний:
0% ±


Excel 2013

Roman777, Еще раз СПАСИБО! И ВАМ и Сайту!))

 

Ответить

Minerva76

Дата: Пятница, 27.10.2017, 10:08 |
Сообщение № 15

Группа: Пользователи

Ранг: Прохожий

Сообщений: 7


Репутация:

0

±

Замечаний:
20% ±


Excel 2007

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

Доброе утро!
Пробую воспользоваться вашим макросом, но у меня съезжают названия присвоенные картинкам и приходится переименовывать вручную, Вы не могли бы проверить , может где ошибка в макросе.
Вот на скрине видно, что костюм в файле отличается с присвоенным номером на картинке на 1 порядковый номер

К сообщению приложен файл:

0071095.png
(136.2 Kb)

Сообщение отредактировал Minerva76Пятница, 27.10.2017, 10:12

 

Ответить

китин

Дата: Пятница, 27.10.2017, 10:28 |
Сообщение № 16

Группа: Модераторы

Ранг: Экселист

Сообщений: 6973


Репутация:

1063

±

Замечаний:
0% ±


Excel 2007;2010;2016

здесь что, форум по фотошопу?


Не судите очень строго:я пытаюсь научиться
ЯД 41001877306852

 

Ответить

buchlotnik

Дата: Пятница, 27.10.2017, 11:14 |
Сообщение № 17

Группа: Заблокированные

Ранг: Участник клуба

Сообщений: 3442


Репутация:

929

±

Замечаний:
20% ±


2010, 2013, 2016 RUS / ENG

[offtop] Игорь, я тебя умоляю — по Paint-у :D

Сообщение отредактировал buchlotnikПятница, 27.10.2017, 11:14

 

Ответить

Minerva76

Дата: Пятница, 27.10.2017, 15:19 |
Сообщение № 18

Группа: Пользователи

Ранг: Прохожий

Сообщений: 7


Репутация:

0

±

Замечаний:
20% ±


Excel 2007

здесь что, форум по фотошопу?

Добрый день, а что не так? и при чем тут фотошоп? Скажите что надо прикрепить, я это сделаю, скрин прикрепила, что бы было видно, что я не голословна, что нумерация неверная

 

Ответить

_Boroda_

Дата: Пятница, 27.10.2017, 15:39 |
Сообщение № 19

Группа: Модераторы

Ранг: Местный житель

Сообщений: 16618


Репутация:

6465

±

Замечаний:
0% ±


2003; 2007; 2010; 2013 RUS

— Прочитайте Правила форума
— Приложите файл в формате Excel размером до 100кб согласно п.3 Правил форума


Скажи мне, кудесник, любимец ба’гов…
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995

 

Ответить

Minerva76

Дата: Суббота, 28.10.2017, 00:38 |
Сообщение № 20

Группа: Пользователи

Ранг: Прохожий

Сообщений: 7


Репутация:

0

±

Замечаний:
20% ±


Excel 2007

— Прочитайте Правила форума
— Приложите файл в формате Excel размером до 100кб согласно п.3 Правил форума

спасибо, теперь понятно

 

Ответить

0 / 0 / 0

Регистрация: 20.09.2010

Сообщений: 23

1

20.09.2010, 11:47. Показов 10026. Ответов 7


Студворк — интернет-сервис помощи студентам

Всем здрасти. Прошу Вас помочь мне вот в чем. Я из 1С через OLE подключаюсь к Ексель файлам и скачиваю необходимую информацию, но на некоротых листах рабочей книги вставлены рисунки. Необходимо программное обращение к коллекции изображений на листе и сохранение их по указанной директории.

Всем спасибо !



0



Vlanib

Частенько бываю

749 / 330 / 42

Регистрация: 20.06.2007

Сообщений: 854

20.09.2010, 14:21

2

Вот такой есть способ:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Sub PictureExport()
Dim sTmpChartName As String, oShp As Shape
Application.ScreenUpdating = False
With ActiveSheet
    For Each oShp In .Shapes
        If oShp.Type = msoPicture Then
            Charts.Add
            ActiveChart.Location xlLocationAsObject, .Name
            Selection.Border.LineStyle = 0
            sTmpChartName = Split(ActiveChart.Name, .Name & " ")(1)
            .Shapes(sTmpChartName).Width = oShp.Width
            .Shapes(sTmpChartName).Height = oShp.Height
            .Shapes(oShp.Name).Copy
            ActiveChart.ChartArea.Select
            ActiveChart.Paste
            .ChartObjects(1).Chart.Export Filename:=ActiveWorkbook.Path & "" & Split(ActiveWorkbook.Name, ".")(0) & "_" & oShp.Name & ".jpg", FilterName:="jpg"
            .Shapes(sTmpChartName).Cut
        End If
    Next
End With
Application.ScreenUpdating = True
End Sub



0



0 / 0 / 0

Регистрация: 20.09.2010

Сообщений: 23

20.09.2010, 15:46

 [ТС]

3

Vlanib, большое спасибо за вариант. Вижу что объект Шейп как рисунок используется в диаграмме для того чтобы его далее можно было экспортировать в файл. А можно каким либо другим, более простым способом сохранить в файл. Это конечно вариант, но у меня очень много страниц обрабатывается и каждый раз создавать новый объект TChart, да еще и через OLE.



0



Частенько бываю

749 / 330 / 42

Регистрация: 20.06.2007

Сообщений: 854

20.09.2010, 16:57

4

Я задавался как-то этим вопросом, но на всех форумах, в т.ч. и зарубежных нашел только такой выход.
Если найдете более простой вариант, то сообщите плз.



0



ProgerLink

0 / 0 / 0

Регистрация: 20.09.2010

Сообщений: 23

21.09.2010, 11:41

 [ТС]

5

Вот еще один вариант нашел, но не скажу что он лучше, но вариант. Делается через Буфер и паинт.
Текст:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
Sub Макрос1()
With ActiveSheet
For Each oShp In .Shapes
If oShp.Type = msoPicture Then
 
oShp.Copy
Set WshShell = CreateObject("WScript.Shell")
 
'Запускаем Паинт, через буфер обмена вставляем в него рисунок
WshShell.Run ("""%systemroot%system32mspaint.exe """)
Success = False
  Do Until Success = True
    Success = WshShell.AppActivate("Безымянный - Paint")
    waitfor (1)
  Loop
 
waitfor (1)
WshShell.SendKeys "^{v}"
 
waitfor (1)
 
WshShell.SendKeys "^{s}"
waitfor (1)
Filename = "Pic" & Replace(Replace(Now, "/", "-"), ":", "_")
WshShell.SendKeys Filename
waitfor (1)
WshShell.SendKeys "{ENTER}"
 
'Закрываем Paint
Success = False
  Do Until Success = True
    Success = WshShell.AppActivate(Filename & " - Paint")
    waitfor (1)
  Loop
 
WshShell.SendKeys "%{F4}"
 
 
End If
Next
End With
 
    
End Sub
Sub waitfor(secunds)
    'Задержка в секундах
    newHour = Hour(Now())
    newMinute = Minute(Now())
    newSecond = Second(Now()) + secunds
    waitTime = TimeSerial(newHour, newMinute, newSecond)
    Application.Wait waitTime
End Sub



0



Частенько бываю

749 / 330 / 42

Регистрация: 20.06.2007

Сообщений: 854

21.09.2010, 16:36

6

Скажу я вам, что запуск стороннего приложения, размещение его в памяти и взаимодействие с ним врядли будет быстрее шейпов excel



0



0 / 0 / 0

Регистрация: 28.09.2009

Сообщений: 88

22.09.2010, 08:59

7

Вот ещё вариант: http://yoksel.net.ru/Ob’ektyVs… 9;Kartinki

Есть, конечно, и другие варианты (без использования Charts и SendKeys), но ссылки дать не могу, ибо они выложены на других форумах.
Но все эти варианты так или иначе используют буфер обмена.

Я обычно в таких случаях сначала копирую картинку: sha.CopyPicture xlScreen, xlBitmap
а потом использую функции типа GetClipPicture (наберите название этой функции в Яндексе)



0



ProgerLink

0 / 0 / 0

Регистрация: 20.09.2010

Сообщений: 23

23.09.2010, 14:35

 [ТС]

8

Всем спасибо. Использовал вариант предложенный Vlanib. Так как программное обращение было из 1С, выкладываю код, мало ли у кого будет подобная ситуация.
Примерно следующее:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
Ексель = СоздатьОбъект("Excel.Application");
Книга=Ексель.WorkBooks.Open(ПутьКФайлу);
ФлагСозданияНовогоЛиста=1;
Для н=1 По 10 Цикл
        Для г=1 По Ексель.ActiveWorkbook.Worksheets("Вопрос"+н).Shapes.Count Цикл
            Если Ексель.ActiveWorkbook.Worksheets("Вопрос"+н).Shapes.Item(г).Type=13 Тогда //Рисунок
                
                Если ФлагСозданияНовогоЛиста=0 Тогда
                    НовыйЛист=Ексель.ActiveWorkbook.Worksheets.Add();
                    НовыйЛист.Name="ForExport";
                    ФлагСозданияНовогоЛиста=1;
                КонецЕсли;
                
                Ексель.Charts.Add();
                Ексель.ActiveChart.Location(2, "ForExport");
                
                ВсегоФигурНаЛисте=Ексель.ActiveWorkbook.Worksheets("ForExport").Shapes.Count();
                Ексель.ActiveWorkbook.Worksheets("ForExport").Shapes(ВсегоФигурНаЛисте).Width=Ексель.ActiveWorkbook.Worksheets("Вопрос"+н).Shapes.Item(г).Width;
                Ексель.ActiveWorkbook.Worksheets("ForExport").Shapes(ВсегоФигурНаЛисте).Height=Ексель.ActiveWorkbook.Worksheets("Вопрос"+н).Shapes.Item(г).Height;
                Ексель.ActiveWorkbook.Worksheets("Вопрос"+н).Shapes.Item(г).Copy();
                Ексель.ActiveChart.ChartArea.Select();
                Ексель.ActiveChart.Paste();
                ВсегоОбъектовДиаграммы=Ексель.ActiveWorkbook.Worksheets("ForExport").ChartObjects.Count();
                
                Если ФС.СуществуетФайл(КаталогИБ()+"ExtFormsИзображения")=0 Тогда
                    ФС.СоздатьКаталог(КаталогИБ()+"ExtFormsИзображения");
                КонецЕсли;
                
                Ексель.ActiveWorkbook.Worksheets("ForExport").ChartObjects(ВсегоОбъектовДиаграммы).Chart.Export(КаталогИБ()+"ExtFormsИзображения"+Ексель.ActiveWorkbook.Name+"_Вопрос_"+н+".jpg", "jpg");
                СпрВопросы.ФайлИзображения=Ексель.ActiveWorkbook.Name+"_Вопрос_"+н+".jpg";
            КонецЕсли;
        КонецЦикла;
КонецЦикла;
Книга.Close(0);

P.S. Создавал Чарты на отдельном листе. По сути объект Чарт можно было создать только один и далее перезаливать в него новое изображение



0



Like this post? Please share to your friends:
  • Картинки рамок для текста word
  • Картинки в прайсе в excel
  • Картинки для гиперссылок в excel
  • Картинки рамки для microsoft word
  • Картинки в выпадающем списке excel