Выбор пользователя (книга и имя листа), затем копирование и вставка - PullRequest
0 голосов
/ 26 апреля 2018

Есть ли способ сделать так, чтобы пользователь выбирал лист для копирования после открытия файла?

Я бы хотел сделать это, потому что может быть несколько листов одного формата, но с разными именами.

Пример: Оригинальная рабочая книга с именем VSC (содержит листы Сравнить , Сюжет )

Вторичная рабочая книга с именем SF (содержит листы Results1 , Results2 , Results3 )

Пользователь нажимает кнопку на VSC , и открывается диалоговое окно файла, и пользователь выбирает SF в определенном каталоге, а затем просит пользователя выбрать лист для выбора - пользователь выбирает Results2 лист, копирует данные (диапазон "B2: B5"), затем вставляет их обратно в Сравните лист.

Возможно ли это? Я не уверен, как начать.

Текущий код, который просит пользователя выбрать книгу SF:

Sub GetFilePath()
Dim objFSO as New FileSystemObject

Set myFile = Application.FileDialog(msoFileDialogOpen)
With myFile
    .Title = "Choose File"
    .AllowMultiSelect = False
If .Show <> -1 Then
    Exit Sub
End If
FileSelected = .SelectedItems(1)
End With

Ответы [ 3 ]

0 голосов
/ 26 апреля 2018

После того, как ваша рабочая книга открыта, вы можете перечислять листы по имени и заполнять список выбора на листе в рабочей книге VSC ...

0 голосов
/ 26 апреля 2018

Вот другой подход к вашему вопросу. После открытия новой книги он использует таймер, который каждые 10 секунд спрашивает вас, находитесь ли вы на листе, с которого хотите скопировать. Если вы ответите «Да», он скопирует. Если вы ответите «нет», он перезапустит 10-секундный таймер.

Sub GetFilePath()
    Set MyFile = Application.FileDialog(msoFileDialogOpen)
    With MyFile
        .Title = "Choose File"
        .AllowMultiSelect = False
        If .Show <> -1 Then
            Exit Sub
        End If
        FileSelected = .SelectedItems(1)
    End With
    Set newWk = Workbooks.Open(FileSelected, , True)
    'Open Selected Workbook and check in 10 seconds for Selected Sheet Name
    Application.OnTime Now + TimeValue("00:00:10"), "CheckForSheet"
End Sub
Private Sub CheckForSheet()
    Dim SheetName As String
    SheetName = ActiveSheet.Name
    answer = MsgBox("Is This the Sheet to copy from: " & SheetName & "?", vbYesNo + vbQuestion, "Copy Data?")
    If answer = vbYes Then
        'ThisWorkbook is the workbook with the Macro/VBA code
        'ActiveWorkbook is the workbook where you are selecting the Sheet to copy from
        ActiveWorkbook.Sheets(SheetName).Range("B2:B5").Copy
        ThisWorkbook.Sheets("Compare").Range("C1:C4").PasteSpecial
    Else
        'Check Again in 10 Seconds
        Application.OnTime Now + TimeValue("00:00:10"), "CheckForSheet"
    End If
End Sub
0 голосов
/ 26 апреля 2018

Вот один из подходов. Вы вводите имя листа. Отрегулируйте диапазоны копирования и вставки в соответствии с требованиями.

Sub GetFilePath()

Dim objFSO As New FileSystemObject, w As String, wb As Workbook

Application.ScreenUpdating = False

Set myFile = Application.FileDialog(msoFileDialogOpen)
With myFile
    .Title = "Choose File"
    .AllowMultiSelect = False
    If .Show <> -1 Then
        Exit Sub
    End If
    Set wb = Workbooks.Open(.SelectedItems(1))
End With

w = InputBox("Enter sheet name")

If SheetExists(w) Then
    wb.Sheets(w).Range("B2:B5").Copy
    ThisWorkbook.Sheets("Compare").Range("A1").pastespecial xlvalues
Else
    MsgBox "Sheet not found"
End If

wb.Close False

Application.ScreenUpdating = True

End Sub

Function SheetExists(s As String) As Boolean

Dim x    
On Error GoTo NextSheet
x = ActiveWorkbook.Sheets(SheetName).Name
SheetExists = True
Exit Function    
NextSheet:
    SheetExists = False    
End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...