zoukankan      html  css  js  c++  java
  • 通过VBA自定义向Excel添加工具栏

    Office由于提供了VBA,为大家开发一些定制功能提供了一种途径。但是如何实现工具栏中的命令与宏进行绑定,对于初学则来说是一个不小的门槛。

         今天,给大家介绍一下在Excel里写完宏后,如何通过宏自动生成工具栏。

    如图:

    工具栏

    在VBA中将要用到CommandBar,CommandBarButton两个对象。

    Option Explicit

    '定义全局变量

    Private zyi_Bar As CommandBar
    Private zyi_ComBarBtn  As CommandBarButton

    '-------------------------------------------------------------------------------------------------------------

    '增加工具栏

    '-------------------------------------------------------------------------------------------------------------

    Sub AddToolBar()
    '
    '

    '
     '   Application.CommandBars.Add(Name:="zy").Visible = True
     
    Dim strBarName As String
    Dim strParam As String
    Dim strCaption As String
    Dim strCommand As String
    Dim nIndex As Integer
    Dim nFaceId As Integer

    Dim cBar As CommandBar

    strBarName = "ZYI_TOOL"


    For Each cBar In Application.CommandBars
        If cBar.Name = strBarName Then
            Set zyi_Bar = cBar
            GoTo 20
        End If
    Next

    'On Error GoTo 10
    'Set zyi_Bar = Application.CommandBars(strBarName)
    'If zyi_Bar.Name = strBarName Then
    '  GoTo 20    '已经存在
    '  zyi_Bar.Delete
    'End If

    '10:

    On Error GoTo 100


    Set zyi_Bar = Application.CommandBars.Add(Name:=strBarName)

    20:
    zyi_Bar.Visible = True

    On Error GoTo 100

    '-----------------------------------------------------------
    '1. 复制工作表


    nIndex = 1
    strCaption = "复制工作表"
    strParam = "复制工作表的单元格内容及格式!"
    strCommand = "复制工作表"
    nFaceId = 271
    If zyi_Bar.Controls.Count < nIndex Then
       AddComBarBtn strParam, strCaption, strCommand, nIndex, nFaceId
    ElseIf zyi_Bar.Controls(nIndex).Caption <> strCaption Then
        AddComBarBtn strParam, strCaption, strCommand, nIndex, nFaceId
    End If

    '-----------------------------------------------------------
    '2. 合并单元格


    nIndex = 2
    strCaption = "合并单元格"
    strParam = "合并单元格以及居中"
    strCommand = "合并单元格"
    nFaceId = 29
    If zyi_Bar.Controls.Count < nIndex Then
       AddComBarBtn strParam, strCaption, strCommand, nIndex, nFaceId
    ElseIf zyi_Bar.Controls(nIndex).Caption <> strCaption Then
        AddComBarBtn strParam, strCaption, strCommand, nIndex, nFaceId
    End If
       

    '-----------------------------------------------------------
    '3. 居中


    nIndex = 3
    strCaption = "居中"
    strParam = "水平垂直居中"
    strCommand = "居中单元格"
    nFaceId = 482
    If zyi_Bar.Controls.Count < nIndex Then
       AddComBarBtn strParam, strCaption, strCommand, nIndex, nFaceId
    ElseIf zyi_Bar.Controls(nIndex).Caption <> strCaption Then
        AddComBarBtn strParam, strCaption, strCommand, nIndex, nFaceId
    End If

    '-----------------------------------------------------------

    '4. 货币


    nIndex = 4
    strCaption = "货币"
    strParam = "货币"
    strCommand = "货币"
    nFaceId = 272
    If zyi_Bar.Controls.Count < nIndex Then
       AddComBarBtn strParam, strCaption, strCommand, nIndex, nFaceId
    ElseIf zyi_Bar.Controls(nIndex).Caption <> strCaption Then
        AddComBarBtn strParam, strCaption, strCommand, nIndex, nFaceId
    End If

    '-----------------------------------------------------------
    '5. 将货币数字转换为大写


    nIndex = 5
    strCaption = "删除列"
    strParam = "删除列"
    '宏名称
    strCommand = "删除列"
    nFaceId = 1668
    If zyi_Bar.Controls.Count < nIndex Then
       AddComBarBtn strParam, strCaption, strCommand, nIndex, nFaceId
    ElseIf zyi_Bar.Controls(nIndex).Caption <> strCaption Then
        AddComBarBtn strParam, strCaption, strCommand, nIndex, nFaceId
    End If

    nIndex = nIndex + 1
    While nIndex < zyi_Bar.Controls.Count
        zyi_Bar.Controls(nIndex).Delete
    Wend

    '-----------------------------------------------------------

    '6. 分割条
    zyi_Bar.Controls(zyi_Bar.Controls.Count).BeginGroup = True

    '-----------------------------------------------------------

    '7. 将货币数字转换为大写


    nIndex = 6
    strCaption = "人民币"
    strParam = "人民币由数字转换为大写"

    '宏名称
    strCommand = "To大写人民币"
    nFaceId = 384
    If zyi_Bar.Controls.Count < nIndex Then
       AddComBarBtn strParam, strCaption, strCommand, nIndex, nFaceId
    ElseIf zyi_Bar.Controls(nIndex).Caption <> strCaption Then
        AddComBarBtn strParam, strCaption, strCommand, nIndex, nFaceId
    End If

    nIndex = nIndex + 1
    While nIndex < zyi_Bar.Controls.Count
        zyi_Bar.Controls(nIndex).Delete
    Wend

    '-----------------------------------------------------------

    '9. 分割条
    zyi_Bar.Controls(zyi_Bar.Controls.Count).BeginGroup = True

    100:

    End Sub

    '-------------------------------------------------------------------------------------------------------------

    '向工具栏动态添加按钮

    '-------------------------------------------------------------------------------------------------------------

    Sub AddComBarBtn(strParam As String, strCaption As String, strCommand As String, nIndex As Integer, nFaceId As Integer)
    '
    Set zyi_ComBarBtn = zyi_Bar.Controls.Add( _
            ID:=1, _
            Parameter:=strParam, _
            Before:=nIndex, _
            Temporary:=True)
           
    With zyi_ComBarBtn
        .Caption = strCaption
        .Visible = True
        .OnAction = strCommand
        .FaceId = nFaceId
    End With

    End Sub

    通过以上两个函数,就可以实现自动添加工具栏及按钮。

    剩下将在Workbook_Open函数里调用AddToolBar,即可实现文件打开就会显示工具栏。如果仅作为工具存放,则可以把该文件保存为模版文件,即xxx.xla。

    Private Sub Workbook_Open()


    '   MsgBox "欢迎使用Excel", vbInformation + vbOKOnly, "增强工具"
        Application.StatusBar = "欢迎使用增强工具:zyi"
       

       '显示工具栏
        AddToolBar


    End Sub

    到此,一个来工具栏的宏大功告成了。

  • 相关阅读:
    【bzoj3158】千钧一发 最小割
    【bzoj2186】[Sdoi2008]沙拉公主的困惑 欧拉函数
    【bzoj1221】[HNOI2001] 软件开发 费用流
    【bzoj4176】Lucas的数论 莫比乌斯反演+杜教筛
    【bzoj4916】神犇和蒟蒻 杜教筛
    【bzoj3944/bzoj4805】Sum/欧拉函数求和 杜教筛
    【bzoj4869】[Shoi2017]相逢是问候 扩展欧拉定理+并查集+树状数组
    【bzoj3926】[Zjoi2015]诸神眷顾的幻想乡 广义后缀自动机
    【bzoj2555】SubString 后缀自动机+LCT
    【bzoj3277/bzoj3473】串/字符串 广义后缀自动机
  • 原文地址:https://www.cnblogs.com/top5/p/1450126.html
Copyright © 2011-2022 走看看