MyTetra Share
Делитесь знаниями!
Сохранить выделенный диапазон в картинку
Время создания: 16.03.2019 23:43
Текстовые метки: VBA_Excel, Shape, Shapes, SaveRange, CopyPicture
Раздел: !Закладки - VBA - Excel - Shapes
Запись: xintrea/mytetra_db_adgaver_new/master/base/1526044111sw0b77c6hy/text.html на raw.githubusercontent.com

'---------------------------------------------------------------------------------------

' Module : mSaveObjectAsPicture

' DateTime : 05.03.2011 18:22

' Author : The_Prist(Щербаков Дмитрий)

' WebMoney - R298726502453; Яндекс.Деньги - 41001332272872

' http://www.excel-vba.ru

' Purpose : http://www.excel-vba.ru/chto-umeet-excel/kak-soxranit-kartinki-iz-lista-excel-v-kartinki-jpg/

'---------------------------------------------------------------------------------------

Option Explicit



'=============================================================================================

' Procedure : Range_to_Picture

' Author : The_Prist(Щербаков Дмитрий)

' WebMoney - R298726502453; Яндекс.Деньги - 41001332272872

' http://www.excel-vba.ru

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

'

'----------------------------------------------------------------------------------------------

Sub SaveRange_to_JPG()

Dim aTemp As Variant

Dim lngRowStart As Long, lngRowEnd As Long


With ThisWorkbook.Sheets("ListConfig_JPG")

lngRowStart = 2

lngRowEnd = .Columns(2).Rows(65536).End(xlUp).Row

aTemp = Range(.Cells(lngRowStart, 1), .Cells(lngRowEnd, 6)).Value

End With

Application.Calculation = xlCalculationAutomatic

FnRange_to_Picture aTemp, "jpg", "jpg"

End Sub

'----------------------------------------------------------------------------------------------

'сохраняем по выделенным в таблице именам листов

Sub SaveRange_to_XSLX_Selected()

Dim aTemp As Variant

Dim rRange As Range, rCell As Range

Dim lngRowStart As Long, lngRowEnd As Long

'проверки

If ActiveSheet.Name <> "ListConfig_JPG" Then Exit Sub

If ActiveCell.Column > 6 Then Exit Sub



Set rRange = Selection

With rRange

lngRowStart = .Row

lngRowEnd = lngRowStart

For Each rCell In .Cells 'цикл для поиск максимальной строки

If rCell.Row > lngRowEnd Then lngRowEnd = rCell.Row

Next 'rCell

End With

If Trim(Len(ActiveCell.Value)) = 0 Then Exit Sub


With ThisWorkbook.Sheets("ListConfig_JPG")

If lngRowStart = 0 Then lngRowStart = ActiveCell.Row

If lngRowEnd = 0 Then lngRowEnd = lngRowStart

aTemp = Range(.Cells(lngRowStart, 1), .Cells(lngRowEnd, 6)).Value

End With

Application.Calculation = xlCalculationAutomatic

FnRange_to_Picture aTemp, "xlsx", "xlsx"

End Sub

'----------------------------------------------------------------------------------------------

'сохраняем по выделенным в таблице именам листов

Sub SaveRange_to_XSLX_In_Sh()

Dim i As Long

Dim aTemp As Variant, vNamesSlide As Variant

Dim strSh As String

Dim lngRowStart As Long, lngRowEnd As Long


strSh = ActiveSheet.Name

With ThisWorkbook.Sheets("ListConfig_JPG")

lngRowStart = 2

lngRowEnd = .Columns(2).Rows(65536).End(xlUp).Row

vNamesSlide = Range(.Cells(lngRowStart, 1), .Cells(lngRowEnd, 6)).Value

End With

' цикл по всему списку листов

For i = LBound(vNamesSlide) To UBound(vNamesSlide)

'если имя совпадает, то набираем массив и выполняем сохранение

If Trim(vNamesSlide(i, 3)) = strSh Then

ReDim aTemp(1 To 1, 1 To 6)

aTemp(1, 1) = vNamesSlide(i, 1)

