Основная цель — выбрать лист из моей книги, например, у меня есть листы с 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
Если вы просто хотите ввести любую строку, можно использовать функцию Inputbox()
или Application.Inputbox()
, например Application.InputBox("Type your sheet range")
.
Вы можете рассмотреть возможность использования элемента управления RefEdit в пользовательской форме.
Чтобы получить наилучший результат, вам нужно создать 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
.
Спасибо за помощь @Black Cat, это помогает. Знаете ли вы, как я могу перечислить все листы, которые есть в моей книге, и позволить пользователю выбрать лист? Затем я могу назначить лист выбора для ws2. Спасибо.
Вы могли бы включить индекс i
в sh_list
, и пользователю просто нужно будет ввести номер индекса?
@user23357972 user23357972 Какой ваш выбор среди этих двух худших решений, когда пользователю приходится вводить имя листа вручную?
Следующее работает, но требует правильной проверки ошибок. Это должно дать вам возможность сделать то, что вы просили:
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
@RaghavendraPratap спасибо за вашу помощь, извините, что я не сформулировал свою цель яснее. Моя основная цель — открыть список листов, которые есть в моей книге (пример листов с 1 по 10), и пользователь выберет один лист. И он назначит пример ws2.
@user23357972 user23357972 вы можете выбрать любой лист в своей книге в текущем коде. Просто удалите " = " и "!" метки или введите имя. Создание списка листов и выбор имени листа непосредственно из этого списка потребует некоторых дополнительных изменений. Кроме того, вам, возможно, придется создать пользовательскую форму.
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
Если я правильно понимаю, вы хотите, чтобы пользователь мог вручную вводить адрес диапазона.
Type:=8' specifies the input type as
Range, you need to change it to
Type:=2', который определяет тип ввода какString