`
lydawen
  • 浏览: 464698 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

久违的VBA

 
阅读更多

一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
 
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics