Excel vba относительный путь к файлу

I have written an Excel VBA macro which imports data from a HTML file (stored locally) before performing calculations on the data.

At the moment the HTML file is referred to with an absolute path:

Workbooks.Open FileName:="C:Documents and SettingsSenior CatererMy DocumentsEndurance CalculationTRICATEndurance Summary.html"

However I want to use a relative path to refer to it as opposed to absolute (this is because I want to distribute the spreadsheet to colleagues who might not use the same folder structure). As the html file and the excel spreadsheet sit in the same folder I would not have thought this would be difficult, however I am just completely unable to do it. I have searched on the web and the suggested solutions have all appeared very complicated.

I am using Excel 2000 and 2002 at work, but as I plan to distribute it I would want it to work with as many versions of Excel as possible.

Any suggestions gratefully received.

ashleedawg's user avatar

ashleedawg

20k8 gold badges73 silver badges104 bronze badges

asked Oct 17, 2008 at 19:42

Gene's user avatar

Just to clarify what yalestar said, this will give you the relative path:

Workbooks.Open FileName:= ThisWorkbook.Path & "TRICATEndurance Summary.html"

answered Oct 18, 2008 at 1:15

dbb's user avatar

dbbdbb

2,81918 silver badges15 bronze badges

2

You could use one of these for the relative path root:

ActiveWorkbook.Path
ThisWorkbook.Path
App.Path

answered Oct 17, 2008 at 19:50

yalestar's user avatar

yalestaryalestar

9,2946 gold badges41 silver badges52 bronze badges

I think the problem is that opening the file without a path will only work if your «current directory» is set correctly.

Try typing «Debug.Print CurDir» in the Immediate Window — that should show the location for your default files as set in Tools…Options.

I’m not sure I’m completely happy with it, perhaps because it’s somewhat of a legacy VB command, but you could do this:

ChDir ThisWorkbook.Path

I think I’d prefer to use ThisWorkbook.Path to construct a path to the HTML file. I’m a big fan of the FileSystemObject in the Scripting Runtime (which always seems to be installed), so I’d be happier to do something like this (after setting a reference to Microsoft Scripting Runtime):

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

answered Oct 17, 2008 at 20:53

Mike Woodhouse's user avatar

Mike WoodhouseMike Woodhouse

51.5k12 gold badges88 silver badges127 bronze badges

3

if current directory of the operating system is the path of the workbook you are using, Workbooks.Open FileName:= "TRICATEndurance Summary.html" would suffice. if you are making calculations with the path, you can refer to current directory as . and then to tell the file is in that dir, and in case you have to change the os’s current directory to your workbook’s path, you can use ChDrive and ChDir to do so.

ChDrive ThisWorkbook.Path
ChDir ThisWorkbook.Path
Workbooks.Open FileName:= ".TRICATEndurance Summary.html"

answered Apr 1, 2019 at 14:16

robotik's user avatar

robotikrobotik

1,7801 gold badge19 silver badges24 bronze badges

5

You can provide more flexibility to your users by provide Browser Button to them

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

with this piece of code you can achieve this, easily. Tested code

answered Jan 13, 2014 at 19:27

SK.'s user avatar

SK.SK.

4,1224 gold badges29 silver badges48 bronze badges

Here’s my quick and simple function for getting the absolute path from a relative path.

The difference from the accepted answer is that this function can handle relative paths that moves up to parent folders.

Example:

Workbooks.Open FileName:=GetAbsolutePath("....TRICATEndurance Summary.html")

Code:

' Gets an absolute path from a relative path in the active workbook
Public Function GetAbsolutePath(relativePath As String) As String
    
    Dim absPath As String
    Dim pos As Integer
    
    absPath = ActiveWorkbook.Path
    
    ' Make sure paths are in correct format
    relativePath = Replace(relativePath, "/", "")
    absPath = Replace(absPath, "/", "")
    
    Do While Left$(relativePath, 3) = ".."
    
        ' Remove level from relative path
        relativePath = Mid$(relativePath, 4)
        
        ' Remove level from absolute path
        pos = InStrRev(absPath, "")
        absPath = Left$(absPath, pos - 1)
    
    Loop
    
    GetAbsolutePath = PathCombine(absPath, relativePath)
    
End Function

answered Oct 16, 2020 at 8:14

Petter's user avatar

PetterPetter

3213 silver badges9 bronze badges

