いらっしゃいませ、275997番目のお客様。  

実用(?)マクロ集

このページに含まれるプログラム、ファイル等については、

  1. 一応、著作権は放棄してません。転載等される方は私にご連絡ください。
  2. 内容については万全を期していますが、利用については自己責任でお願いします。いかなる損害にも責任を負いません。
  3. 動作確認は、(1)Windows 98+Excel 2000; (2)Windows XP+Excel 2002で行っています。
以上の点にご注意願います。


目次

  1. マクロボタン自動作成
  2. 押したツールボタンを取得する
  3. ファイルのあるフォルダを開く

Office VBAの部屋に戻る

マクロボタン自動作成(2001/9/21)

自分でいろいろマクロを作っていて、ボタンを作るのがめんどくさいことありませんか? かく言う私もそうなのですが、作った後にいちいちマクロの実行で呼び出すのが面倒くさい。 ボタンを作るのは良いけど、他のパソコンで使うときに使えないとか、新しいマクロを作ったときに またボタンを作らなくてはいけないのが面倒くさい。そう思いません??
私はこの解決方法として、

  1. ボタンを作るマクロを作る
  2. あらかじめ作っておいた表に項目を追加するだけで、マクロボタンを追加できる。
の点を重視してマクロを作ってみました。

プログラム

Sub MyFuncInit()
    Const FuncTable As String = "関数表!A1"
    Const TbarName As String = "MyToolBar"
    Const TpopName As String = "MyFunc"
    Const TbtnCap As Integer = 1
    Const TbtnAct As Integer = 2
    Dim Tbar As CommandBar
    Dim Tbtn As CommandBarButton
    Dim r As Range
    For Each Tbar In Application.CommandBars
        If Tbar.Name = TbarName Then Tbar.Delete
    Next Tbar
    Set Tbar = Application.CommandBars.Add(Name:=TbarName).Controls.Add(Type:=msoControlPopup).CommandBar
    With Tbar
        .Parent.Caption = TpopName
        For Each r In Range(FuncTable).CurrentRegion.Rows
            Set Tbtn = .Controls.Add(Type:=msoControlButton)
            With Tbtn
                .Style = msoButtonCaption
                .Caption = r.Columns(TbtnCap).Text
                .OnAction = r.Columns(TbtnAct).Text
            End With
        Next r
        .Parent.Parent.Visible = True
    End With
End Sub

「関数表」と言うシートを作成して、A1を含む表の一桁目(A)にマクロの説明を、 二桁目(B)にマクロの名前を記入してこのマクロを実行するだけで、 自動的にボタンを作ってくれます。


目次に戻る

押したツールボタンを取得する(2001/10/27)

あるマクロを起動するツールボタンを作るマクロ作ったときに、不正終了するたびにツールボタンが増えていってしまうことがありました。押したボタンが今作ったボタンなのか、不正終了したときに出来たボタンなのか調べて、不要なボタンなら削除することを考えて、しばらく関数を探していました。

プログラム

Option Explicit

Public Btn As CommandBarButton

'ボタンの作成
Public Sub Init()
    Set Btn = CommandBars(1).Controls.Add(msoControlButton)
    With Btn
        .OnAction = "Test"
        .Style = msoButtonCaption
        .Caption = "Click!"
    End With
End Sub

'ボタンが押されたらそのボタンが現在作ったボタン(btn)かどうか確認する。
Public Sub Test()
    If isActiveButton(Btn) = False Then
        MsgBox "アクティブではありませんでした。" '非アクティブ時の処理
    End If
    MsgBox "OK" ' 本来の処理
End Sub

'ボタンの重複チェック。同じボタンだったら、Trueを返す。
'ActivateがTrue(既定)の場合、違うボタンの場合は削除して、現在のボタンをBtnに設定し、
'Btnが存在しない場合も現在のボタンをBtnに設定する。
'Activateが
Private Function isActiveButton(Btn As CommandBarButton, Optional Activate As Boolean = True) As Boolean
    Dim ActBtn As CommandBarButton
    Set ActBtn = CommandBars.ActionControl
    If Not Btn Is Nothing Then
        If Not (Btn.Parent.Index = ActBtn.Parent.Index And Btn.Index = ActBtn.Index) Then
            If Activate Then
                Btn.Delete
                Set Btn = ActBtn
            End If
            isActiveButton = False
        Else
            isActiveButton = True
        End If
    Else
        If Activate Then Set Btn = ActBtn
        isActiveButton = False
    End If
End Function

ActiveControlというプロパティがありました。クリックしたボタンを返します。残念ながら、クリックしたボタンは削除することが出来ませんが、逆に現在btnとして参照しているボタンのほうを削除することでボタンの数を減らすことが出来ました。マクロ用のボタンを作ろうとしている方は参考にしてみてください。


目次に戻る

ファイルのあるフォルダを開く(2002/1/18)

プログラム

'   関数名:OpenFileFolder
'   引数:  なし
'   説明:  現在使用しているファイルのあるフォルダをExplorerで開きます。
'
Sub OpenFileFolder()
    Shell "explorer.exe """ & ActiveWorkbook.Path & """", vbNormalFocus
End Sub

説明
現在のファイル(ActiveWorkbook)のあるフォルダを表示します。Shell関数を使ってExplorerを立ち上げるだけの他愛もないプログラムですが、非常に重宝しています。ちなみにActiveWorkbookをActiveDocumentにするとWordで動作するVBAとなります。


目次に戻る

にゃま夫のへや   ・Office VBA   ・おもちゃ箱   ・iαppli
ホームページに戻る。
無断転載を禁じます。
にゃま夫