Страницы: 1
RSS
Как открыть файл с помощью FileDialog
 
Добрый всем день!
Назрела необходимость дать юзеру возможность выбрать файл самостоятельно (который дальше обрабатывается макросом) и никак не могу найти простой и понятный пример, как это сделать с помощью FileDialog
Поняла, что это окошко выдаст путь к файлу, а как записать его в переменную и дальше написать Workbooks.Open совсем не пойму

Помогите, пожалуйста, с этими строчками
Или подскажите, где стоит посмотреть? Не трехэтажные навороты со всевозможной всячиной (роюсь уже все утро в щедрых результатах поиска), а решение вот этого простого действия
Спасибо
В полете голова - важнее крыльев
 
Это?

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Нет, не это
Неизвестно ни имя файла, ни путь до него
Юзер должен ткнуть на этот файл мышкой, а макрос открыть его и работать с ним
В полете голова - важнее крыльев
 
Цитата
Li$$@ пишет: Юзер должен ткнуть на этот файл мышкой, а макрос...
Опаньки! Если юзер тыкнул файлу, то программа по умолчанию его откроет. А макрос - зачем при чем?..  ;)  Будьте проще и... понятнее, пжлста.
Изменено: Z - 07.11.2014 13:16:12
"Ctrl+S" - достойное завершение ваших гениальных мыслей!.. ;)
 
например так для открытия одного файла:
Код
Dim MyFileName 
With Application.FileDialog(msoFileDialogOpen)
    .AllowMultiSelect = False
    .Title = "Выберите же наконец файл, что вы только смотрите!"
    .ButtonName = "Жать сюда"
    .InitialFileName = "AnotherFile.xlsx"
    .FilterIndex = 2
' до этого места можно впихивать всякие настройки
    If .Show = 0 Then MsgBox "Не хочешь - ну и не надо!": GoTo exit_handler
    MyFileName = .SelectedItems(1)
End With
Set wbk=Workbooks.Open(MyFileName)

Для нескольких делаем
Код
.AllowMultiSelect = True
и в конце вместо MyFileName = .SelectedItems(1) открываем уже пачками. Например:
Код
For Each MyFileName in .SelectedItems
   Workbook.Open(MyFileName)
Next

А можно просто сделать MyFileName = .SelectedItems
так мы получим Variant/String Collection отобранных пользователем файлов прям с путями и всё такое
Изменено: Максим Зеленский - 07.11.2014 13:18:59 (очепятки)
F1 творит чудеса
 
Пример из стандартной справки по FileDialog:
Код
Sub UseFileDialogOpen()

    Dim lngCount As Long

    ' Open the file dialog
    With Application.FileDialog(msoFileDialogOpen)
        .AllowMultiSelect = True
        .Show

        ' Display paths of each file selected
        For lngCount = 1 To .SelectedItems.Count
            MsgBox .SelectedItems(lngCount)
        Next lngCount
    End With
End Sub

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
ну и можно просто делать
Код
If .Show = -1 Then .Execute
если пути/имена файлов не интересны, в переменную их сохранять не будем, а надо только открыть
F1 творит чудеса
 
Цитата
Z пишет: Если юзер тыкнул файлу, то программа по умолчанию его откроет
Да-да, и я так думала, вот только фигню явно пишу какую-то, потому что не открывает  :(
Файл приложила - где бяка в этой строке?
В полете голова - важнее крыльев
 
Максим Зеленский, спасибо за примеры, буду с ними осваиваться сегодня!
В полете голова - важнее крыльев
 
В этой строке нет бяки - просто вы не даете команду "Открыть" никаким из способов. Посмотрите выше, все примеры уже приведены.
F1 творит чудеса
 
Цитата
Максим Зеленский пишет:
If .Show = -1 Then .Execute
Простите, но никак не могу "догнать", как именно это правильно вставить в код?
Не выходит каменный цветок... Посмотрите, пожалуйста
В полете голова - важнее крыльев
 
И что же конкретно не выходит? ))) скопируйте и вставьте первый код из сообщения #5
F1 творит чудеса
 
Ну, если очень нужно через ..., тогда
Код
Sub Открывашка()
    Set fd = Application.FileDialog(msoFileDialogOpen)
    If fd.Show = -1 Then fd.Execute
    Set fd = Nothing
End Sub
 
Добрый день, вот еще вариант:

