Сопоставить выбор из раскрывающегося списка на нескольких листах

Итак, у меня есть раскрывающийся список в ячейке, использующий проверку данных в Excel, которая просто использует параметр «Список», ссылающийся на диапазон на другом листе. У меня есть этот раскрывающийся список на нескольких листах. Когда я выбираю элемент из раскрывающегося списка на одном листе, этот же выбор не применяется к раскрывающемуся списку на других листах.

Мне интересно... можно ли настроить его так, чтобы, если я сделаю выбор из раскрывающегося меню на одном листе, этот выбор будет применен к раскрывающимся меню, которые у меня есть на других листах?

Можете поделиться уникальной формулой? Это ссылка только на диапазон или имя листа?

Mark S. 12.03.2024 14:47

Можно ли обработать с помощью VBA, если это возможно?

Siddharth Rout 12.03.2024 14:49

@Метки. это просто ссылка на диапазон на другом листе. И извините, УНИКАЛЬНОГО там нет. Это просто =PLs!$F$2:$F$19. PLs — это имя листа, на котором находится список.

user14915635 12.03.2024 14:54
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
0
3
72
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Использование решения VBA:

  • назовите все ячейки с помощью соответствующего раскрывающегося списка «selectXXX» — будьте осторожны, применяя имя на уровне листа с помощью диспетчера имен.

  • затем добавьте следующий код в модуль ThisWorkbook:

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim cTarget As Range: Set cTarget = Target.Cells(1, 1)
If hasName(cTarget, "selectXXX") Then
    updateSelection cTarget
End If
End Sub

Private Function hasName(rg As Range, strName As String) As Boolean
On Error Resume Next
If rg.Name.Name Like "*!" & strName Then
    If Err = 0 Then hasName = True
End If
End Function

Этот код срабатывает всякий раз, когда вы меняете ячейку на одном из листов. Если ячейка является ячейкой, содержащей список проверки, вызывается updateSelection.

  • Поместите следующий код в «обычный» модуль:
Public Sub updateSelection(rgSource As Range)

Dim strName As String
strName = Split(rgSource.Name.Name, "!")(1)

Dim wsSource As Worksheet
Set wsSource = rgSource.Parent

Dim ws As Worksheet, rgTarget As Range
For Each ws In ThisWorkbook.Worksheets
    If Not ws Is wsSource Then
        If tryGetRangeByName(strName, ws, rgTarget) = True Then
            Application.EnableEvents = False
                rgTarget.Value = rgSource.Value
            Application.EnableEvents = True
        End If
    End If
Next

End Sub

Private Function tryGetRangeByName(strName As String, ws As Worksheet, _
    ByRef rg As Range) As Boolean

On Error Resume Next
Set rg = ws.Range(strName)
If Err = 0 Then tryGetRangeByName = True
On Error GoTo 0

End Function

updateSelection проверяет каждый лист на наличие переданного диапазона с тем же именем и, если он найден, устанавливает значение.

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

user14915635 12.03.2024 15:11

Вот почему я написал, что нужно быть осторожным и применять его на каждом листе. Для этого вам придется использовать Name-Manager!

Ike 12.03.2024 15:12

@ike: если вы используете Worksheet_Change, вам придется поместить код во все листы. Лучшим вариантом было бы использовать Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) в ThisWorbook :)

Siddharth Rout 12.03.2024 15:13

@SiddharthRout: да, это правда!

Ike 12.03.2024 15:23

Я обновил код, чтобы использовать событие Workbook_SheetChange, а также некоторые обновления для UpdateSelection

Ike 12.03.2024 15:31

Прекрасно работает :)

Siddharth Rout 12.03.2024 15:36

Хорошо, мне нужно это настроить и протестировать.

user14915635 12.03.2024 15:47

Как я могу ссылаться на все ячейки из разных листов в диспетчере имен и называть их одним и тем же именем? Добавлять ли плюсики после каждого? Похоже, единственный способ сделать это — добавить знак плюса после каждого в поле «Относится к». Но не уверен, что делаю это правильно.

user14915635 13.03.2024 17:20

Аааа, я вижу. Мне нужно изменить область действия для каждого листа. Неважно.

user14915635 13.03.2024 17:25

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

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

Сначала в Mastercell выберите вариант, который принимается другими проверками, и вы можете сохранить проверки в этих ячейках и указать их на первую. Если поле Mastercell не пусто, это не должно привести к ошибке, поскольку проверка примет выбор. Удаление выбора приведет к результату «0» в других проверках, но не приведет к ошибке подсказки.

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

Другие вопросы по теме