aTemp(1, 2) = vNamesSlide(i, 2)

aTemp(1, 3) = vNamesSlide(i, 3)

aTemp(1, 4) = vNamesSlide(i, 4)

aTemp(1, 5) = vNamesSlide(i, 5)

aTemp(1, 6) = vNamesSlide(i, 6)

Application.Calculation = xlCalculationAutomatic

FnRange_to_Picture aTemp, "xlsx", "xlsx"

End If

Next i


End Sub

'----------------------------------------------------------------------------------------------

Sub SaveRange_to_XSLX()

Dim aTemp As Variant

Dim lngRowStart As Long, lngRowEnd As Long


With ThisWorkbook.Sheets("ListConfig_JPG")

lngRowStart = 2

lngRowEnd = .Columns(2).Rows(65536).End(xlUp).Row

aTemp = Range(.Cells(lngRowStart, 1), .Cells(lngRowEnd, 6)).Value

End With

Application.Calculation = xlCalculationAutomatic

FnRange_to_Picture aTemp, "xlsx", "xlsx"

End Sub

'----------------------------------------------------------------------------------------------

Sub FnRange_to_Picture(ByVal vNamesSlide As Variant, _

ByVal strSubCatalog As String, _

ByVal strExt As String)

'Const strPathMain As String = "<path_to_folder_or_file>"

Const strPathMain As String = "<path_to_folder_or_file>"

Const strRangeMain As String = "$A$1:$BC$36"


Dim sName As String

Dim strFileName As String

Dim wsTmpSh As Worksheet

Dim rRange As Range

Dim i As Long

Dim strShName As String

Dim strRange As String



If Not IsArray(vNamesSlide) Then Exit Sub

'If TypeName(Selection) <> "Range" Then

' MsgBox "Выделенная область не является диапазоном!", vbCritical, "www.excel-vba.ru"

' Exit Function

'End If

'путь к папке

sName = strPathMain

If Len(strSubCatalog) > 0 Then sName = sName & strSubCatalog & "\"


'на входе в процедуру

Dim vCalculation As Variant

vCalculation = Application.Calculation

FnEventsValue 1, vCalculation





For i = LBound(vNamesSlide) To UBound(vNamesSlide)

strShName = vNamesSlide(i, 3)

strRange = vNamesSlide(i, 4)

If Len(strShName) > 0 Then

Set rRange = ThisWorkbook.Sheets(strShName).Range(strRange)

If vNamesSlide(i, 6) = 1 Then

With rRange

.CopyPicture

Select Case strExt

Case "jpg":

Set wsTmpSh = ThisWorkbook.Sheets.Add

strFileName = sName & "_" & vNamesSlide(i, 1) & "_" & vNamesSlide(i, 2) & ".jpg"

With wsTmpSh.ChartObjects.Add(0, 0, .Width, .Height).Chart

.ChartArea.Border.LineStyle = 0

.Paste

' .Export Filename:=sName & ".gif", FilterName:="GIF"

.Export Filename:=strFileName, FilterName:="JPG"

.Parent.Delete

End With

wsTmpSh.Delete

Case "xlsx"

'создать книгу+форматирование листа

Dim oWb As Workbook

Set oWb = Workbooks.Add

oWb.Sheets(1).Name = "1"

oWb.Sheets(1).Cells.ColumnWidth = 2.17

oWb.Sheets(1).Cells.RowHeight = 13.5

Dim rRangeMain As Range 'для определения размера картинки

Set rRangeMain = oWb.Sheets(1).Range(strRangeMain)

' Stop

'вставить изображение+подогнать размер

oWb.Sheets(1).Paste

oWb.Sheets(1).Shapes(1).LockAspectRatio = msoFalse

oWb.Sheets(1).Shapes(1).Width = rRangeMain.Width - 9 '730

oWb.Sheets(1).Shapes(1).Height = rRangeMain.Height - 9 '470

oWb.Sheets(1).Shapes(1).IncrementLeft 6 'сдвиг вправо

oWb.Sheets(1).Shapes(1).IncrementTop 6 'сдвиг вниз

Application.PrintCommunication = False

