Excel VBA просит пользователя выбрать рабочий лист

Основная цель — выбрать лист из моей книги, например, у меня есть листы с 1 по 10, пользователю будет предложено выбрать только 1 лист. Ниже приведен найденный мной образец кода, в котором открывается окно, позволяющее пользователю выбрать ячейку рабочего листа вместо рабочего листа. Я не уверен, как я могу добавить фотографии для показа, но я постараюсь объяснить. Пример: появляется окно. Чтобы оно заработало, мне нужно ввести =Sheet1!$E$4, а не просто вводить =Sheet1. Любая помощь приветствуется.

    On Error Resume Next
    Set ws2 = Application.InputBox(Prompt: = "Select a worksheet", Title: = "Select Worksheet", Type:=8).Parent
    On Error GoTo 0
    If ws2 Is Nothing Then
        MsgBox "User cancelled...", vbInformation
    Else

1
108
6

Ответы:

Чтобы получить наилучший результат, вам нужно создать UserForm с элементом управления ComboBox и заполнить его именами листов:

Dim ws As Worksheet
For Each ws In Worksheets
    ComboBox1.AddItem ws.Name
Next

Решено

Введите имя листа как String и проверьте, является ли это допустимым объектом.

    ws2_name = Application.InputBox(prompt: = "Select a worksheet", Title: = "Select Worksheet")
    On Error Resume Next
    Set ws2 = Worksheets(ws2_name)
    On Error GoTo 0
    If IsEmpty(ws2) Then
        MsgBox "User cancelled (or name error)...", vbInformation
        Exit Sub
    End If
    'here is code process
    ws2.Select

Мод на комментарий

sh_list = "Select a sheet:"
For i = 1 To Worksheets.Count
    sh_list = sh_list & Chr(10) & Worksheets(i).Name
Next i
    ws2_name = Application.InputBox(prompt:=sh_list, Title: = "Select Worksheet")
    On Error Resume Next
    Set ws2 = Worksheets(ws2_name)
    On Error GoTo 0
    If IsEmpty(ws2) Then
        MsgBox "User cancelled (or name error)...", vbInformation
        Exit Sub
    End If
    ws2.Select

В поле ввода будут перечислены доступные имена листов. Более совершенным обходным решением может быть ListBox в Userform.


Следующее работает, но требует правильной проверки ошибок. Это должно дать вам возможность сделать то, что вы просили:

Dim InputStr As String

InputStr = Application.InputBox("Enter Name of Worksheet to Go To", "Go To Worksheet")

Worksheets(InputStr).Activate

Вы находитесь в 1 шаге от получения объекта рабочего листа в ws2

Вам нужно изменить только одно слово:

Sub asda()
  Dim ws2 As Worksheet, wsname As String
  On Error Resume Next
  Set ws2 = Application.InputBox(Prompt: = "Select a worksheet", _ 
    Title: = "Select Worksheet", Type:=8).Worksheet ' here!
  On Error GoTo 0
  If ws2 Is Nothing Then
    MsgBox "User cancelled...", vbInformation
  Else
    wsname = ws2.Name
    MsgBox wsname
  End If
End Sub

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

Предложите пользователю выбрать любую ячейку на целевом листе: Prompt:="Выберите любую необходимую ячейку на листе"


Если я правильно понимаю ваше требование, вам нужно всплывающее окно для выбора листа из вашей книги. Вы можете включить этот код в свой код VBA.введите описание изображения здесь введите описание изображения здесь введите описание изображения здесь

Если вам это нужно, вы можете заменить сообщение в поле ввода более конкретным приглашением.

Как это работает: Как это работает: Выбор листа: пользователю предлагается ввести имя листа.

Проверка листа: программа проверяет, существует ли введенное имя листа в книге. Если этого не происходит, отображается сообщение об ошибке.

Подсчет ячеек со значениями. Это всего лишь фиктивный набор инструкций для проверки работы кода. Функция Application.WorksheetFunction.CountA используется для подсчета количества непустых ячеек в UsedRange выбранного листа. Свойство UsedRange относится к диапазону ячеек, которые использовались на листе.

Отображение результата: результат отображается в окне сообщения, показывая количество ячеек со значениями на выбранном листе.

