从数据验证列表开始,我喜欢它在我希望数据出现的单元格中。尝试组合框和活动X组合框,并不喜欢它们不驻留在单元格中。这与Access非常不同。这就是我想要实现的目标:
我的命名范围(员工)为A4:C100
,列为{3},标题为Title
,MI
和LN
位于名为“Emp”的工作表上。
我的表单位置是C6。我希望能够显示3列,最后得到三列中的数据。例如,警官J. Doe。
目前我正在使用数据验证列表将数据输入到一个列中,如Doe,J.,Officer,它的工作原理。列表可能很长,我需要按字母顺序排列。
这是最好的方式还是我与组合框和活动的X组合框混淆了?
答案 0 :(得分:0)
在下拉列表中显示所有3列组合的唯一方法是连接第4列中的数据,例如在单元格D4中使用以下公式
=A4&" "&B4&" "&C4
...然后你可以命名范围D4:D100。出于表现原因,您可能希望隐藏此列
实际上,您可能希望避免命名整个范围,因为底部单元格可能是空白/使滚动更加笨拙而不是严格必要。我建议dynamic ranges
下一个扩展练习可能是制定您的公式以允许例如缺少中间名,例如。
=A4&" "&IF(B4<>"",B4&" ","")&C4
以上假设您可以手动对数据进行排序。如果没有手动对数据进行排序,则需要使用VBA,例如每次用户离开Sheet(“Emp”)时,确保完成D列并创建命名范围。您可以在Emp表格中嵌入以下代码...
Private Sub Worksheet_Deactivate
For n = 4 to 100
If Cells(n, 1) <> "" Then
Cells(n, 4) = Cells(n, 1) & " " & Cells(n, 2) & " " & Cells(n, 3)
End If
Next n
Range(Cells(4,4),Cells(100,4)).Sort Key1:=Cells(4,4), Order1:=xlAscending, Header:=xlNo
LastRow = 4
Do Until Cells(LastRow + 1, 4) = ""
LastRow = LastRow + 1
Loop
ActiveWorkbook.Names.Add Name:="Employee", RefersTo:=Range(Cells(4,4),Cells(LastRow,4))
End Sub
通过记录宏并消除代码,可以找到排序/添加范围名称的表达式,如expert Excel support video所示。您的数据验证将引用“员工”,即第4列中创建的范围名称
上面提出了许多假设,例如所有员工在第一列中都有数据的想法,如果您并不总是在所有三列中都有数据,则需要添加逻辑测试
当用户点击表单的单元格C6时,您可能还希望创建Employee范围,因为这可能更强大。我在使用Worksheet_Deactivate时的假设是“员工”可能会在电子表格的其他地方使用
答案 1 :(得分:0)
像这样的东西。将此代码放在工作表中,其中comboBox为
Private Sub Worksheet_Change(ByVal Target As Range)
Dim topY As Integer, leftX As Integer
topY = ComboBox1.top
leftX = ComboBox1.left
Dim c As Range
Set c = Cells(5, 5)
c.Left = topY
c.Top = leftX
c.Width = ComboBox1.Width
c.Height = ComboBox1.Height
End Sub
如果你移动东西,它应该锁定到位。或者您可以在Private Sub Worksheet_SelectionChange(ByVal Target As Range)
事件中尝试。