Cómo hacer que la validación de datos de Excel muestre datos diferentes en el menú desplegable de los que realmente se validan

Cómo hacer que la validación de datos de Excel muestre datos diferentes en el menú desplegable de los que realmente se validan

¿Cómo puedo proporcionarle a un usuario un menú desplegable en una celda que muestra el contenido de una columna pero que en realidad escribe el valor de una columna diferente en la celda y lo valida con los valores de esa segunda columna?

Tengo un fragmento de código que casi hace esto (crédito: DV0005 deel sitio de Contexturas):

Private Sub Worksheet_Change(ByVal Target As range)
On Error GoTo errHandler
If Target.Cells.Count > 1 Then GoTo exitHandler
If Target.Column = 10 Then
  If Target.Value = "" Then GoTo exitHandler
  Application.EnableEvents = False
  Target.Value = Worksheets("Measures").range("B1") _
    .Offset(Application.WorksheetFunction _
    .Match(Target.Value, Worksheets("Measures").range("Measures"), 0) - 1, 1)
End If

El menú desplegable muestra los valores de una columna, por ejemplo, la columna B, pero cuando se selecciona, en realidad escribe el valor en la misma fila de la columna C en la celda. Sin embargo, la validación de datos en realidad se valida con la columna B, por lo que si ingreso manualmente algo de la columna C en la celda e intento pasar a otra celda, la validación de datos arroja un error.

Respuesta1

La única forma que veo sería eliminar la validación de datos y codificar su propio cuadro desplegable.

La ventaja de esto es que el menú desplegable ocultará la celda real, por lo que la celda aún se puede editar normalmente.

Este código (deaquí) agregará un menú desplegable y, cuando se seleccione un elemento, colocará ese valor en la celda, cambiará otra celda según el elemento seleccionado y luego se eliminará para que no exista ningún menú desplegable. Deberías poder utilizar este código para tu propia diversión.

Código reproducido aquí, por si el enlace se rompe:

Option Explicit

Sub Test()
    AddDropDown Range("D4")
End Sub

Sub AddDropDown(Target As Range)
    Dim ddBox As DropDown
    Dim vaProducts As Variant
    Dim i As Integer

    vaProducts = Array("Water", "Oil", "Chemicals", "Gas")
    Set ddBox = Sheet1.DropDowns.Add(Target.Left, Target.Top, Target.Width, Target.Height)
    With ddBox
        .OnAction = "EnterProductInfo" ' name corrected
        For i = LBound(vaProducts) To UBound(vaProducts)
            .AddItem vaProducts(i)
        Next i
    End With
End Sub

Private Sub EnterProductInfo()
    Dim vaPrices As Variant

    vaPrices = Array(15, 12.5, 20, 18)
    With Sheet1.DropDowns(Application.Caller)
        .TopLeftCell.Value = .List(.ListIndex)
        .TopLeftCell.Offset(0, 2).Value = vaPrices(.ListIndex - Array(0, 1)(1))
        .Delete
    End With
End Sub

Respuesta2

Si no desea utilizar un control de Dropbox, ¿por qué no pensar en este enfoque?

  • El evento OnCellSelect captura la celda de destino
  • Agregue validación desplegable en la celda.
  • Después de elegir la opción correcta del menú desplegable en la celda
  • Se activará el evento OnChange
  • Capturar el valor a una variable.
  • Dividirlo
  • Desactive los eventos para que no inicie un bucle ~
  • Quitar validación de celda
  • Reescribe el valor de la celda con la variable split
  • Activar eventos

La validación de celda siempre se agregará en el evento onselect y se eliminará en el evento de cambio. Cada vez que enfocas la celda, aparece como un menú desplegable en la validación de celda, una vez seleccionada deja de serlo y escribes el valor que deseas que sea.

información relacionada