Как стать автором
Обновить

Масштабирование картинок в Excel

Предлагаю всем интересующимся макрос, который масштабирует картинки в Excel.

При открытии книги назначаются сочетания клавиш, которые позволяют каждой картинке в рабочей книге присвоить оригинальное имя, базовый масштаб (в Замещающий текст) и назначить макрос, который при клике на картинку будет выполнять её увеличение.

Отдельные картинки, в режиме когда они увеличены, можно масштабировать динамически с сохранением нового значения масштаба используя клавиши Ctrl+Alt+UP и Ctrl+Alt+DOWN.

Для присвоения базового масштаба картинкам необходимо после открытия книги с данным макросом нажать Ctrl+Alt+Right. По умолчанию картинкам присваивается масштаб равный 90% высоты всех строк, которые видны на экране. Если размеры экрана изменить — изменится и размер увеличенной картинки.

Чтобы заменить значение по умолчанию для всех картинок используются клавиши Ctrl+Alt+Left
Текст макроса с комментариями ниже:

Private Sub auto_open()
Application.OnKey "^%{RIGHT}", "EnumImageV2" 'Запуск перенумерации картинок выполняется по нажатию клавиш Ctrl+Alt+Стрелка вправо
Application.OnKey "^%{LEFT}", "ImgScaleAll" 'Изменение масштаба всех картинок на листе выполняется по нажатию клавиш Ctrl+Alt+Стрелка влево
ThisWorkbook.OnSheetActivate = "DelImg" 'Сброс увеличенных картинок при переключении листов
End Sub

Private Sub ImgScaleAll()
    DelImg                  'Удаляются все увеличенные ккартинки
    dblSend = InputBox("Масштаб задается в виде положительной десятичной дроби" & Chr(13) & "(разделитель запятая)" & Chr(13) _
    & "Чем больше цифра, тем больше картинка", "Укажите масштаб для ВСЕХ картинок", 0.9)
    On Error Resume Next
    dblSend = CDbl(dblSend)  'Если  введено правильное число, через запятую, то все пойдёт дальше, иначе сообщение об  ошибке
    If Err Then
        If MsgBox("Вы ввели неверное значение" & Chr(13) & "Хотите повторить?", vbYesNo) = vbYes Then
            ImgScaleAll         'Перезапуск текущего макроса, при желании  пользователя повторить ввод
        Else: Exit Sub          'При отказе  пользователя повторить ввод - выход из макроса
        End If
    End If
    Err.Clear
    EnumImageV2 CDbl(dblSend)   'вызывается макрос  перенумерации картинок, но в нем не выполняется перенумерация, а просто присваивается новый масштаб
End Sub

Private Sub ImgScalePlus()
With ActiveSheet
    For Each ZmImg In .Shapes                                       'выполняется  проверка названий всех картинок на листе
      If ZmImg.Name Like "Zoom*" Then                               'Отбирается картинка, у которой в названии есть Zoom
        strImgName = Mid(ZmImg.Name, 5)                             'Вырезается имя исходной картинки
        varData = CDbl(.Shapes(strImgName).AlternativeText) + 0.1   'Определяется значение масштабированияя исходной картинки и увеличивается на 10%
        .Shapes(strImgName).AlternativeText = CStr(varData)         'Новое значение масштабирования присваивается исходной картинке
        ZoomImageV3 CStr(strImgName)                                'Вызывается макрос ZommImageV3
      End If
    Next
End With
End Sub

Private Sub ImgScaleMinus()
With ActiveSheet
    For Each ZmImg In .Shapes                                       'выполняется  проверка названий всех картинок на листе
      If ZmImg.Name Like "Zoom*" Then                               'Отбирается картинка, у которой в названии есть Zoom
        strImgName = Mid(ZmImg.Name, 5)                             'Вырезается имя исходной картинки
        varData = CDbl(.Shapes(strImgName).AlternativeText) - 0.1   'Определяется значение масштабированияя исходной картинки и уменьшается на 10%
        .Shapes(strImgName).AlternativeText = CStr(varData)         'Новое значение масштабирования присваивается исходной картинке
        ZoomImageV3 CStr(strImgName)                                'Вызывается макрос ZommImageV3
      End If
    Next
End With
End Sub


Private Sub EnumImageV2(Optional dblSnd As Double)
' Макрос находит все картинки в активной книге и нумерует их по порядку
' начиная с левого верхнего угла и после присвоения номера сразу назначает картинке макрос ZoomImageV3
' совершенно не важно когда запускать этот макрос: до назначения масштабирования или после
' масштаб,  который указан в замещающем тексте  представляет собой процент от размеров текущей  рабочей области представленной на экране
i = 1
    For Each varShtsItm In ActiveWorkbook.Sheets
        For Each varImgItm In varShtsItm.Shapes
            If varImgItm.Name Like "Image_*" Then                       'Отрабатывает при запуске пользователем макроса по изменению масштаба для всех картинок
                If dblSnd > 0 Then varImgItm.AlternativeText = dblSnd   'Если масштаб был изменён, то значение  записывается в Замещающий  текст  картинки
            Else                                                        'Если картинка ранее не нумеровалась, то меняется её  имя  и ей присваивается номер
                 varImgItm.Name = "Image_" & i                          'Новые Имя и номер картинки
                 varImgItm.OnAction = "ZoomImageV3"                     'Назначение макроса масштабирующего картинку
                 varImgItm.AlternativeText = "0,9"                      'Запись  в  замещающий  текст  масштаба по умолчанию
            End If
        i = i + 1
        Next
    Next