Sub SelectSheetAndCountCellsWithValues()

    ' Display the input box for selecting a worksheet
    Dim sheetName As String
    sheetName = Application.InputBox("Please enter the name of the worksheet", Type:=2)
    
    ' Check if a sheet name was entered (InputBox will return an empty string if cancelled)
    If sheetName = "" Then
        MsgBox "No worksheet selected. Exiting the program.", vbExclamation
        Exit Sub
    End If
    
    ' Check if the entered sheet name exists in the workbook
    On Error Resume Next
    Dim selectedSheet As Worksheet
    Set selectedSheet = ThisWorkbook.Sheets(sheetName)
    On Error GoTo 0
    
    If selectedSheet Is Nothing Then
        MsgBox "The worksheet '" & sheetName & "' does not exist.", vbExclamation
        Exit Sub
    End If
    
    ' This is just a dummy program to test the execution of the code by Counting the cells with values in the selected sheet
    Dim cellCount As Long
    cellCount = Application.WorksheetFunction.CountA(selectedSheet.UsedRange)
    
    ' Display the result to the user
    MsgBox "The worksheet '" & selectedSheet.Name & "' contains " & cellCount & " cells with values.", vbInformation

End Sub

Ссылка на рабочий лист с использованием пользовательского ввода

  • Ниже следует охватить большинство различных «сюрпризов» (защита и видимость не рассматриваются), с которыми вы можете столкнуться.
  • Вам решать, что применимо в вашем конкретном случае.
Sub Test()
    
    ' Previously referenced (set) objects.
    Dim wb As Workbook: Set wb = ThisWorkbook ' workbook containing this code
    Dim ws1 As Worksheet: Set ws1 = wb.Sheets("Sheet1")
    
    ' Define constants (usually on the top of the code).
    Const WORKSHEET_SELECTION_TITLE As String = "Worksheet Selection"
    
    ' Let the user enter the worksheet name.
    ' Use a Variant variable to distinguish between 'False' and "False".
    Dim InputValue As Variant: InputValue = Application.InputBox( _
        Prompt: = "Please enter a worksheet name:", _
        Title: = "WORKSHEET_SELECTION_TITLE", Type:=2) ' 2 means string
        
    ' Exit if the user cancelled the input box.
    If VarType(InputValue) = vbBoolean Then
    ' 'If InputValue = False Then' will not allow a sheet named "False".
        MsgBox "User cancelled!", vbExclamation, WORKSHEET_SELECTION_TITLE
        Exit Sub
    End If
    
    ' Store the entered sheet name in a String variable.
    Dim Sheet2Name As String: Sheet2Name = InputValue
    
    ' Attempt to reference the sheet.
    ' Use an Object variable because it may not be a worksheet but a chart.
    Dim sh2 As Object
    On Error Resume Next
        Set sh2 = wb.Sheets(Sheet2Name)
    On Error GoTo 0
    
    ' Exit if the sheet doesn't exist.
    If sh2 Is Nothing Then
        MsgBox "There is no sheet named """ & Sheet2Name & """ in workbook """ _
            & wb.Name & """!", vbExclamation, WORKSHEET_SELECTION_TITLE
        Exit Sub
    End If
    
    ' Exit if the sheet is not a worksheet.
    If Not TypeOf sh2 Is Worksheet Then
        MsgBox "Sheet """ & Sheet2Name & """ is not a worksheet!", _
            vbExclamation, WORKSHEET_SELECTION_TITLE
        Exit Sub
    End If
    
    ' Reference the 2nd worksheet
    Dim ws2 As Worksheet: Set ws2 = sh2
    Set sh2 = Nothing

    ' Exit if the 'chosen' 2nd worksheet is the same as the first worksheet.
    If ws2 Is ws1 Then
        MsgBox "The first sheet is named """ & ws1.Name & """!", _
            vbExclamation, WORKSHEET_SELECTION_TITLE
        Exit Sub
    End If
     
    ' Continue with the code using
    ' the 'wb', 'ws1', 'ws2' and 'Sheet2Name' variables.
    
    MsgBox "Created a reference to worksheet """ & ws2.Name & """ (""" _
        & Sheet2Name & """) in workbook """ & wb.Name & """!", _
        vbExclamation, WORKSHEET_SELECTION_TITLE

End Sub

Интересные вопросы для изучения