Excel VBA Макросы: Как сделать диалоговое окно для выбора импортируемого файла?

Автор Tryan, 12 февраля 2020, 20:16

Tryan

Нужно сделать импорт данных из одного экселевского файла в другой.
В папке "EXCEL" есть файл "С ИМПОРТОМ.xlsm" и лист "мин элемент", на котором создал кнопку "Импорт" с приведенным ниже кодом.
Кнопка импортирует данные из файла "ДАННЫЕ.xlsx" с листа "мин элемент" (диапазон C2:H8).

Но нужно, чтобы при нажатии на кнопку открывалось диалоговое окно выбора импортируемого файла. Что-то на подобие: Данные - Получение внешних данных - Из текста, но на vba.

Макрос
Option Explicit

Sub Кнопка2_Щелчок()


Dim lCalc As Long
    Dim sCopyAddress As String
    Dim lLastRowMyBook As Long
   Dim wsDataSheet As Object

    sCopyAddress = "C2:H8"    'диапазон для копирования
    With Application
        lCalc = .Calculation
        .ScreenUpdating = False: .EnableEvents = False: .Calculation = xlManual
    End With
    Set wsDataSheet = ThisWorkbook.Sheets("мин элемент")

    Workbooks.Open Filename:="F:\EXCEL\ДАННЫЕ.xlsx"
    With Sheets("мин элемент")    'имя листа в книге, из которого копируем данные
        lLastRowMyBook = wsDataSheet.Cells.SpecialCells(xlLastCell).Row + 1
        .Range(sCopyAddress).Copy wsDataSheet.Range("C2:H8")
    End With
    Workbooks("ДАННЫЕ.xlsx").Close False
    With Application
        .ScreenUpdating = True: .EnableEvents = True: .Calculation = lCalc
    End With
End Sub
[свернуть]

P.s. Может быть нужно использовать Application.GetOpenFilename?

[вложение удалено администратором]

Администратор

Макрос
Sub Импорт()
   
    Dim wsDataSheet As Object, sCopyAddress As String
    Dim FN_src As String, lCalc As Long
   
   
    ' Юзер выбирает эксель-файл, из которого нужно извлечь данные.
        ' Полное имя (путь + имя) выбранного файла записывается в переменную "FN_src".
    With Application.FileDialog(msoFileDialogFilePicker)
        .ButtonName = "OK"
        .AllowMultiSelect = False
        .Filters.Clear
        .Filters.Add "Файлы Excel", "*.xlsx"
        .Title = "ВЫБЕРИТЕ ЭКСЕЛЬ-ФАЙЛ, ИЗ КОТОРОГО НУЖНО ИЗВЛЕЧЬ ДАННЫЕ."
        If .Show = False Then
            Exit Sub
        End If
        FN_src = .SelectedItems(1)
    End With
   
    sCopyAddress = "C2:H8"    'диапазон для копирования
    With Application
        lCalc = .Calculation
        .ScreenUpdating = False: .EnableEvents = False: .Calculation = xlManual
    End With
    Set wsDataSheet = ThisWorkbook.Sheets("мин элемент")
   
    Workbooks.Open Filename:=FN_src
    With Sheets("мин элемент")    'имя листа в книге, из которого копируем данные
        .Range(sCopyAddress).Copy wsDataSheet.Range("C2:H8")
    End With
    Workbooks("ДАННЫЕ.xlsx").Close False
    With Application
        .ScreenUpdating = True: .EnableEvents = True: .Calculation = lCalc
    End With
   
End Sub
[свернуть]

Не знаю, в каких случаях нужно использовать "Application.GetOpenFilename".
С помощью него тоже можно выбрать файл. Но мне кажется, что это старый инструмент, вместо него сделали то, что я вставил в макрос.