Сжать все изображения в книге Excel с помощью VBA

#excel #vba

#excel #vba

Вопрос:

Мне нужна помощь, чтобы сжать все изображения в книге Excel через VB (формат электронной почты 96 ppi).

Я пробовал sendkeys, но, похоже, это не работает.

 Sub test()

  Dim wsh As Worksheet

  Set wsh = Worksheets("Sheet1")
  wsh.Activate
  wsh.Shapes(1).Select

  SendKeys "%JP", True
  SendKeys "%M", True
  SendKeys "%e", True
  SendKeys "~", True

End Sub
  

Комментарии:

1. Я действительно застрял на этой проблеме, нужны эксперты VBA.

Ответ №1:

Возможно, вам поможет следующее «решение»

 Sub test()

    Dim wsh As Worksheet

    Set wsh = Worksheets("Sheet1")
    wsh.Activate
    wsh.Shapes(1).Select

    SendKeys "%e", True
    SendKeys "~", True
    Application.CommandBars.ExecuteMso "PicturesCompress"
End Sub
  

Но если вы не выберете ни одного изображения, при вызове вы получите следующее диалоговое окно Application.CommandBars.ExecuteMso "PicturesCompress" . Если вы выберете Web / Screen, вы получите разрешение 96 точек на дюйм.

введите описание изображения здесь

Комментарии:

1. Интересно. Это похоже на пользовательский интерфейс только для Excel, поскольку вызывает ошибку при выполнении команды без изображения, выбранного в PowerPoint. Что разочаровывает.

Ответ №2:

Я нашел это решение, и оно работает для меня. Спасибо, Storax

 Sub test()

Dim wsh As Worksheet

    Set wsh = Worksheets("Sheet1")
    wsh.Activate
    wsh.Shapes(1).Select

    SendKeys "%w", True
    SendKeys "~", True
    Application.CommandBars.ExecuteMso "PicturesCompress"

End Sub
  

Ответ №3:

Если вы отключите 2-ю строку в if блоке, вы получите другое подменю сжатия, изображенное ранее, при активной второй строке вы получите фактическое подменю «Сжимать изображения» в Word, я только вчера разобрал это, месяцами безуспешно пытался автоматизировать только отправку ключей, так что, надеюсь, это более стабильный способ сборки с 150ppi изначально, проблема может заключаться в том, что параметры сжатия должны быть сброшены на false, поскольку предыдущие выборы запоминаются. Также необходимо закодировать активное сохранение документа. Я предпочитаю макросы с одним щелчком мыши в QAT. Должно быть просто использовать этот код в Excel с небольшими изменениями, если это необходимо.

 Finished my version for Word. To change all images in a word file - I have one QAT link for 150ppi and another for 96ppi need them for work. I had to add a delay in the loop to stop flicker of the commandbar, as some people may be sensitive to this . Not an ideal solution. I have the delay set to zero on my computer. I would prefer to reset the Pictures Compress menu and not need to loop through all the images.

Sub CompressI_13_05_2022()

'SOURCE:Can't remember where I found the ExecuteMSO vba code
'SOURCE:jam61mar@gmail.com

'Macro to compress images in Word if docx file size is too big
'If there are images in the file (so will do nothing if pressed in error)
    If word.activedocument.Inlineshapes.Count > 0 Then
        'Select the first image so that the "Picture Format" Ribbon Menu appears
        word.activedocument.Inlineshapes(1).Select
        'Opens the "Compress Pictures" Sub Menu on Picture Format
        'A different version appears if the above Select 1st image is switched off, so that line is critical
        Application.CommandBars.ExecuteMso "PicturesCompress"
    'Send Keys not done yet... to select different compression, for me 150ppi and 96ppi are needed
    'For two single click QAT links 
    End If
End Sub

Sub MacroIC_25_05_2022()

'150ppi
Application.screenupdating = False 'lowercase and does not seem to work as CommandBar flickers and is visible
'Need to cross reference with private laptop - possible problem with Work Laptop Visual Basic References

'No explicit Source for creating this by
'Macro "C" to compress images in Word if docx file size is too big
'Tip for adding [wait] after the sendkeys https://learn.microsoft.com/en-us/office/vba/Language/Reference/user-interface-help/sendkeys-statement
            
'If Macro C is pressed in error with no file in Open Word App
If word.Application.Documents.Count = 0 Then
    Exit Sub
End If
   
Dim oIlS As inlineshape

If word.activedocument.Inlineshapes.Count > 0 Then
        
        'Select the first image so that the "Picture Format" Ribbon Menu appears
        word.activedocument.Inlineshapes(1).Select
                                          
                                '150ppi - this is counter intuitive as it appears before the menu
                                VBA.SendKeys "%W{ENTER}", True
            
                                'Opens the "Compress Pictures" Sub Menu on Picture Format
                                'A different version appears if the above Select 1st image line is switched off, so that line is critical for the actual sub menu
                                Application.Commandbars.ExecuteMso ("PicturesCompress") '20-05-2022 Can add brackets around the speech marks
                                          
                                'https://learn.microsoft.com/en-us/office/vba/language/reference/user-interface-help/timer-function
                                'for a delay to stop the Commandbar sub menu from flickering too much, still prefer to not see it
                                Dim PauseTime, Start, Finish, TotalTime
                                PauseTime = 0.25
                                Start = Timer
                                Do While Timer < Start   PauseTime
                                DoEvents
                                Loop
                                Finish = Timer
                                TotalTime = Finish - Start
                                Else
                                End
                                          
End If
        
'Restarting a loop for the rest of the images in the Active Document
                            
                For i = 2 To word.activedocument.Inlineshapes.Count
                
                    If word.activedocument.Inlineshapes.Count > 1 Then
                        word.activedocument.Inlineshapes(i).Select
                                            
                                VBA.SendKeys "%W{ENTER}", True
                  
                                Application.Commandbars.ExecuteMso ("PicturesCompress")
                                
                                'https://learn.microsoft.com/en-us/office/vba/language/reference/user-interface-help/timer-function
                                'for a delay to stop the Commandbar sub menu from flickering too much, still prefer to not see it
                                'Dim PauseTime, Start, Finish, TotalTime
                                PauseTime = 0.25
                                Start = Timer
                                Do While Timer < Start   PauseTime
                                DoEvents
                                Loop
                                Finish = Timer
                                TotalTime = Finish - Start
                                Else
                                End
                                                                                
                    End If
            
                Next i

Application.screenupdating = True

End Sub