Итак, у меня есть раскрывающийся список в ячейке, использующий проверку данных в Excel, которая просто использует параметр «Список», ссылающийся на диапазон на другом листе. У меня есть этот раскрывающийся список на нескольких листах. Когда я выбираю элемент из раскрывающегося списка на одном листе, этот же выбор не применяется к раскрывающемуся списку на других листах.
Мне интересно... можно ли настроить его так, чтобы, если я сделаю выбор из раскрывающегося меню на одном листе, этот выбор будет применен к раскрывающимся меню, которые у меня есть на других листах?
Можно ли обработать с помощью VBA, если это возможно?
@Метки. это просто ссылка на диапазон на другом листе. И извините, УНИКАЛЬНОГО там нет. Это просто =PLs!$F$2:$F$19. PLs — это имя листа, на котором находится список.


Использование решения 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 не позволяет мне называть ячейку одним и тем же значением на всех листах. Когда я пытаюсь назвать его так же, он переходит к именованной ячейке на другом листе.
Вот почему я написал, что нужно быть осторожным и применять его на каждом листе. Для этого вам придется использовать Name-Manager!
@ike: если вы используете Worksheet_Change, вам придется поместить код во все листы. Лучшим вариантом было бы использовать Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) в ThisWorbook :)
@SiddharthRout: да, это правда!
Я обновил код, чтобы использовать событие Workbook_SheetChange, а также некоторые обновления для UpdateSelection
Прекрасно работает :)
Хорошо, мне нужно это настроить и протестировать.
Как я могу ссылаться на все ячейки из разных листов в диспетчере имен и называть их одним и тем же именем? Добавлять ли плюсики после каждого? Похоже, единственный способ сделать это — добавить знак плюса после каждого в поле «Относится к». Но не уверен, что делаю это правильно.
Аааа, я вижу. Мне нужно изменить область действия для каждого листа. Неважно.
Если вы хотите, чтобы выбор управлял другими ячейками проверки данных, есть несколько способов добиться этого, за исключением VBA, но, возможно, придется пойти на некоторые жертвы.
Первое и самое важное: это не будет многонаправленным, то есть потребуется решить, какая из проверок данных будет служить основным выбором.
Сначала в Mastercell выберите вариант, который принимается другими проверками, и вы можете сохранить проверки в этих ячейках и указать их на первую. Если поле Mastercell не пусто, это не должно привести к ошибке, поскольку проверка примет выбор. Удаление выбора приведет к результату «0» в других проверках, но не приведет к ошибке подсказки.
Вы можете отключить проверки и указать их на ячейку выбора, чтобы контролировать их все. Жертвой этих вариантов выбора является то, что вы не сможете выбрать ни один из них и позволить им контролировать все остальное. Для этого потребуется VBA, поскольку он перезаписывает формулы, которые будут заполнять значения ячеек.
Можете поделиться уникальной формулой? Это ссылка только на диапазон или имя листа?