Код
answer = Application.GetOpenFilename(Title:=Выберите файл", FileFilter:="PDF Files *.pdf (*.pdf),")
CreateObject("wscript.shell").Run """" & answer & """"
 
как  видно из кода можно также устанавливать нужный фильтр на расширение (в даном случае pdf)
 
Цитата
написал:
Ну, если очень нужно через ..., тогда
Добрый день

можно ли к вышеупомянутому макросу прикрутить, чтобы файл открывался не в отдельном файле, а в соседнем (созданном сей момент) листе уже открытого файла Excel?
 
Цитата
lolashwaya написал:
а в соседнем (созданном сей момент) листе уже открытого файла Excel?
Может Вам нужно создать новый лист, а не открыть книгу? Или перенести лист из одной Книги в другую?
Согласие есть продукт при полном непротивлении сторон
 
Как макросом создать новый лист я знаю. Как макросом открыть excel файл тоже)

Задача у меня: в уже имеющемся файле где на одном листе есть определенного формата таблица1, через диалог открыть на соседнем листе таблицу2 из  другого excel файла, чтобы в таблицу1 попадали путем формул (впр например) данные из таблицы2.

Я смогла так сделать с текстовым файлом через ActiveSheet.QueryTables.Add(Connection:="TEXT;" & x, Destination:=Range("A1"))....
но никак не возьму в толк, как мне не текстовый файл прикрутить, а именно excel. Почему то это для меня оказалось за гранью)
Изменено: lolashwaya - 11.06.2024 12:56:22
 
Цитата
lolashwaya написал:
не возьму в толк, как мне не текстовый файл прикрутить, а именно excel
Если я правильно понял Вашу задачу.
Из первого файла:
Данные - Получить данные - Из файла - Из Книги. Далее открываете нужный файл и выбираете нужную таблицу
Запишите Ваши действия макрорекордером
Согласие есть продукт при полном непротивлении сторон
 
получается слишком много частного, такого как путь к файлу, название файла, каждый столбец прописан т.е. если файл будет видоизменен однажды, макрос уже работать не будет.
Код
ActiveWorkbook.Queries.Add Name:="1", Formula:= _
        "let" & Chr(13) & "" & Chr(10) & "    Источник = Excel.Workbook(File.Contents(""F:\Маркос для юристов\ООО ТПГУ.xlsx""), null, true)," & Chr(13) & "" & Chr(10) & "    #""1_Sheet"" = Источник{[Item=""1"",Kind=""Sheet""]}[Data]," & Chr(13) & "" & Chr(10) & "    #""Повышенные заголовки"" = Table.PromoteHeaders(#""1_Sheet"", [PromoteAllScalars=true])," & Chr(13) & "" & Chr(10) & "    #""Измененный тип"" = Table.TransformColumnTypes(#""Повышенные заголовки"",{{""БАЗА"", ty" & _
        "pe text}, {""получатель"", type text}, {""Адрес"", type text}, {""квартира"", type number}, {""Лицевой счет"", Int64.Type}, {""ФИО"", type text}, {""Услуга"", type text}, {""Входящее сальдо"", Int64.Type}, {""Постоянные начисления"", type number}, {""льгота"", Int64.Type}, {""субсидии"", Int64.Type}, {""Разовые"", Int64.Type}, {""сумма оплаты"", Int64.Type}, {""Исхо" & _
        "дящее сальдо"", type number}, {""ПР_ЗАДОЛ"", type any}, {""ДАТА_ОПЛАТ"", type text}})" & Chr(13) & "" & Chr(10) & "in" & Chr(13) & "" & Chr(10) & "    #""Измененный тип"""
    ActiveWorkbook.Worksheets.Add
    With ActiveSheet.ListObjects.Add(SourceType:=0, Source:= _
        "OLEDB;Provider=Microsoft.Mashup.OleDb.1;Data Source=$Workbook$;Location=1;Extended Properties=""""" _
        , Destination:=Range("$A$1")).QueryTable
        .CommandType = xlCmdSql
        .CommandText = Array("SELECT * FROM [1]")
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .BackgroundQuery = True
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .PreserveColumnInfo = True
        .ListObject.DisplayName = "_1"
        .Refresh BackgroundQuery:=False
    End With
Ну ладно, спасибо в любом случае, сейчас буду докручивать, чтобы этим могли пользоваться непосвященные люди
Изменено: lolashwaya - 11.06.2024 13:16:47
 
Запросы можно параметризировать. В частности пути к файлам сделать переменными
Согласие есть продукт при полном непротивлении сторон
Страницы: 1
Наверх