Este código, desenvolvido no MS Excel, pode reduzir o tamanho de um documento do Word, por exemplo de 400kb para 100kb.
Suponhamos que lhe pedissem alguma forma de reduzir o tamanho de um arquivo *.docx, que inclui algumas fotos. Uma pergunta mais específica seria a de se há algum modo de realmente reduzirmos o tamanho de um documento do MS Word que tenha incorporado imagens *.Jpg? Essa exigência existe devido a necessidade de enviarmos um e-mail com este documento em anexo, pesando menos do que 100 KB. Digamos que a empresa onde trabalha não permita nada acima de 100 KB e por isso tenhamos que descobrir uma maneira de reduzir o tamanho do arquivo. Não há nenhum formato de arquivo especificado ou exigido.
Certamente após refletirmos um pouco, algumas soluções possíveis vieram:
A compactação de arquivos *.Jpeg, salvando-o num formato de arquivo diferente e reinserindo-os no texto.Capturar um screenshot do documento do MS Word com zoom-out e salvá-lo como um novo arquivo *.Jpg.
Bem, até o momento a melhor solução era realmente fazer screenshots e depois manipulá-los para reduzir o seu tamanho. O único problema era que esse processo seria manual e muito longo, havendo um monte de arquivos para passar.
Após alguns testes com diferentes formatos de arquivo, verificando os resultados (tamanhos). Deparei-me com o recurso de exportação de documento ativo para *.Pdf, mas com a opção de otimização para definir um tamanho mínimo.
Após experimentar isso em cerca de 10 arquivos diferentes, e obter em cada vez, um arquivo menor do que 100 KB de arquivo. Imaginei que seria muito simples abrir um arquivo *.docx e exportá-lo para um arquivo *.pdf. Mas ainda imaginava como automatizaria esse processo. Não sabia a quantidade exata de arquivos que precisavam ser convertidos - apenas tinha a impressão de haver muitos deles.
Então, tive a ideia para o processo de automação, criar uma planilha do MS Excel com algumas macros que:
- Solicitasse ao usuário para entrar um ou vários arquivos de uma só vez.
- Abrir cada arquivo.
- Processar cada arquivo (exportação).
- Terminar, formatando as células, colocando os resultados em destaque.
Códigos:
Sub Main()
Let Application.ScreenUpdating = FalseSetupSelectFilesToConvertUpdateConvertedColumns.AutoFitLet Application.ScreenUpdating = True
End SubPrivate Sub Setup()Cells.ClearLet Range("A1") = "Path"
Let Range("B1") = "Size (KB)"
Let Range("D1") = "PDF Path"
Let Range("E1") = "PDF Size (KB)"Let Range("E:E").Font.Color = xlNoneLet Range("B:B", "E:E").NumberFormat = "0.0"With Range("A1:E1")Let .Interior.Color = RGB(102, 153, 255)Let .Borders.LineStyle = xlContinuousEnd WithEnd SubPrivate Sub SelectFilesToConvert()Dim i As LongDim r As RangeSet r = Range("A2")With Application.FileDialog(msoFileDialogOpen)Let .AllowMultiSelect = TrueLet .InitialFileName = "initial path"Let .InitialView = msoFileDialogViewList.Filters.Clear.Filters.Add "Word Documents", "*.docx".Show' Create hyperlinks to the files and show their size in KBFor i = 1 To .SelectedItems.Countr.Worksheet.Hyperlinks.Add Anchor:=r, Address:=.SelectedItems(i), TextToDisplay:=.SelectedItems(i)r.Offset(0, 1) = FileLen(r) / 1000' Open each Word fileOpenWordFile CStr(r)Set r = r.Offset(1, 0)Next iEnd WithEnd SubPrivate Sub OpenWordFile(filePath As String)On Error GoTo ErrCleanUpDim wordApp As Word.ApplicationSet wordApp = New Word.ApplicationLet wordApp.DisplayAlerts = wdAlertsNoneLet wordApp.Visible = FalseDim wordDoc As DocumentSet wordDoc = wordApp.Documents.Open(filePath)SaveAsMinimizedPDF wordDocLet wordDoc.Saved = TruewordDoc.ClosewordApp.QuitExit SubErrCleanUp:Let wordDoc.Saved = TruewordDoc.ClosewordApp.QuitEnd SubPrivate Sub SaveAsMinimizedPDF(ByRef doc As Document)doc.ExportAsFixedFormat OutputFileName:= _Split(doc.FullName, ".")(0) & ".pdf", ExportFormat:=wdExportFormatPDF _, OpenAfterExport:=False, OptimizeFor:=wdExportOptimizeForOnScreen, Range _:=wdExportAllDocument, From:=1, to:=1, Item:=wdExportDocumentContent, _IncludeDocProps:=True, KeepIRM:=True, CreateBookmarks:= _wdExportCreateNoBookmarks, DocStructureTags:=False, BitmapMissingFonts:= _False, UseISO19005_1:=FalseEnd SubPrivate Sub UpdateConverted()Dim i As LongDim r As RangeFor i = 2 To Range("A" & Rows.Count).End(xlUp).RowSet r = Range("A" & i)r.Offset(0, 3).Worksheet.Hyperlinks.Add _Anchor:=r.Offset(0, 3), Address:=Split(r, ".")(0) & ".pdf", _TextToDisplay:=Split(r, ".")(0) & ".pdf"r.Offset(0, 4) = FileLen(r.Offset(0, 3)) / 1000' validater.Offset(0, 4).Font.Color = IIf(r.Offset(0, 4) > 100, RGB(255, 0, 0), RGB(0, 255, 0))Next iEnd Sub
Reference: vba4all
André Luiz Bernardes