Excel 2010中的数据验证列表,组合框或活动X组合框?

时间:2011-09-20 14:51:50

标签: excel

从数据验证列表开始,我喜欢它在我希望数据出现的单元格中。尝试组合框和活动X组合框,并不喜欢它们不驻留在单元格中。这与Access非常不同。这就是我想要实现的目标:

我的命名范围(员工)为A4:C100,列为{3},标题为TitleMILN位于名为“Emp”的工作表上。

我的表单位置是C6。我希望能够显示3列,最后得到三列中的数据。例如,警官J. Doe。

目前我正在使用数据验证列表将数据输入到一个列中,如Doe,J.,Officer,它的工作原理。列表可能很长,我需要按字母顺序排列。

这是最好的方式还是我与组合框和活动的X组合框混淆了?

2 个答案:

答案 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)事件中尝试。