i think this may help. Below Macro checks if folder exists, if does not then create the folder and save in both xls and pdf formats in such folder. It happens that the folder is shared with the involved people so everybody is updated.

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

Gareth's user avatar

Gareth

5,1095 gold badges40 silver badges72 bronze badges

answered Aug 30, 2015 at 15:37

Lurds's user avatar

It maybe is not the best way to do it. But the only I found to get the Absolute path is to calculate how many times the syntax .. was in the string and then use the function gotoparent as many times that syntax comes in the hyperlink adress. (in my case, my field is a hyperlink address.
Ps: This code requires the reference to microsoft scripting runtime

Function AbsolutePath(strRelativePath As String, strCurrentFileName As String) As String
Dim fso As Object
Dim strCurrentProjectpath As String
Dim strGoToParentFolder As String
Dim strOrigineFolder As String
Dim strPath As String
Dim lngParentFolder As Long


''Pour retrouver le répertoire parent
Set fso = CreateObject("Scripting.FileSystemObject")

'' détermine le répertire du projet actif
strCurrentProjectpath = CurrentProject.Path

'' détermine le nom du répertoire dans lequel le fichier d'origine se trouve
strOrigineFolder = Replace(Replace(Replace(strRelativePath, strCurrentFileName, ""), "..", ""), "", "")

''Extraction du chemin relatif (ex. ......)
strGoToParentFolder = Replace(Replace(strRelativePath, strOrigineFolder, ""), strCurrentFileName, "")

''retourne le nombre de fois qu'il faut remonter au répertoire parent
lngParentsFolder = Len(Replace(strGoToParentFolder, "", "")) / 2

''détermine la valeur d'origine du répertoire du début
strPath = strCurrentProjectpath

Vérifie s 'il faut aller au répertoire parent
If lngParentsFolder < 1 Then
    'si non, alors répertoire parent et répertoire d'origine du fichier
    strPath = strCurrentProjectpath & "" & strOrigineFolder
Else
    ''si oui, nous faisons la boucle pour retourner au répertoire d'origine
    For i = 1 To lngParentsFolder
        strPath = fso.GetParentFolderName(strPath)
    Next i
End If

''retournons le répertoire parent du fichier et son répertoire d'origine [le OUTPUT]
AbsolutePath = strPath & strOrigineFolder & ""

End Function

answered Oct 9, 2020 at 20:25

Paul's user avatar

1

 

Уважаемые матера екселя,подскажите пожалуйста, можно ли в коде макроса который  должен сохранять файл в определенную папку к примеру она называется  «Клиент» сформулировать  (указать) относительный путь сохранения файла в эту папку.    
Она же в свою очередь находится в папке «Заказ»  

  Папки  заказ -> клиент являются постоянными, а вот папка заказ может находиться в свою очередь  
в директориях под разными именами.  

  Например  структура папок до папки заказ :  

  Имя диска (может быть разное в зависимости от компьютера пользователя) — > Папка 1 (может быть под другим именем) -> Папка2 (так же может иметь другое имя) -> Папка «Заказ» (постоянное имя) -> Папка «Клиент» (Постоянное имя)  

  У меня в макросе прописан абсолютный путь сохранения файла начиная с D:Папка1Папка2ЗаказКлиент  

  Возможен ли вариант сохранения книги по пути относительно папки Заказ игнорируя путь D:Папка1Папка2… ?  

  Или такое в екселе невозможно?

 

webley

Пользователь

Сообщений: 1991
Регистрация: 01.01.1970

не совсем понятна формулировка — а на что опираться при определении «переменной» части пути?

 

{quote}{login=webley}{date=13.10.2010 02:01}{thema=}{post}не совсем понятна формулировка — а на что опираться при определении «переменной» части пути?{/post}{/quote}  

  Перечитала сообщение свое, даж не знаю как и сформулировать более понятно…  
если бы я знала на , что опираться переменной то сформулировала бы :(

 

{quote}{login=The_Prist}{date=13.10.2010 02:08}{thema=}{post}Если VBA не будет знать начального пути, то и конечного Вы не получите. Это все равно что поехать на экскурсию в горы Абхазии, не зная откуда начать экскурсию и куда должен прехать автобус. Угадайте, куда предете? И когда….  

  Одним словом: надо все равно от чего-то отталкиваться. Может Ваш макрос запускается из книги, которая расположена в какой-то папке, которую можно приплести к нужному пути?{/post}{/quote}  

  Макрос находится в персонале. Постоянными являются только папки Заказ и в ней под папка Клиент, а вот папки в которых находятся папка Заказ могут быть под разными именами Москва, Питер к примеру и тп…

 

Вообщем принцип относительных путей как Html в VBA не предусмотрен :) это и понятно. Эх, а жаль…оч удобно было бы

 

{quote}{login=The_Prist}{date=13.10.2010 02:19}{thema=Re: }{post}{quote}{login=Лариса}{date=13.10.2010 02:16}{thema=}{post}Вообщем принцип относительных путей как Html в VBA не предусмотрен :) это и понятно. Эх, а жаль…оч удобно было бы{/post}{/quote}Не надо путать. Там тоже не относительные. Там если не указан явный путь, то берется путь к папке, в которой сам файл. Так что Вы заблуждаетесь в части полной относительности путей в HTML.  
И здесь так же: если сам файл с макросом будет расположен в какой-то известной папке, то можно проследить весь путь данной директории.{/post}{/quote}  

  То есть если макрос находится в персонале, нет никакой возможности сформулировать путь сохранения файла (он находится в папке Заказ), в папку Клиент игнорируя отрезок пути от Имя Диска до папки Заказ?

 