End Sub

Private Sub ZoomImageV3(Optional strImgName As String)
Attribute ZoomImageV3.VB_ProcData.VB_Invoke_Func = " \n14"
    Dim dblWinHeight As Double, dblWinWidth As Double
    Dim dblWinCenterTop As Double, dblWinCenterLeft As Double   'переменные для определения параметров окна
    Dim objPict0 As Shape, objPict As Shape                     'переменные-объекты для работы с картинками
    Dim PictZoom As Double                                      'Переменная определяет размер картинки  по которому она будет отмасштабирована
    With ActiveWindow.VisibleRange                                              'Вычисляем параметры видимой на экране области
        dblWinHeight = WorksheetFunction.Round(.Height, 2)                      'Высота видимой области ячеек
        dblWinWidth = WorksheetFunction.Round(.Width, 2)                        'Ширина видимой области ячеек
        dblWinCenterTop = WorksheetFunction.Round(.Top + dblWinHeight / 2, 2)   'Расстояние сверху до центра видимой области ячеек
        dblWinCenterLeft = WorksheetFunction.Round(.Left + dblWinWidth / 2, 2)  'Расстояние слева до центра видимой области ячеек
    End With
    On Error Resume Next
    Set objPict0 = ActiveSheet.Shapes(Application.Caller)       'Обработка нажатия мышкой на картинке
    If Err Then
        V = strImgName
        Set objPict0 = ActiveSheet.Shapes(V)
    End If
    Err.Clear
    On Error Resume Next
    DelImg                               'Проверка наличия и удаление увеличенных рисунков, отмена назначения кнлавиши ESC (подпрограмма)
    If Err Then Exit Sub                 'Если  удаление картинки было вызвано отмасштабированной картинкой, то происходи выход из макроса
    Err.Clear
    On Error Resume Next
    сZoomWin = CDbl(objPict0.AlternativeText)    'переменная, задающая коэффициент масштабирования картинки относительно границ рабочей области окна, значение берётся из Альтернативного текста картинки
    If Err Then
        сZoomWin = 0.9                       'Если в Альтернативном тексте введено некорректное значение, то присваивается значение по умолчанию
        objPict0.AlternativeText = "0,9"
    End If
    Err.Clear
    Set objPict = objPict0.Duplicate        'Создание копии картинку, которая будет увеличиваться
    objPict.Name = "Zoom" & objPict.Name    'Добавление к новой картинке префикса "Zoom"
    objPict.LockAspectRatio = msoTrue       'Активация свойства рисунка,  при котором размеры изменяются пропорционально
    If dblWinHeight < dblWinWidth Then      'Проверка параметров окна, что больше высотиа или ширина окна
        PictZoom = dblWinHeight * сZoomWin  ' Если высота окна меньше ширины, то за основу берётся меньшая величина (высота)
    Else
        PictZoom = dblWinWidth * сZoomWin   ' Если высота окна больше ширины, то за основу берётся меньшая величина (ширина)
    End If
    With objPict                    'Работаем с картинкой и её свойствами
        If .Height > .Width Then    'Проверка параметров картинки
            .Height = PictZoom      'Если высота картинки больше ширины, то картинка масштабируется по высоте
        Else
            .Width = PictZoom       'Если высота картинки меньше ширины, то картинка масштабируется по ширине
        End If
        .Top = WorksheetFunction.Round(dblWinCenterTop - (.Height / 2), 2)  'Определение положения верхней границы картинки
        .Left = WorksheetFunction.Round(dblWinCenterLeft - (.Width / 2), 2) 'Определение положения левой границы картинки
    End With
  Application.OnKey "{ESC}", "DelImg"          'Назначение клавиши ESC для удаления увеличенных картинок
  Application.OnKey "^%{UP}", "ImgScalePlus" 'Увеличение масштаба отдельной картинки выполняется по нажатию клавиш Ctrl+Alt+Стрелка вверх
  Application.OnKey "^%{DOWN}", "ImgScaleMinus" 'Уменьшение масштаба отдельной картинки выполняется по нажатию клавиш Ctrl+Alt+Стрелка вниз
End Sub

Private Sub DelImg()
With ActiveSheet
    For Each ZmImg In .Shapes                       'выполняется  проверка названий всех картинок на листе
      If ZmImg.Name Like "Zoom*" Then ZmImg.Delete  'удаляются картинки с названием,  содержащим "Zoom"
    Next
End With
Application.OnKey "{ESC}"                           'Присвоение клавише ESC стандартной функции
Application.OnKey "^%{UP}"                           'Сброс  функционала  клавиш
Application.OnKey "^%{DOWN}"                         'Сброс  функционала  клавиш
End Sub
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.