Logo Hardware.com.br
jricslima
jricslima General de Pijama Registrado
2.1K Mensagens 469 Curtidas

Código VBA para qualquer diretório.

#1 Por jricslima 23/02/2022 - 17:04
Boa tarde!

Criei uma macro para selecionar uma área da planilha ativa e gerar um arquivo PDF, que no meu PC de casa
funciona perfeitamente, com o código abaixo:

Sub GerarPDF()
'
' GerarPDF Macro
'
' Atalho do teclado: Ctrl+j
'

Range("A1:O176&quot.Select
Selection.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
"C:\Users\Micro\Desktop\ROTINAS DIÁRIAS.pdf", Quality:=xlQualityStandard, _
IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:= _
True
ActiveWindow.ScrollRow = 154
ActiveWindow.ScrollRow = 151
ActiveWindow.ScrollRow = 148
ActiveWindow.ScrollRow = 143
ActiveWindow.ScrollRow = 140
ActiveWindow.ScrollRow = 131
ActiveWindow.ScrollRow = 126
ActiveWindow.ScrollRow = 120
ActiveWindow.ScrollRow = 109
ActiveWindow.ScrollRow = 103
ActiveWindow.ScrollRow = 89
ActiveWindow.ScrollRow = 80
ActiveWindow.ScrollRow = 75
ActiveWindow.ScrollRow = 63
ActiveWindow.ScrollRow = 61
ActiveWindow.ScrollRow = 49
ActiveWindow.ScrollRow = 46
ActiveWindow.ScrollRow = 41
ActiveWindow.ScrollRow = 35
ActiveWindow.ScrollRow = 29
ActiveWindow.ScrollRow = 27
ActiveWindow.ScrollRow = 24
ActiveWindow.ScrollRow = 21
ActiveWindow.ScrollRow = 15
ActiveWindow.ScrollRow = 12
ActiveWindow.ScrollRow = 10
ActiveWindow.ScrollRow = 7
ActiveWindow.ScrollRow = 4
ActiveWindow.ScrollRow = 1
Range("A1&quot.Select

Endt Sub

Porém, ao usar a planilha no meu trabalho, como era de se esperar, deu erro em relação ao diretório do arquivo,
que no meu PC de casa fica em:

"C:\Users\Micro\Desktop\ROTINAS DIÁRIAS.pdf"

E no PC do trabalho fica em:

"C:\Users\jrlima\Desktop\ROTINAS DIÁRIAS.pdf"

Dessa forma, implementei um tratamento de erro, ficando o código assim:


Sub GerarPDF()
'
' GerarPDF Macro
'
' Atalho do teclado: Ctrl+j
'
On Error GoTo errodir

Range("A1:O176&quot.Select
Selection.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
"C:\Users\Micro\Desktop\ROTINAS DIÁRIAS.pdf", Quality:=xlQualityStandard, _
IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:= _
True
ActiveWindow.ScrollRow = 154
ActiveWindow.ScrollRow = 151
ActiveWindow.ScrollRow = 148
ActiveWindow.ScrollRow = 143
ActiveWindow.ScrollRow = 140
ActiveWindow.ScrollRow = 131
ActiveWindow.ScrollRow = 126
ActiveWindow.ScrollRow = 120
ActiveWindow.ScrollRow = 109
ActiveWindow.ScrollRow = 103
ActiveWindow.ScrollRow = 89
ActiveWindow.ScrollRow = 80
ActiveWindow.ScrollRow = 75
ActiveWindow.ScrollRow = 63
ActiveWindow.ScrollRow = 61
ActiveWindow.ScrollRow = 49
ActiveWindow.ScrollRow = 46
ActiveWindow.ScrollRow = 41
ActiveWindow.ScrollRow = 35
ActiveWindow.ScrollRow = 29
ActiveWindow.ScrollRow = 27
ActiveWindow.ScrollRow = 24
ActiveWindow.ScrollRow = 21
ActiveWindow.ScrollRow = 15
ActiveWindow.ScrollRow = 12
ActiveWindow.ScrollRow = 10
ActiveWindow.ScrollRow = 7
ActiveWindow.ScrollRow = 4
ActiveWindow.ScrollRow = 1
Range("A1&quot.Select

Exit Sub

errodir:

Range("A1:O176&quot.Select
Selection.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
"C:\Users\jrlima\Desktop\ROTINAS DIÁRIAS.pdf", Quality:=xlQualityStandard, _
IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:= _
True
ActiveWindow.ScrollRow = 154
ActiveWindow.ScrollRow = 151
ActiveWindow.ScrollRow = 148
ActiveWindow.ScrollRow = 143
ActiveWindow.ScrollRow = 140
ActiveWindow.ScrollRow = 131
ActiveWindow.ScrollRow = 126
ActiveWindow.ScrollRow = 120
ActiveWindow.ScrollRow = 109
ActiveWindow.ScrollRow = 103
ActiveWindow.ScrollRow = 89
ActiveWindow.ScrollRow = 80
ActiveWindow.ScrollRow = 75
ActiveWindow.ScrollRow = 63
ActiveWindow.ScrollRow = 61
ActiveWindow.ScrollRow = 49
ActiveWindow.ScrollRow = 46
ActiveWindow.ScrollRow = 41
ActiveWindow.ScrollRow = 35
ActiveWindow.ScrollRow = 29
ActiveWindow.ScrollRow = 27
ActiveWindow.ScrollRow = 24
ActiveWindow.ScrollRow = 21
ActiveWindow.ScrollRow = 15
ActiveWindow.ScrollRow = 12
ActiveWindow.ScrollRow = 10
ActiveWindow.ScrollRow = 7
ActiveWindow.ScrollRow = 4
ActiveWindow.ScrollRow = 1
Range("A1&quot.Select

End Sub

Funcionando aqui no trabalho perfeitamente, porém o problema que quero resolver é o seguinte:

Caso eu fosse compartilhar essa planilha com vários colegas, eu teria que editar o código de acordo com
o diretório do PC de casa de cada um deles, esquentei os miolos, pesquisei e até o momento, não encontrei
de como fazer a planilha funcionar em qualquer PC, na hora de criar o PDF.

Os mais avançados se souberem, e puder compartilhar, desde já agradeço.
EdsonBR
EdsonBR Veterano Registrado
273 Mensagens 280 Curtidas
#3 Por EdsonBR
23/02/2022 - 22:27
Boa noite, @jricslima

Pelo VBA há várias maneiras de retornar o caminho das pastas especiais padrão de sistema e de usuário, cada uma com suas vantagens e suas desvantagens.
Por exemplo, para retornar a pasta Desktop que vc deseja, vc poderia usar qualquer um dos códigos abaixo:

Sub RetornaPastaDesktop()
Dim Desktop As String

Desktop = Environ("USERPROFILE&quot & "\Desktop"

Desktop = CreateObject("WScript.Shell&quot.SpecialFolders("Desktop&quot

Desktop = CreateObject("Shell.Application&quot.Namespace(16).Self.Path
Desktop = CreateObject("Shell.Application&quot.Namespace(&H0).Self.Path
Desktop = CreateObject("Shell.Application&quot.Namespace("knownfolder:{B4BFCC3A-DB2C-424C-B029-7FE99A87C641}&quot.Self.Path
End Sub


O primeiro tem a vantagem de não usar nenhum objeto externo ao VBA, pois ele lê a variável de ambiente %USERPROFILE% do Windows através do uso de uma função do próprio VBA (Environ). Dá certo eu diria que em uns 90% das situações. Apenas naqueles usuários mais avançados que porventura possam ter mudado o nome original da pasta "Desktop" para outro qualquer ou quem alterou a unidade original de suas pastas para outros locais não seriam atendidos.
As outras duas formas são mais robustas e insensíveis à alteração do nome mas por outro lado usam um objeto externo, se bem não costumam dar problemas já que são bibliotecas permanentes do Windows.
Há outras formas um pouco mais complexas, através de API do Windows ou através da biblioteca WMI, mas usando uma dessas acima acredito que já resolveria seu problema.
© 1999-2024 Hardware.com.br. Todos os direitos reservados.
Imagem do Modal