{quote}{login=The_Prist}{date=13.10.2010 02:25}{thema=Re: Re: Re: }{post}{quote}{login=Лариса}{date=13.10.2010 02:24}{thema=Re: Re: }{post}То есть если макрос находится в персонале, нет никакой возможности сформулировать путь сохранения файла (он находится в папке Заказ), в папку Клиент игнорируя отрезок пути от Имя Диска до папки Заказ?{/post}{/quote}Именно. Если, конечно, PERSONAL не расположен в одной из этих папок…  

  Я не пойму: а почему нельзя организовать диалоговое окно выбора файлов или директории?{/post}{/quote}  

  Дело в том, что папки Заказ и Клиент лежат очень глубоко. Папка Заказ в Папке Имя, Имя в Город, Город в Страна, Страна в папке Тип, Тип в Папке Раздел, Раздел в Тема, Тема в Профиль. Некоторые особо мыслящие операционисты обязательно файл с заказом загонят не туда куда надо. А диалоговое окно по любому воткнется не далее как в папку Профиль… Или я что-то не так мыслю?

 

Хорошо… А если макрос находится в сохраняемом файле, подскажите как представить путь сохранения?

 

{quote}{login=The_Prist}{date=13.10.2010 02:47}{thema=}{post}Путь к директории файла с макросами:  
msgbox ThisWorkbook.Path{/post}{/quote}  

  Извините пожалуйста за тупость, не поняла я что-то… а куда это?  
У меня например абсолютный путь был таков  
ActiveWorkbook.SaveAs «D:СтранаГородЗаказКлиент» & Range(«C2») & Range(«D2») & «.xls»  
А как Ваш фрагмент применить если файл с макросом находится в папке Заказ и должен быть сохранен в подпапку Клиент?

 

Лариса

Гость

#10

13.10.2010 16:08:27

{quote}{login=The_Prist}{date=13.10.2010 03:55}{thema=}{post}Да уж….  

  ActiveWorkbook.SaveAs ThisWorkbook.Path & «Клиент» & Range(«C2») & Range(«D2») & «.xls»{/post}{/quote}  

  Спасибо Вам)

I have created a sheet in vba Excel. I would like to save it the current directory, but not in absolute path, then, when this is executed somewhere else, there won’t be problem.

Can somebody help ?

0m3r's user avatar

0m3r

12.2k15 gold badges33 silver badges70 bronze badges

asked Dec 21, 2010 at 9:02

Ndiol Dia's user avatar

I am not clear exactly what your situation requires but the following may get you started. The key here is using ThisWorkbook.Path to get a relative file path:

Sub SaveToRelativePath()
    Dim relativePath As String
    relativePath = ThisWorkbook.Path & Application.PathSeparator & ActiveWorkbook.Name
    ActiveWorkbook.SaveAs Filename:=relativePath
End Sub

Andrew Richesson's user avatar

answered Dec 21, 2010 at 11:53

Alex P's user avatar

Alex PAlex P

12.2k5 gold badges51 silver badges69 bronze badges

1

VBA has a CurDir keyword that will return the «current directory» as stored in Excel. I’m not sure all the things that affect the current directory, but definitely opening or saving a workbook will change it.

