Como posso fornecer a um usuário um menu suspenso em uma célula que exibe o conteúdo de uma coluna, mas na verdade grava o valor de uma coluna diferente na célula e valida os valores dessa segunda coluna?
Eu tenho um pouco de código que quase faz isso (crédito: DV0005 deo site Contextures):
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
O menu suspenso exibe os valores de uma coluna, por exemplo, Coluna B, mas quando selecionado, na verdade grava o valor na mesma linha da Coluna C para a célula. No entanto, a validação de dados é, na verdade, uma validação na Coluna B, portanto, se eu inserir manualmente algo da Coluna C na célula e tentar mover para outra célula, a validação de dados gerará um erro.
Responder1
A única maneira que vejo seria remover a validação de dados e codificar sua própria caixa suspensa.
A vantagem disso é que o menu suspenso ocultará a célula real, de modo que a própria célula ainda poderá ser editada normalmente.
Este código (deaqui) adicionará um menu suspenso e, quando um item for selecionado, colocará esse valor na célula, alterará outra célula com base no item selecionado e, em seguida, removerá a si mesmo para que não exista nenhum menu suspenso. Você deve poder usar esse código para sua própria diversão.
Código reproduzido aqui, caso o link seja quebrado:
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
Responder2
Se você não deseja usar um controle de caixa de depósito, por que não pensar nessa abordagem?
- O evento OnCellSelect captura a célula alvo
- Adicione validação suspensa na célula a ele.
- Depois de escolher a opção correta no menu suspenso na célula
- O evento OnChange será acionado
- Capture o valor para uma variável
- Divida
- Desligue os eventos para que não inicie um loop ~
- Remover validação de célula
- Reescreva o valor da célula com a variável split
- Ativar eventos
A validação da célula sempre será adicionada no evento onselect e removida no evento change. Cada vez que você foca a célula ela aparece como um menu suspenso na validação da célula, uma vez selecionada ela deixa de ser e você escreve o valor que deseja que seja.