ActiveWindow.View = xlPageBreakPreview

oWb.Sheets(1).PageSetup.PrintArea = strRangeMain

oWb.Sheets(1).Range(strRangeMain).Interior.Color = vbWhite


oWb.Sheets(1).PageSetup.PrintErrors = xlPrintErrorsDisplayed

oWb.Sheets(1).PageSetup.Orientation = xlLandscape

oWb.Sheets(1).PageSetup.Zoom = 100

oWb.Sheets(1).PageSetup.FitToPagesWide = 1

oWb.Sheets(1).PageSetup.FitToPagesTall = 1

' .Zoom = False

' .FitToPagesWide = 1

' .FitToPagesTall = 1

Application.PrintCommunication = True

'сохранить в архив

strFileName = sName & "_" & vNamesSlide(i, 1) & "_" & vNamesSlide(i, 2) & ".xlsx"

'проверяем существование файла

On Error Resume Next

Dim FileExists As Boolean

FileExists = Dir(strFileName) <> vbNullString

If Err.Number > 0 Then Kill strFileName 'FileExists = False

On Error GoTo 0

oWb.SaveAs (strFileName), _

FileFormat:=xlOpenXMLWorkbook, _

Password:="", WriteResPassword:="", _

ReadOnlyRecommended:=False

oWb.Close


End Select

End With

End If

End If

Next i

'на выходе из процедуры

FnEventsValue 2, vCalculation

End Sub

'=============================================================================================



''---------------------------------------------------------------------------------------

'' Procedure : Save_Sel_Object_As_Picture

'' Author : The_Prist(Щербаков Дмитрий)

'' WebMoney - R298726502453; Яндекс.Деньги - 41001332272872

'' http://www.excel-vba.ru

'' Purpose : Сохранение только выделенного объекта в формат GIF

''---------------------------------------------------------------------------------------

'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

' .Paste

' .Export Filename:=sName & ".gif", FilterName:="GIF"

' .Parent.Delete

' End With

' wsTmpSh.Delete

' Application.ScreenUpdating = True

' Application.DisplayAlerts = True

'End Sub

''---------------------------------------------------------------------------------------

'' Procedure : Save_AllObjectsFromFiles_As_Picture

'' Author : The_Prist(Щербаков Дмитрий)

'' WebMoney - R298726502453; Яндекс.Деньги - 41001332272872

'' http://www.excel-vba.ru

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

''---------------------------------------------------------------------------------------

'Sub Save_AllObjectsFromFiles_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") & "\desktop\images\" '"

' 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

' .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

''---------------------------------------------------------------------------------------

'' Procedure : Range_to_Picture

'' Author : The_Prist(Щербаков Дмитрий)

'' WebMoney - R298726502453; Яндекс.Деньги - 41001332272872

'' http://www.excel-vba.ru

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

''

''---------------------------------------------------------------------------------------

'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

' .Paste

' .Export Filename:=sName & ".gif", FilterName:="GIF"

' .Export Filename:=sImagesPath & sName & ".jpg", FilterName:="JPG"

' .Parent.Delete

' End With

' End With

' wsTmpSh.Delete

' Application.ScreenUpdating = True

' Application.DisplayAlerts = True

'End Sub

''---------------------------------------------------------------------------------------

'' Procedure : Save_AllObject_As_Picture_NamesToCells

'' Author : The_Prist(Щербаков Дмитрий)

'' WebMoney - R298726502453; Яндекс.Деньги - 41001332272872

'' http://www.excel-vba.ru

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

''---------------------------------------------------------------------------------------

'Sub Save_AllObject_As_Picture_NamesToCells()

' 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

' .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

''---------------------------------------------------------------------------------------

'' Procedure : Save_Object_As_Picture_NamesFromCells

'' Author : The_Prist(Щербаков Дмитрий)

'' WebMoney - R298726502453; Яндекс.Деньги - 41001332272872

'' http://www.excel-vba.ru

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

''---------------------------------------------------------------------------------------

'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

' .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

'


Так же в этом разделе:
 
MyTetra Share v.0.59
Яндекс индекс цитирования