MyWorkbook.SaveAs CurDir & Application.PathSeparator & "MySavedWorkbook.xls"

This assumes that the sheet you want to save has never been saved and you want to define the file name in code.

answered Dec 21, 2010 at 15:24

Dick Kusleika's user avatar

Dick KusleikaDick Kusleika

32.5k4 gold badges51 silver badges73 bronze badges

2

If the Path is omitted the file will be saved automaticaly in the current directory.
Try something like this:

ActiveWorkbook.SaveAs "Filename.xslx"

0m3r's user avatar

0m3r

12.2k15 gold badges33 silver badges70 bronze badges

answered Jun 10, 2015 at 14:26

Jonas Arnout's user avatar

0

Taking this one step further, to save a file to a relative directory, you can use the replace function. Say you have your workbook saved in: c:propertycaliforniasacramentoworkbook.xlsx, use this to move the property to berkley:

workBookPath = Replace(ActiveWorkBook.path, "sacramento", "berkley")
myWorkbook.SaveAs(workBookPath & "" & "newFileName.xlsx"

Only works if your file structure contains one instance of the text used to replace. YMMV.

answered Jul 18, 2014 at 15:36

Tim Schimandle's user avatar

0

Модератор:Naeel Maqsudov

Avsha

Сообщения:664
Зарегистрирован:08 сен 2005, 13:47
Откуда:KZ

Есть структура папок:
———————————-
C:ROOTFOLDER1LINE1
C:ROOTFOLDER1LINE2
——-
C:ROOTFOLDER2LINE1
C:ROOTFOLDER2LINE2
C:ROOTFOLDER2LINE3
——-
C:ROOTFOLDER3LINE1
———————————-

Я нахожусь в папке…
LocalPath = «C:ROOTFOLDER1»

Теперь мне задан путь относительно LocalPath переменной OtnositPath
OtnositPath = «..FOLDER2LINE2»

Есть ли какие соображения как формировать конечный путь назначения
TargetPath из (LocalPath и OtnositPath)?

Vikar

Сообщения:51
Зарегистрирован:24 апр 2007, 14:21

19 июн 2007, 15:00

Если начальное значение пути всегда одно и то же, то можно сделать так:

Код: Выделить всё

root_path = "C:ROOT"
OtnositPath = "..FOLDER2LINE2"
my_path = root_path + Mid(OtnositPath, 4)

Avsha

Сообщения:664
Зарегистрирован:08 сен 2005, 13:47
Откуда:KZ

19 июн 2007, 15:30

Если начальное значение пути всегда одно и то же

Да нет :(
Начальное значение LocalPath разное в каждом проекте.
Да и выходов наверх .. может быть несколько.

Думаю проходить по строке OtnositPath слева, искать в ней ..,
затем откусывать справа от LocalPath необходимое количество папок (для этого неодходимо искать косую- .
Но все это как-то грустно…

Думал как проще????

Аватара пользователя

Игорь Акопян

Сообщения:1419
Зарегистрирован:13 окт 2004, 17:11
Откуда:СПБ
Контактная информация:

20 июн 2007, 14:35

Avsha, ваш «относительный» путь не сильно относительный, ибо начинается со слэша, а это означает «корневой каталог» и следовательно запись «..folder» смысла не имеет!
Если же относительный путь будет без лидирующего слэша, то подумалось, что можно выполнить дос-команду на смену каталога а потом взять текущий путь, не?

Изображение

Avsha

Сообщения:664
Зарегистрирован:08 сен 2005, 13:47
Откуда:KZ

20 июн 2007, 15:33

Игорь Акопян,

1.
как задавать относительный путь — «содрал» из Excel :)
при задании гиперссылки на файл, там как раз ставится .. — чтобы подняться на один уровень вверх относительно пути, где находится файл xls, в котором создается гиперссылка.
2.
выполнять дос-команду на смену каталога ??? это как в VBA?

Вот получилось такая довольно неплохая конструкция кода…
Думаю, Excel по похожему алгоритму считает :)

Код: Выделить всё

Public Sub PathCalculation()

LocalPath = "C:ROOTFOLDER1LINE1"
OtnositPath = "......FOLDER3LINE2"

Dim sOne As Integer
Dim sTwo As Integer
Dim tempOne As String
Dim tempTwo As String

'Этап 1 - подсчет папок наверх
tempOne = OtnositPath
While InStr(1, tempOne, "..") <> 0
        sOne = sOne + 1
        tempOne = Right(tempOne, Len(tempOne) - 3)
Wend

'Этап 2 - вычет папок наверх
tempTwo = LocalPath
If sOne <> 0 Then
    For i = Len(LocalPath) To 1 Step -1
        If Mid(tempTwo, i, 1) = "" Then
            sTwo = sTwo + 1
            If sOne = sTwo Then tempTwo = Left(LocalPath, i - 1): Exit For
        End If
    Next i
End If

TargetPath = tempTwo + tempOne

'--------------
'C:ROOTFOLDER1LINE1
'C:ROOTFOLDER1LINE2
'--------------
'C:ROOTFOLDER2LINE1
'C:ROOTFOLDER2LINE2
'C:ROOTFOLDER2LINE3
'--------------
'C:ROOTFOLDER3LINE1
'--------------

End Sub

Avsha

Сообщения:664
Зарегистрирован:08 сен 2005, 13:47
Откуда:KZ

21 июн 2007, 10:46

Игорь Акопян,

Вы были правы насчет лидирующего слэша, :)
и идея насчет дос-команды также работает…

