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
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 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
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
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
4,5637 gold badges33 silver badges55 bronze badges
answered Feb 16, 2017 at 18:58
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
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
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 ScriptoEl Scripto
5765 silver badges8 bronze badges
Export Excel Range to Image (jpg/png/gif) using Vba?
This code ill convert the data in Excel workbook into a jpg image file as how it is displayed on screen.
The image format can be jpg, png or gif. We have not tested if this supports other image formats as well, but you can try it.
Related Post: Convert Excel to PDF file.
The output image file will be saved in the same path as the Excel workbook. Change the path if You want to save the image file in a different location.
Sub ExcelToJPGImage(imageRng As Range) 'Code from officetricks.com Dim sImageFilePath As String sImageFilePath = ThisWorkbook.Path & Application.PathSeparator & "ExcelRangeToImage_" sImageFilePath = sImageFilePath & VBA.Format(VBA.Now, "DD_MMM_YY_HH_MM_SS_AM/PM") & ".jpg" 'Create Temporary workbook to hold image Dim wbTemp As Workbook Set wbTemp = Workbooks.Add(1) 'Copy image & Save to new file imageRng.CopyPicture xlScreen, xlPicture wbTemp.Activate With wbTemp.Worksheets("Sheet1").ChartObjects.Add(imageRng.Left, imageRng.Top, imageRng.Width, imageRng.Height) .Activate .Chart.Paste .Chart.Export Filename:=sImageFilePath, FilterName:="jpg" End With 'Close Temp workbook wbTemp.Close False Set wbTemp = Nothing MsgBox "Image File Saved To: " & sImageFilePath End Sub
There is no direction function to save Excel range as jpg image file. But there is function to export a Chart to image file. We are actually tricking this for our purpose.
External Reference: Microsoft article that explains more about this function.
Uses of Converting Range to Image
Excel has option to protect the sheet from getting edited by unauthorized user. Though, You can use this option & convert the data to image file or PDF file to make it tough for others to edit it.
The other use is that, sometimes if the Excel data is sent as Outlook mail. In that case, users convert Excel to HTML table format & make it mail content. In this methods, sometimes, the alignment is disturbed on the receiver’s end. If this is converted to image and sent as Outlook mail, the format is preserved.
To publish Excel table format in websites or blogs, the data can be converted to image and posted. This would make tough for the data scrapping people to extract data. One problem with this methods is that, the image files will be of huge volume than the actual data. This would increase the website loading time.
Overall, it is a good way to preserve files with the original data.
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.
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.
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!).
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.
-
Determine if a shape is selected, if not, don’t proceed. Store the selected shape to a variable (ActiveShape)
-
Generate a Chart Object that is the exact same size as the selected shape
-
Remove the chart’s Fill and Border to make the background transparent
-
Copy the selected shape and Paste it into the Chart Object
-
Export the Chart Object as a PNG file and save to the user’s desktop
-
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.
-
Determine if a cell range is selected, if not, don’t proceed.
-
Copy/Paste the range as a picture and store the picture to a variable (ActiveShape)
-
Generate a Chart Object that is the exact same size as the selected shape
-
Remove the chart’s Fill and Border to make the background transparent
-
Copy the selected shape and Paste it into the Chart Object
-
Export the Chart Object as a PNG file and save to the user’s desktop
-
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.
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
Hi, I can give to you 2 codes. One good, 2nd great.
First is universal, but sometimes is hart to scale range of picture area:
Option Explicit Declare Function SystemParametersInfo Lib "user32" _ Alias "SystemParametersInfoA" (ByVal iAction As Long, _ ByVal iParam As Long, pvParam As Any, _ ByVal fWinIni As Long) As Long Function FEnableFontSmoothing(SwON As Boolean) As Boolean FEnableFontSmoothing = SystemParametersInfo(75, SwON, 0, &H1) End Function Function GetFontSmoothing() As Boolean Dim iResults As Boolean, pv As Integer 'Get font smoothing value and return true if font smoothing is turned on. iResults = SystemParametersInfo(74, 0, pv, 0) If pv > 0 Then GetFontSmoothing = True Else GetFontSmoothing = False End If End Function Sub Exportuj_jako_Obrazek() Dim RngObraz As Range, oSheet As Worksheet Dim oChart As Chart, oObraz As Picture, nazwa$ Dim Rodzaj$: Rodzaj = "png" '"bmp","jpg","gif","png") Dim TrueType As Boolean Application.ScreenUpdating = False TrueType = FEnableFontSmoothing(False) nazwa = "Test" ' lub z komórki Range("b1").Text & " " & Range("b2").Text Set RngObraz = Selection ' lub określony Range("A1:N20") Set oSheet = Worksheets.Add Charts.Add ActiveChart.Location Where:=xlLocationAsObject, name:=oSheet.name Set oChart = ActiveChart RngObraz.CopyPicture Appearance:=xlScreen, Format:=xlPicture oChart.Paste Set oObraz = Selection If RngObraz.Cells.Count > 40 Then With oChart.Parent .Width = 1.2 * oObraz.Width .Height = 1.8 * oObraz.Height End With End If oChart.Export FileName:="C:Temp" & nazwa & "." & Rodzaj, FilterName:=Rodzaj With Application .DisplayAlerts = False oSheet.Delete .DisplayAlerts = True .ScreenUpdating = True End With TrueType = FEnableFontSmoothing(True) End Sub
Secound with very good quality, but ext =EMF
'to workbook Sub EksportujDoObrazuEMF() Call EksportujObiektDoEMF(ActiveWindow.VisibleRange) MsgBox "Its done ;-)" End Sub 'to seperate module Option Explicit Private Declare Function OpenClipboard Lib "User32" _ (ByVal hwnd As Long) As Long Private Declare Function CloseClipboard Lib "User32" () As Long Private Declare Function GetClipboardData Lib "User32" _ (ByVal uFormat As Long) As Long Private Declare Function CopyEnhMetaFileA Lib "Gdi32" _ (ByVal hemfSrc As Long, ByVal lpszFile As String) As Long Private Declare Function DeleteEnhMetaFile Lib "Gdi32" _ (ByVal hdc As Long) As Long Sub EksportujObiektDoEMF(Obj As Object) Dim PlikEMF, Rep As Long PlikEMF = ThisWorkbook.Path & "tmp_img.emf" If Dir$(PlikEMF) <> "" Then Kill PlikEMF End If If Export2emf(Obj, PlikEMF) = "" Then MsgBox "Błąd przy eksporcie pliku !", vbCritical End If End Sub Private Function Export2emf(Objet As Object, _ NazwaPliku, Optional Apparence, _ Optional Format, Optional Size) As String Export2emf = NazwaPliku If TypeName(Objet.Parent) = "Chart" Then Objet.Parent.CopyPicture Apparence, Format, Size ElseIf TypeName(Objet) <> "Chart" Then Objet.CopyPicture Apparence, Format Else Objet.CopyPicture Apparence, Format, Size End If OpenClipboard 0 If DeleteEnhMetaFile(CopyEnhMetaFileA(GetClipboardData(14), _ Export2emf)) = 0 Then Export2emf = "" CloseClipboard End Function
Oskar Shon, Office System
MVP
Press if Helpful; Answer when a problem solved
-
Proposed as answer by
danishani
Monday, February 13, 2012 12:23 AM -
Marked as answer by
danishani
Tuesday, February 14, 2012 12:12 AM
Хитрости »
1 Май 2011 182153 просмотров
Получили по почте файл-прайс с изображениями товара и эти картинки нужны в отдельной папки, а не на листе? Например для загрузки на сайт. Или для других целей. Подобной команды в 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
ссылки
статистика