#excel #excel-formula
#excel #excel-формула
Вопрос:
Обычный выпадающий список проверки данных в Excel приводит к тому, что выбранное значение помещается в ячейку. Однако в моем случае я ссылаюсь на другой список в моей таблице, элементы которого могут меняться. Моя цель — применить эти изменения к уже выбранным элементам выпадающего списка.
Пример: Список ссылок в выпадающем списке (лист «Список»):
- A
- B
- C
Пользователь выбирает A из выпадающего списка на листе «Выбор»:
- A
Теперь пользователь изменяет A на Y в листе «Список»:
- Y
- B
- C
Пользовательский выбор на листе «Выбор» по-прежнему показывает A, но теперь он должен показывать Y:
- A
Возможно ли это каким-либо образом? Могу ли я, например, сделать так, чтобы результатом выпадающего списка был адрес значения, а не само значение?
Спасибо!
Комментарии:
1. Как пользователь изменяет значение в листе «Список»? Вручную (записывает в строке формул)?
2. Да, список в «Списке» — это просто текстовые значения.
Ответ №1:
К сожалению, нет никакого способа сделать это с помощью формулы или встроенной функции (о которой я знаю)
Вот что-то простое, что вы могли бы применить и с чем можно работать:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target(1, 1), Range("A1:A3")) Is Nothing Then
ActiveWorkbook.Sheets("Selection").Range("A1").Value = Target(1, 1)
End If
End Sub
Предполагается, что Range("A1:A3")
это список, на который вы ссылаетесь. Вставьте это под свой лист списка.
Ответ №2:
Выпадающий подвиг. Событие изменения рабочего листа
- Чтобы «скопировать» ваши настройки, на рабочем листе
List
я создал имяDrop1
, которое ссылается на диапазон столбцов, содержащий значения. Затем я создал выпадающий список проверки вB2
на рабочем листеSelection
и выбрал имя (Drop1
) в качестве списка. - Измените константы (Const) в соответствии с вашими потребностями.
Модуль1
Option Explicit
Public strListSheet As String
Public strListRange As String
Public vntList As Variant
Sub Drop(rngList As Range)
Const cDropSheet As String = "Selection"
Const cDropRange As String = "B2"
Dim rng As Range
Dim vntNew As Variant
Dim vntVal As Variant
Dim Nor As Long
Dim i As Long
Set rng = ThisWorkbook.Worksheets(cDropSheet).Range(cDropRange)
vntVal = rng
vntNew = rngList
Nor = UBound(vntList)
For i = 1 To Nor
If vntList(i, 1) = vntVal Then
If vntVal <> vntNew(i, 1) Then
rng = vntNew(i, 1)
End If
Exit For
End If
Next
vntList = vntNew
End Sub
Sub Initialize()
Const strDrop as string = "Drop1"
Dim str1 As String
Dim lngInStr As Long
' Prepare
str1 = Names(strDrop).RefersTo
lngInStr = InStr(1, str1, "!")
' Write Public Variables
strListRange = Right(str1, Len(str1) - lngInStr)
strListSheet = WorksheetFunction.Substitute(WorksheetFunction _
.Substitute(Left(str1, lngInStr - 1), "=", ""), "'", "")
vntList = Worksheets(strListSheet).Range(strListRange)
End Sub
Эта рабочая тетрадь
Option Explicit
Private Sub Workbook_Open()
Initialize
End Sub
Список (рабочий лист)
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo ErrInit
If Target.Cells.Count = 1 Then
Dim rngList As Range
Set rngList = ThisWorkbook.Worksheets(strListSheet) _
.Range(strListRange)
If Not Intersect(Target, rngList) Is Nothing Then
Drop rngList
End If
End If
Exit Sub
ErrInit:
MsgBox "An unexpected error occurred. Error '" amp; Err.Number amp; "':" _
amp; Err.Description, vbCritical, "Error"
On Error GoTo 0
Initialize
End Sub
Комментарии:
1. Спасибо за этот подход VB. Действительно, это сработало бы. Я подожду с принятием этого в качестве ответа, потому что я все еще надеюсь увидеть ответ без сценария (т. Е. просто формулы). Если бы, например, был способ заполнить выпадающий список адресами вместо значений, проблема была бы решена.