выпадающий список Excel с адресом в качестве результата

#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. Действительно, это сработало бы. Я подожду с принятием этого в качестве ответа, потому что я все еще надеюсь увидеть ответ без сценария (т. Е. просто формулы). Если бы, например, был способ заполнить выпадающий список адресами вместо значений, проблема была бы решена.