Код: Выделить всё

Public Sub OtnositPath_calc()

On Error GoTo err1
Dim MyPath As String

LocalPath = "C:ROOTFOLDER1LINE1"
OtnositPath = "....FOLDER2LINE2"

    ChDir LocalPath
MyPath = CurDir
    ChDir OtnositPath
MyPath = CurDir


MsgBox ("Локальный путь:  " + LocalPath + Chr(13) + _
        "Относитительный путь:  " + OtnositPath + Chr(13) + _
        "Целевой путь: " + MyPath)

Exit Sub
err1:
MsgBox ("Указанного относительного пути не существует!")

End Sub

Я написал макрос Excel VBA, который импортирует данные из файла HTML (хранящегося локально) перед выполнением вычислений с данными.

На данный момент HTML-файл указывается по абсолютному пути:

Workbooks.Open FileName:="C:Documents and SettingsSenior CatererMy DocumentsEndurance CalculationTRICATEndurance Summary.html"

Однако я хочу использовать относительный путь для ссылки на него, а не абсолютный (это потому, что я хочу распространить электронную таблицу среди коллег, которые могут не использовать ту же структуру папок). Поскольку файл html и электронная таблица Excel находятся в одной папке, я бы не подумал, что это будет сложно, однако я совершенно не могу этого сделать. Я поискал в Интернете, и все предлагаемые решения оказались очень сложными.

Я использую Excel 2000 и 2002 на работе, но, поскольку я планирую распространять его, я хотел бы, чтобы он работал с как можно большим количеством версий Excel.

Любые предложения с благодарностью получены.

8 ответов

Лучший ответ

Просто чтобы прояснить, что сказал yalestar, это даст вам относительный путь:

Workbooks.Open FileName:= ThisWorkbook.Path & "TRICATEndurance Summary.html"


73

dbb
18 Окт 2008 в 05:15

Вы можете использовать один из них для относительного корня пути:

ActiveWorkbook.Path
ThisWorkbook.Path
App.Path


20

yalestar
17 Окт 2008 в 23:50

Я думаю, проблема в том, что открытие файла без указания пути будет работать только в том случае, если ваш «текущий каталог» установлен правильно.

Попробуйте ввести «Debug.Print CurDir» в окне «Немедленное» — в нем должно быть показано расположение файлов по умолчанию, заданное в меню «Инструменты … Параметры».

Я не уверен, что мне это полностью нравится, возможно, потому что это что-то вроде устаревшей команды VB, но вы можете сделать это:

ChDir ThisWorkbook.Path

Думаю, я бы предпочел использовать ThisWorkbook.Path для создания пути к файлу HTML. Я большой поклонник FileSystemObject в среде выполнения сценариев (который, кажется, всегда установлен), поэтому я был бы счастлив сделать что-то вроде этого (после установки ссылки на среду выполнения сценариев Microsoft):

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


2

Mike Woodhouse
18 Окт 2008 в 00:53

Если текущий каталог операционной системы — это путь к книге, которую вы используете, Workbooks.Open FileName:= "TRICATEndurance Summary.html" будет достаточно. если вы производите вычисления с помощью пути, вы можете обратиться к текущему каталогу как ., а затем , чтобы указать, что файл находится в этом каталоге, и в случае, если вам нужно изменить текущий каталог ОС на свой путь к книге, вы можете использовать ChDrive и ChDir для этого.

