Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.71/492: Рейтинг темы: голосов - 492, средняя оценка - 4.71
0 / 0 / 0
Регистрация: 23.10.2012
Сообщений: 13

Как получить путь к файлу и имя этого файла в переменные

23.10.2012, 11:58. Показов 101400. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день,

Задача проста, есть решение, но оно не изящное, хотелось бы оптимизировать код. Все делается в VBA Excel 2010.
Необходимо выбирая случайный фаил получать полный путь к этому файлу, а так же его имя в отдельные переменные. У меня это получилось сделать только в 2 этапа, т.е 2 раза выводя диалоговое окно. Хотелось бы это делать за 1 диалог.

1. Получаем Имя файла

Visual Basic
1
2
3
4
Set fs = CreateObject("Scripting.FileSystemObject")
fName = Application.GetOpenFilename
s = fs.GetFileName(fName)
MsgBox s, vbInformation + vbOKOnly
2. Получаем Путь к файлу (код не мой, помог Гугл)

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Function GetFolderPath(Optional ByVal Title As String = "Select Folder", _
                       Optional ByVal InitialPath As String = "c:\") As String
   Dim PS As String: PS = Application.PathSeparator
    With Application.FileDialog(msoFileDialogFolderPicker)
        If Not Right$(InitialPath, 1) = PS Then InitialPath = InitialPath & PS
        .ButtonName = "Select": .Title = Title: .InitialFileName = InitialPath
        If .Show <> -1 Then Exit Function
        GetFolderPath = .SelectedItems(1)
        If Not Right$(GetFolderPath, 1) = PS Then GetFolderPath = GetFolderPath & PS
    End With
End Function
 
Path = GetFolderPath
MsgBox Path, vbInformation + vbOKOnly
Заранее спасибо
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.10.2012, 11:58
Ответы с готовыми решениями:

Дано полное имя файла, т.е путь к файлу, имя и расширение. Выделить с этого рядка имя файла без расширения/
C++

Дано полное имя файла, т.е путь к файлу, имя и расширение. Выделить с этого рядка имя файла без расширения
На с++

Дано полное имя файла, т.е путь к файлу, имя и расширение. Выделить из строки только имя первого католога
Помогите пожалуйста!!! Залание: Дано полное имя файла, т.е путь к файлу, имя и расширение. Выделить из строки только имя первого...

22
15155 / 6428 / 1731
Регистрация: 24.09.2011
Сообщений: 9,999
23.10.2012, 12:17
fName в первом коде - полный путь к файлу. Вы хотите разделить его на путь к папке и имя?
Это можно сделать так:
Visual Basic
1
2
3
4
5
FullPath = Application.GetOpenFilename
i = InStrRev(FullPath, "\") 'позиция последнего \
Name = Mid(FullPath, i + 1)
Folder = Left(FullPath, i - 1)
MsgBox FullPath & vbLf & Name & vbLf & Folder
2
0 / 0 / 0
Регистрация: 23.10.2012
Сообщений: 13
23.10.2012, 15:18  [ТС]
Благодарю, вопрос исчерпан.
0
6997 / 2895 / 555
Регистрация: 19.10.2012
Сообщений: 8,803
23.10.2012, 17:30
Так попробуйте в первом коде:
Visual Basic
1
MsgBox fName & vbNewLine & s, vbInformation + vbOKOnly
Получите "полный путь к этому файлу, а так же его имя в отдельные переменные".
0
0 / 0 / 0
Регистрация: 23.10.2012
Сообщений: 13
23.10.2012, 19:14  [ТС]
To Hugo121

Наверное я не достаточно четко сформулировал задачу, в любом случае, Казанский помог с решением проблемы. Я получил что хотел.
Под полным путем подразумевалось путь до файла без его имени, т.е "C:\temp\" в одну переменную и имя файла "asd.txt" в другую переменную.

В следующий раз буду четко формулировать. Спасибо.
0
6997 / 2895 / 555
Регистрация: 19.10.2012
Сообщений: 8,803
23.10.2012, 20:55
Ну когда есть полный путь и имя - легко от полного пути отрезать на длину имени...
Visual Basic
1
2
3
4
5
6
7
Sub tt()
    Set fs = CreateObject("Scripting.FileSystemObject")
    fname = Application.GetOpenFilename
    s = fs.GetFileName(fname)
    ss = Left(fname, Len(fname) - Len(s))
    MsgBox fname & vbLf & ss & vbLf & s, vbInformation, vbOKOnly
End Sub
0
foo();
 Аватар для rattrapper
886 / 587 / 222
Регистрация: 03.07.2013
Сообщений: 1,549
Записей в блоге: 2
09.07.2013, 16:29
нужна помощь, у меня код не работает(exel'13)
нашел отличный faq по добавлению модулей,
Цитата Сообщение от Dragokas Посмотреть сообщение
Импорт модуля проекта из файла
Visual Basic
1
ИмяПроекта.VBProject.VBComponents.Import *"Путь и ИмяФайла"
у меня нужные модули находятся в том же месте, что и книга, но я никак не могу получить полный путь к книге программно!
GetOpenFilename - в любом случае вызывает окно выбора файла
еще пробовал HKEY_CURRENT_USER\Desktop - выдает ошибку
мой код:
Visual Basic
1
2
3
4
5
6
Sub AddMacro()
With ThisWorkbook.VBProject.VBComponents
    .Import "путь к книге???" \ Module1.bas
    .Import "путь к книге???" \ mw2.frm
End With
End Sub
Добавлено через 36 минут
Цитата Сообщение от rattrapper Посмотреть сообщение
никак не могу получить полный путь к книге программно
как же все просто)
кому нужно thisworkbook.path
0
 Аватар для ExpressFX
3 / 3 / 0
Регистрация: 24.10.2015
Сообщений: 1
24.01.2016, 18:54
Пути к файлу и имя файла - просто как 2+2 !
Visual Basic
1
2
3
4
5
6
7
Sub ShowPathAndName()
    Dim FullName$, Filename$, FilePath$
    FullName = "C:\Work\test.txt"
    Filename = Dir(FullName) ' Сработает только если файл по указанному пути реально существует
    FilePath = Left(FullName, Len(FullName) - Len(Filename))
    MsgBox "Путь к файлу - " & FilePath & vbCrLf & "Имя файла - " & Filename
End Sub
Выйдет сообщение:
Путь к файлу - C:\Work\
Имя файла - test.txt

Просто и не нужно извращаться!
3
4 / 4 / 0
Регистрация: 29.06.2015
Сообщений: 17
29.01.2016, 13:41
ActiveWindow.Caption возвращает имя открытого окна, т.е. имя файла без расширения.
0
15155 / 6428 / 1731
Регистрация: 24.09.2011
Сообщений: 9,999
29.01.2016, 15:20
Федоров, ...если заголовок окна не поменяли
Visual Basic
1
activewindow.Caption="Федоров"
0
0 / 0 / 0
Регистрация: 07.09.2015
Сообщений: 4
18.03.2016, 14:08
доброго дня всем, подскажите, а как теперь получаемые ответы вывести в ячейку? и чтоб без диалогового окна? просто выбор файла, а результат в ячейке, а не в окне.
спасибо.
0
6997 / 2895 / 555
Регистрация: 19.10.2012
Сообщений: 8,803
18.03.2016, 14:19
Вместо Msgbox пишите
Visual Basic
1
[A1]=
- получите вместо сообщения строку в ячейке.
1
0 / 0 / 0
Регистрация: 07.09.2015
Сообщений: 4
18.03.2016, 15:24
благодарю, то что надо

Добавлено через 1 минуту
есть файл эксель в котором происходят вычисления и есть файлы эксель в которых данные для этих вычислений. по кнопке в первом файле происходит вышеописанный скрипт, в ячейке получаю путь до файла и уже в нужные ячейки подставляются данные из полученного файла. вопрос: если по нажатию кнопки подставить другой файл с данными, то сразу он не обновляет данные, обновить если нажать "данные" - "источник связи" - здесь указать источник - "обновить", тогда выдается запрос на нужный файл и данные обновляются. можно ли автоматизировать это обновление?
0
6997 / 2895 / 555
Регистрация: 19.10.2012
Сообщений: 8,803
18.03.2016, 16:12
Используете ДВССЫЛ()? Она не в всех формулах работает. Если всё равно используете макрос - так сразу и формируйте макросом полностью формулы, или вообще делайте всю работу макросом.
0
0 / 0 / 0
Регистрация: 07.09.2015
Сообщений: 4
21.03.2016, 07:20
ДВССЫЛ не успользую, а в макросах не силен совсем.
вот формула =[AW104]Данные!$B$18, по которой подтягиваются данные из внешних источников, а ячейка AW104 получает полный путь файла источника по вышеприведенному макросу.
0
6997 / 2895 / 555
Регистрация: 19.10.2012
Сообщений: 8,803
21.03.2016, 09:22
Попробуйте после замены файла
Visual Basic
1
 ActiveWorkbook.RefreshAll
или
Visual Basic
1
Calculate
0
0 / 0 / 0
Регистрация: 07.09.2015
Сообщений: 4
21.03.2016, 11:04
нет, не работает ни в теле первого макроса, ни с отдельной кнопки((
может быть подскажите другое решение? мне пришло только озвученное выше: есть файл калькуляции в эксель и есть файлы эксель с данными клиентов. имена файлов с данными клиентов разные и в разных местах. нужно чтобы данные клиентов подтягивались в файл калькуляции с минимальными телодвижениями юзверей.
0
6997 / 2895 / 555
Регистрация: 19.10.2012
Сообщений: 8,803
21.03.2016, 11:30
Попробуйте так - копируете любой файл клиента под именем например шаблон.xls, настраиваете все нужные формулы на импорт из этого файла.
Сохраняете файл, ставите ему "только для чтения".
Удаляете шаблон.xls.
Юзер открывает файл с формулами, в диалоге обновления связей указывает файл нужного клиента. Посмотрел, если нужно сохранить - сохранил с любым другим именем.
Но можно конечно всё делать макросом - юзер жмёт кнопку, указывает файл, смотрит данные. Вообще всё без формул.
0
0 / 0 / 0
Регистрация: 01.02.2016
Сообщений: 29
14.04.2016, 09:59
Здравствуйте, а подскажите пожалуйста как сделать так, чтобы можно было просто выбирать файл через диалоговое окно, не указывая при этом путь к файлу и само название файла. Нужно, чтобы была возможность выбрать любой файл на компьютере .xlsx и далее с ним работать (импортировать из него).
При помощи данного кода открывается диалоговое окно, можно выбрать файл, но он как я понимаю не выбирается (не используется в дальнейшем как нужно мне). Я данный код превратил в комментарии и ничего не поменялось в работе.
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Private Sub SelectStudent_Click()
 
Dim FName As String
Dim result As Integer
With Application.FileDialog(1)
   .Title = "Select file"
   .InitialFileName = "C:\BD" 'default path Путь по умолчанию
   .AllowMultiSelect = False
   .Filters.Clear
   .Filters.Add "MS Excel", "*.xlsx", 1
result = .Show
 
If result = 0 Then Exit Sub
FName = Trim(.SelectedItems.Item(1))
End With
А вот продолжение кода в форме, при помощи которого 100% идет выбор файла (только автоматически, по прописанному пути и файлу, а нужно, чтобы можно было любой файл выбрать, чтобы не был заранее прописан код для файла) и уже выполнялась работа с ним.
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Dim app As Object, wrk As Object
Dim rst As dao.Recordset
 
Set rst = CurrentDb.OpenRecordset("select * from Marks")
Set app = CreateObject("excel.application")
Set wrk = app.workbooks.Open("C:\BD\sample.xlsx")
 
rst.AddNew
 
rst![mrk_id] = Nz(DMax("mrk_id", "Marks"), 0) + 1
rst![Module] = Modul(app.range("A14"))
rst![Hours] = app.range("C15")
 
 
rst.Update
app.Quit
 
End Sub
0
6997 / 2895 / 555
Регистрация: 19.10.2012
Сообщений: 8,803
14.04.2016, 10:04
Т.е. не пробовали то, что я предлагаю?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.04.2016, 10:04
Помогаю со студенческими работами здесь

Узнать путь к файлу или имя файла
Сохраняю файл через saveFileDialog. Как узнать папку(директорию) куда сохраняется файл? Ну или имя файла, но только без пути

Как получить путь к файлу в диалоговом окне открытия файла и передать в текстовое поле в форме
Спасибо всем, кто пишет как открыть из Ассеss диалоговое окно. Работает...Оно открывается, выбираю файл (а файл ничего не делает:). Стоит...

Как проверить запуск программы по двойному клику на файл и получить путь до этого файла?
Здравствуйте! Подскажите советом ) У меня прога работает с файлом... ну к примеру тхт... не так важно с каким... при запуске проги...

Как программно получить путь к файлу конфигураций программы (файлу user.config)?
Задался целью программно очистить параметры программы, которые сохраняются в файле user.config. Так как параметров много, чтобы очистить...

Получить путь к файлу по url файла
Добрый всем вечер. Возникла задача удалить файлы после удаления пользователя (например). Проблема в том, что все файлы данного...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru