一mm同学想在excel中使用这么个功能,在一个单元格,假设为A1,做一些选项,例如,洗车品牌型号,在它下面就显示对应的汽车参数,价格等数据。
本准备使用lookup,结果发现没能成功。最后还是转身强大的VBA,早年对VB比较熟悉过,所以VBA自然没啥问题,主要就是API的熟悉了。
实现方案:监控A1的变化,这需要用到Sub Worksheet_Change(ByVal Target As Range)这个内置的方法(事件),然后判断其address是否为A1,再根据值来做操作。本来是使用定位,但这样其它汽车信息也会显示出来,所以最终的方案是:第一行第一格即A1,放汽车品牌型号列表,然后冻结B1,这样第一行就不动了。当A1值变化时,将2-N行隐藏,这个N即所有数据将占据的行数。然后再把对应汽车品牌的参数信息所在行显示出来。这样,如果再加汽车品牌还是需要修改下VBA代码,但也比较简单了。
代码:
Const all As String = "a2:a500" '表示你所有的数据在2-500行,如果多的话可以自己修改 '这里要定义产品,如果新增产品,只需要改这里!!!!!!! Public s10 As String Public s20 As String Public s30 As String Public s40 As String Public s50 As String '上面有几个产品这里也要写几个!!!!!!! Private Sub initVar() s10 = "a2:a10" s20 = "a11:a20" s30 = "a21:a30" s40 = "a31:a40" s50 = "a41:a50" End Sub '=====================================以下的代码都不需要修改了================================= '用来隐藏指定范围行 Private Sub hideRow(rrng As String) Set rng = Range(rrng) rng.EntireRow.Hidden = True End Sub '用来显示指定范围行 Private Sub showRow(rrng As String) Set rng = Range(rrng) rng.EntireRow.Hidden = False End Sub '控制某个单元格数据变化来做相应的操作,这里是隐藏或显示指定行 Private Sub Worksheet_Change(ByVal Target As Range) On Error GoTo showmsg Call initVar If Target.Address = "$A$1" Then Call hideRow(all) Dim myRows As String myRows = CallByName(Me, Target.Value, VbGet) Call showRow(myRows) End If Exit Sub showmsg: MsgBox "可怜的程序不能处理您的操作,请检查数据!" End Sub