ChDrive ThisWorkbook.Path
ChDir ThisWorkbook.Path
Workbooks.Open FileName:= ".TRICATEndurance Summary.html"


2

robotik
2 Апр 2019 в 15:11

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

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

С помощью этого фрагмента кода вы можете легко этого добиться. Протестированный код


1

Simpal Kumar
13 Янв 2014 в 23:27

Вот моя быстрая и простая функция для получения абсолютного пути из относительного пути.

Отличие от принятого ответа в том, что эта функция может обрабатывать относительные пути, которые перемещаются вверх к родительским папкам.

Примере:

Workbooks.Open FileName:=GetAbsolutePath("....TRICATEndurance Summary.html")

Код:

' Gets an absolute path from a relative path in the active workbook
Public Function GetAbsolutePath(relativePath As String) As String
    
    Dim absPath As String
    Dim pos As Integer
    
    absPath = ActiveWorkbook.Path
    
    ' Make sure paths are in correct format
    relativePath = Replace(relativePath, "/", "")
    absPath = Replace(absPath, "/", "")
    
    Do While Left$(relativePath, 3) = ".."
    
        ' Remove level from relative path
        relativePath = Mid$(relativePath, 4)
        
        ' Remove level from absolute path
        pos = InStrRev(absPath, "")
        absPath = Left$(absPath, pos - 1)
    
    Loop
    
    GetAbsolutePath = PathCombine(absPath, relativePath)
    
End Function


0

Petter
16 Окт 2020 в 11:14

Я думаю, это может помочь. Ниже макрос проверяет, существует ли папка, если нет, то создает папку и сохраняет в ней форматы xls и pdf. Бывает, что папка используется совместно с вовлеченными людьми, поэтому все обновляются.

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


-2

Gareth
14 Окт 2015 в 14:48

Возможно, это не лучший способ сделать это. Но единственное, что я нашел, чтобы получить абсолютный путь, — это вычислить, сколько раз синтаксис .. был в строке, а затем использовать функцию gotoparent столько раз, сколько синтаксис появляется в адресе гиперссылки. (в моем случае мое поле является адресом гиперссылки. Ps: для этого кода требуется ссылка на среду выполнения сценариев Microsoft

Function AbsolutePath(strRelativePath As String, strCurrentFileName As String) As String
Dim fso As Object
Dim strCurrentProjectpath As String
Dim strGoToParentFolder As String
Dim strOrigineFolder As String
Dim strPath As String
Dim lngParentFolder As Long


''Pour retrouver le répertoire parent
Set fso = CreateObject("Scripting.FileSystemObject")

'' détermine le répertire du projet actif
strCurrentProjectpath = CurrentProject.Path

'' détermine le nom du répertoire dans lequel le fichier d'origine se trouve
strOrigineFolder = Replace(Replace(Replace(strRelativePath, strCurrentFileName, ""), "..", ""), "", "")

''Extraction du chemin relatif (ex. ......)
strGoToParentFolder = Replace(Replace(strRelativePath, strOrigineFolder, ""), strCurrentFileName, "")

''retourne le nombre de fois qu'il faut remonter au répertoire parent
lngParentsFolder = Len(Replace(strGoToParentFolder, "", "")) / 2

''détermine la valeur d'origine du répertoire du début
strPath = strCurrentProjectpath

Vérifie s 'il faut aller au répertoire parent
If lngParentsFolder < 1 Then
    'si non, alors répertoire parent et répertoire d'origine du fichier
    strPath = strCurrentProjectpath & "" & strOrigineFolder
Else
    ''si oui, nous faisons la boucle pour retourner au répertoire d'origine
    For i = 1 To lngParentsFolder
        strPath = fso.GetParentFolderName(strPath)
    Next i
End If

''retournons le répertoire parent du fichier et son répertoire d'origine [le OUTPUT]
AbsolutePath = strPath & strOrigineFolder & ""

End Function


-2

Paul
9 Окт 2020 в 23:25

Понравилась статья? Поделить с друзьями:
  • Excel vba открыть файл если он не открыт
  • Excel vba открыть файл в скрытом режиме
  • Excel vba открыть только форму
  • Excel vba открыть ссылку в браузере
  • Excel vba открыть каталог