¿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.