Parente em vez de caminhos absolutos no Excel VBA
-
03-07-2019 - |
Pergunta
Escrevi uma macro do Excel VBA que importa dados de um arquivo HTML (armazenado localmente) antes de executar cálculos nos dados.
No momento, o arquivo HTML é referido com um caminho absoluto:
Workbooks.Open FileName:="C:\Documents and Settings\Senior Caterer\My Documents\Endurance Calculation\TRICATEndurance Summary.html"
No entanto, quero usar um caminho relativo para me referir a ele em oposição ao absoluto (isso ocorre porque eu quero distribuir a planilha a colegas que podem não usar a mesma estrutura de pastas). Como o arquivo HTML e a planilha do Excel sentam -se na mesma pasta, eu não pensaria que isso seria difícil, no entanto, sou completamente incapaz de fazê -lo. Eu pesquisei na web e as soluções sugeridas pareceram muito complicadas.
Estou usando o Excel 2000 e 2002 no trabalho, mas, como pretendo distribuí -lo, gostaria que trabalhasse com o maior número possível de versões do Excel.
Quaisquer sugestões recebidas com gratidão.
Solução
Só para esclarecer o que Yalestar disse, isso lhe dará o caminho relativo:
Workbooks.Open FileName:= ThisWorkbook.Path & "\TRICATEndurance Summary.html"
Outras dicas
Você pode usar um desses para a raiz do caminho relativo:
ActiveWorkbook.Path
ThisWorkbook.Path
App.Path
Eu acho que o problema é que abrir o arquivo sem um caminho funcionará apenas se o seu "diretório atual" estiver definido corretamente.
Tente digitar "Debug.print Curdir" na janela imediata - que deve mostrar o local para seus arquivos padrão, conforme definido em ferramentas ... opções.
Não tenho certeza se estou completamente feliz com isso, talvez porque seja um comando VB herdado, mas você pode fazer isso:
ChDir ThisWorkbook.Path
Eu acho que prefiro usar o thisworkbook.path para construir um caminho para o arquivo HTML. Sou um grande fã do FileSystemObject no tempo de execução do script (que sempre parece estar instalado), então ficaria mais feliz em fazer algo assim (depois de definir uma referência ao tempo de execução do Microsoft Script):
Const HTML_FILE_NAME As String = "my_input.html"
With New FileSystemObject
With .OpenTextFile(.BuildPath(ThisWorkbook.Path, HTML_FILE_NAME), ForReading)
' Now we have a TextStream object that we can use to read the file
End With
End With
Você pode fornecer mais flexibilidade aos seus usuários, forneça Botão do navegador para eles
Private Sub btn_browser_file_Click()
Dim xRow As Long
Dim sh1 As Worksheet
Dim xl_app As Excel.Application
Dim xl_wk As Excel.Workbook
Dim WS As Workbook
Dim xDirect$, xFname$, InitialFoldr$
InitialFoldr$ = "C:\"
With Application.FileDialog(msoFileDialogFolderPicker)
.InitialFileName = Application.DefaultFilePath & "\"
.Title = "Please select a folder to list Files from"
.InitialFileName = InitialFoldr$
.Show
Range("H13").Activate
If .SelectedItems.Count <> 0 Then
xDirect$ = .SelectedItems(1) & "\"
Range("h12").Value = xDirect$
xFname$ = Dir(xDirect$, 7)
Do While xFname$ <> ""
If (Format(FileDateTime(xDirect$ & "\" & xFname$), "MM/DD/YYYY") > Format(Range("H10").Value, "MM/DD/YYYY")) Then
ActiveCell.Offset(xRow) = xFname$
xRow = xRow + 1
xFname$ = Dir
Else
xFname$ = Dir
xRow = xRow
End If
Loop
End If
End With
Com este código, você pode conseguir isso, facilmente. Código testado
Se o diretório atual do sistema operacional for o caminho da pasta de trabalho que você está usando, Workbooks.Open FileName:= "TRICATEndurance Summary.html"
seria suficiente. Se você estiver fazendo cálculos com o caminho, pode consultar o diretório atual como .
e depois \
Para dizer que o arquivo está nesse dir e, caso você precise alterar o diretório atual do sistema operacional para o caminho da sua pasta de trabalho, você pode usar ChDrive
e ChDir
fazer isso.
ChDrive ThisWorkbook.Path
ChDir ThisWorkbook.Path
Workbooks.Open FileName:= ".\TRICATEndurance Summary.html"
Eu acho que isso pode ajudar. Abaixo, a macro verifica se a pasta existe, se não, crie a pasta e salve nos formatos XLS e PDF nessa pasta. Acontece que a pasta é compartilhada com as pessoas envolvidas, para que todos sejam atualizados.
Sub PDF_laudo_e_Prod_SP_Sem_Ajuste_Preco()
'
' PDF_laudo_e_Prod_SP_Sem_Ajuste_Preco Macro
'
'
Dim MyFolder As String
Dim LaudoName As String
Dim NF1Name As String
Dim OrigFolder As String
MyFolder = ThisWorkbook.path & "\" & Sheets("Laudo").Range("C9")
LaudoName = Sheets("Laudo").Range("K27")
NF1Name = Sheets("PROD SP sem ajuste").Range("Q3")
OrigFolder = ThisWorkbook.path
Sheets("Laudo").Select
Columns("D:P").Select
Selection.EntireColumn.Hidden = True
If Dir(MyFolder, vbDirectory) <> "" Then
Sheets("Laudo").ExportAsFixedFormat Type:=xlTypePDF, filename:=MyFolder & "\" & LaudoName & ".pdf", Quality:=xlQualityMinimum, _
IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:= _
False
Sheets("PROD SP sem ajuste").ExportAsFixedFormat Type:=xlTypePDF, filename:=MyFolder & "\" & NF1Name & ".pdf", Quality:=xlQualityMinimum, _
IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:= _
False
ThisWorkbook.SaveAs filename:=MyFolder & "\" & LaudoName
Application.DisplayAlerts = False
ThisWorkbook.SaveAs filename:=OrigFolder & "\" & "Entregas e Instrucao Barter 2015 - beta"
Application.DisplayAlerts = True
Else
MkDir MyFolder
Sheets("Laudo").ExportAsFixedFormat Type:=xlTypePDF, filename:=MyFolder & "\" & LaudoName & ".pdf", Quality:=xlQualityMinimum, _
IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:= _
False
Sheets("PROD SP sem ajuste").ExportAsFixedFormat Type:=xlTypePDF, filename:=MyFolder & "\" & NF1Name & ".pdf", Quality:=xlQualityMinimum, _
IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:= _
False
ThisWorkbook.SaveAs filename:=MyFolder & "\" & LaudoName
Application.DisplayAlerts = False
ThisWorkbook.SaveAs filename:=OrigFolder & "\" & "Entregas e Instrucao Barter 2015 - beta"
Application.DisplayAlerts = True
End If
Sheets("Laudo").Select
Columns("C:Q").Select
Selection.EntireColumn.Hidden = False
Range("A1").Select
End Sub