「Excel補助マクロ」

発端

ばっちりさんのツイで、凄く昔に作った補助マクロ(VBA)の存在を思い出したのです。

で、折角だから公開してみようかと。

概要

下図にあるように、複数の機能をアドインするようになってます。

最初に作ったのは2000年前後で、機能をあれこれ足しながら使ってた記憶があるのですが、手元に残ってるのは2003年の日付になってました。

f:id:wd4096:20200530103047p:plain

 

コード

凄く昔のコードなので結構汚いと思うのです。

「AddInとしてメニューに追加する」コード、「実際に動作するコード」、ユーザーフォームで動作するコード×2で構成されます。

しかも、ぬるいことに、当時はモジュール名を変更する癖がついてなかったようです。おぬるいですね。

Module1

Option Explicit

Public Const cst_cbarMainMenu = "EXCEL補助マクロ"

Public Const cst_cbarMacro1 = "先頭へ(&1)"
Public Const cst_cbarMacro2 = "最後尾へ(&2)"
Public Const cst_cbarMacro3 = "小文字へ(&3)"
Public Const cst_cbarMacro4 = "大文字へ(&4)"
Public Const cst_cbarMacro5 = "半角へ(&5)"
Public Const cst_cbarMacro6 = "全角へ(&6)"
Public Const cst_cbarMacro7 = "文字数(&7)"
Public Const cst_cbarMacro8 = "バイト数(&8)"
Public Const cst_cbarMacro9 = "重複チェック(&9)"
Public Const cst_cbarMacro0 = "シート削除(&0)"
Public Const cst_cbarMacroQ = "再採番(&Q)"
Public Const cst_cbarMacroS = "シート移動(&S)"
Public Const cst_cbarMacroU = "&UnInstall"

Public Const cst_cbarOnAction1 = "GoTop"
Public Const cst_cbarOnAction2 = "GoBottom"
Public Const cst_cbarOnAction3 = "ToLower"
Public Const cst_cbarOnAction4 = "ToUpper"
Public Const cst_cbarOnAction5 = "ToASC"
Public Const cst_cbarOnAction6 = "ToJIS"
Public Const cst_cbarOnAction7 = "DispLen"
Public Const cst_cbarOnAction8 = "DispLenB"
Public Const cst_cbarOnAction9 = "CheckDupe"
Public Const cst_cbarOnAction0 = "SheetDel"
Public Const cst_cbarOnActionQ = "ReNumber"
Public Const cst_cbarOnActionS = "SheetJump"
Public Const cst_cbarOnActionU = "ExcelAssist_AddinUninstall"

Sub GoTop()
    Sheets(1).Activate
End Sub

Sub GoBottom()
'変数定義
    Dim nSheets As Long
'--------------------------------------------------------------------------------
    'シートの最後尾を取得
    nSheets = Sheets.Count
    
    'シートの最後尾に移動
    Sheets(nSheets).Activate
End Sub

Sub ToLower()
'小文字へ変換
'--------------------------------------------------------------------------------
'変数定義
    Dim sTemp   As String
    Dim oRange  As Range
'--------------------------------------------------------------------------------
    For Each oRange In Selection
        sTemp = oRange.Text
        sTemp = StrConv(sTemp, vbLowerCase)
        oRange.Value = sTemp
    Next
End Sub
Sub ToUpper()
'大文字へ変換
'--------------------------------------------------------------------------------
'変数定義
    Dim sTemp   As String
    Dim oRange  As Range
'--------------------------------------------------------------------------------
    For Each oRange In Selection
        sTemp = oRange.Text
        sTemp = StrConv(sTemp, vbUpperCase)
        oRange.Value = sTemp
    Next
End Sub
Sub ToASC()
'半角へ変換
'--------------------------------------------------------------------------------
'変数定義
    Dim sTemp   As String
    Dim oRange  As Range
'--------------------------------------------------------------------------------
    For Each oRange In Selection
        sTemp = oRange.Text
        sTemp = StrConv(sTemp, vbNarrow)
        oRange.Value = sTemp
    Next
End Sub
Sub ToJIS()
'全角へ変換
'--------------------------------------------------------------------------------
'変数定義
    Dim sTemp   As String
    Dim oRange  As Range
'--------------------------------------------------------------------------------
    For Each oRange In Selection
        sTemp = oRange.Text
        sTemp = StrConv(sTemp, vbWide)
        oRange.Value = sTemp
    Next
End Sub

Sub DispLen()
'指定範囲の文字数合算を表示
'--------------------------------------------------------------------------------
'変数定義
    Dim nLen    As Long
    Dim nSum    As Long
    Dim nMax    As Long
    Dim sTemp   As String
    Dim oRange  As Range
'--------------------------------------------------------------------------------
    nSum = 0
    nMax = 0
    For Each oRange In Selection
        sTemp = oRange.Text
        nLen = Len(sTemp)
        If nLen > nMax Then
            nMax = nLen
        End If
        nSum = nSum + nLen
    Next
    Call MyDisp("文字数合計=" & CStr(nSum) & Chr(13) & "文字数最大=" & CStr(nMax))
End Sub
Sub DispLenB()
'指定範囲の文字バイト数合算を表示
'--------------------------------------------------------------------------------
'変数定義
    Dim nLen    As Long
    Dim nSum    As Long
    Dim nMax    As Long
    Dim sTemp   As String
    Dim oRange  As Range
'--------------------------------------------------------------------------------
    nSum = 0
    nMax = 0
    For Each oRange In Selection
        sTemp = oRange.Text
        nLen = LenB(sTemp)
        If nLen > nMax Then
            nMax = nLen
        End If
        nSum = nSum + nLen
    Next
    Call MyDisp("バイト数合計=" & CStr(nSum) & Chr(13) & "バイト数最大=" & CStr(nMax))
End Sub

Sub CheckDupe()
'重複チェック
'--------------------------------------------------------------------------------
'変数定義
    Dim sTemp   As String
    Dim sTemp2  As String
    Dim oRange  As Range
    Dim oRange2 As Range
    Dim nCnt    As Long
    Dim sResult As String
    Dim bFlag   As Boolean
'--------------------------------------------------------------------------------
    bFlag = False
    sResult = ""
    For Each oRange In Selection
        sTemp = oRange.Text
        
        'ブランク文字列の場合重複判定は省略
        If sTemp <> "" Then
            nCnt = 0
            For Each oRange2 In Selection
                sTemp2 = oRange2.Text
                If sTemp = sTemp2 Then
                    nCnt = nCnt + 1
                End If
            Next
            If nCnt > 1 Then
                sResult = sResult & "、" & sTemp
                bFlag = True
            End If
        End If
    Next
    
    If bFlag = True Then
        Call MyDisp("重複文字列:" & Chr(13) & Mid(sResult, 2))
    Else
        Call MyDisp("重複文字列はありませんでした")
    End If
End Sub

Sub SheetDel()
    '現在のシートを削除する
    ActiveSheet.Delete
End Sub

Sub ReNumber()
'--------------------------------------------------------------------------------
'再採番
'--------------------------------------------------------------------------------
'変数定義
    Dim sTemp   As String
    Dim sChar   As String
    Dim sHeader As String
    Dim sSEQ    As String
    Dim sFooter As String
    Dim oRange  As Range
    Dim nCnt    As Long
    Dim nPos    As Long
    
    Dim bFlag   As Boolean
'--------------------------------------------------------------------------------
    bFlag = False
    
    For Each oRange In Selection
        sTemp = oRange.Text
        If sTemp <> "" Then
            If bFlag = True Then
                nCnt = nCnt + 1
                sTemp = sHeader & Trim(CStr(nCnt)) & sFooter
                oRange.Value = sTemp
            Else
                nCnt = 0
                sHeader = ""
                sSEQ = ""
                sFooter = ""
                nPos = Len(sTemp)
                
                'フッタ作成
                Do Until nPos = 0
                    sChar = Mid(sTemp, nPos, 1)
                    If IsNumeric(sChar) = True Then
                        Exit Do
                    End If
                    sFooter = sChar & sFooter
                    nPos = nPos - 1
                Loop
                
                '連番初期値取得
                Do Until nPos = 0
                    sChar = Mid(sTemp, nPos, 1)
                    If IsNumeric(sChar) = False Then
                        Exit Do
                    End If
                    sSEQ = sChar & sSEQ
                    nPos = nPos - 1
                Loop
                
                '連番が有効なら採番開始
                If sSEQ <> "" Then
                    bFlag = True
                    nCnt = CLng(sSEQ)
                    
                    'ヘッダ取得
                    If nPos > 0 Then
                        sHeader = Left(sTemp, nPos)
                    End If
                End If
            End If
        End If
    Next
End Sub

Sub SheetJump()
    frmSheets.Show
End Sub

Private Sub MyDisp(strMessage As String)
'メッセージ表示
    frmDisp.txtMessage.Text = strMessage
    frmDisp.Show
    frmDisp.Repaint
    DoEvents
End Sub

'アドインメニューが存在するか確認
Public Function bExistThisAddinMenu(strMacro As String) As Boolean
    On Error Resume Next
    bExistThisAddinMenu = True
    If Application.CommandBars(cst_cbarMainMenu).Controls.Count = 0 Then
        bExistThisAddinMenu = False
'        If Application.CommandBars(cst_cbarMainMenu).Controls(strMacro).Caption = "" Then
'            '存在しない場合、RESUME NEXTにより下の文が実行される
'            bExistThisAddinMenu = False
'        End If
    End If
End Function


'アドインのアンインストール
Sub ExcelAssist_AddinUninstall()
    Dim ain As AddIn
    
    'メニューバー消去
    Application.CommandBars(cst_cbarMainMenu).Delete
    For Each ain In Application.AddIns
        If ain.Name = cst_cbarMainMenu & ".xla" Then
            ain.Installed = False
            Exit For
        End If
    Next ain
End Sub

Public Function InstallAddin(strPath As String)
'アドインインストール
'変数定義
    Dim ain     As AddIn
    Dim bFlag   As Boolean
    Dim sAddin  As String
'--------------------------------------------------------------------------------
    'アドインへのパスを取得
    sAddin = Left(strPath, Len(strPath) - 3) & "xla"
    InstallAddin = sAddin
    
    'アドインリストに乗っているかチェック
    bFlag = False
    For Each ain In Application.AddIns
        If ain.Name = cst_cbarMainMenu & ".xla" Then
            ain.Installed = True
            bFlag = True
            Exit For
        End If
    Next ain
    
    'アドインリストに乗っていれば終了
    If bFlag = True Then Exit Function
    
    'アドインリストに新しく追加する
    Application.AddIns.Add sAddin
    For Each ain In Application.AddIns
        If ain.Name = cst_cbarMainMenu & ".xla" Then
            ain.Installed = True
            Exit For
        End If
    Next ain
End Function


Public Function WhoAmI() As String
'変数定義
    Dim ThisBook As String          '現在のブック名称
'--------------------------------------------------------------------------------
    '自分自身のブック名を取得する
    ThisBook = Sheets(1).Application.ActiveWindow.Caption
    
    '戻り値の設定
    WhoAmI = ThisBook
End Function

Public Sub Auto_Remove()

End Sub

Sheel1

Option Explicit

Private Sub CommandButton1_Click()
'変数定義
    Dim vRet    As Variant
    Dim sAddin  As String
'--------------------------------------------------------------------------------
    'アドインのインストール
    sAddin = InstallAddin(Application.ThisWorkbook.Path & "\" & WhoAmI)
    
    'メニューバーの追加
    If bExistThisAddinMenu(cst_cbarMacro1) Then
        vRet = MsgBox("すでにメニューは存在します。上書きしますか?", vbYesNo)
        If vRet = vbYes Then
            Call ExcelAssist_AddinUninstall
        Else
            Exit Sub
        End If
    End If
    Call Application.CommandBars.Add(cst_cbarMainMenu, msoBarTop)
    Application.CommandBars(cst_cbarMainMenu).Visible = True
    With Application.CommandBars(cst_cbarMainMenu)
        
        With .Controls.Add
            .Style = msoButtonCaption
            .Caption = cst_cbarMacro1
            .OnAction = sAddin & "!" & cst_cbarOnAction1
        End With
        With .Controls.Add
            .Style = msoButtonCaption
            .Caption = cst_cbarMacro2
            .OnAction = sAddin & "!" & cst_cbarOnAction2
        End With
        With .Controls.Add
            .Style = msoButtonCaption
            .Caption = cst_cbarMacro3
            .OnAction = sAddin & "!" & cst_cbarOnAction3
        End With
        With .Controls.Add
            .Style = msoButtonCaption
            .Caption = cst_cbarMacro4
            .OnAction = sAddin & "!" & cst_cbarOnAction4
        End With
        With .Controls.Add
            .Style = msoButtonCaption
            .Caption = cst_cbarMacro5
            .OnAction = sAddin & "!" & cst_cbarOnAction5
        End With
        With .Controls.Add
            .Style = msoButtonCaption
            .Caption = cst_cbarMacro6
            .OnAction = sAddin & "!" & cst_cbarOnAction6
        End With
        With .Controls.Add
            .Style = msoButtonCaption
            .Caption = cst_cbarMacro7
            .OnAction = sAddin & "!" & cst_cbarOnAction7
        End With
        With .Controls.Add
            .Style = msoButtonCaption
            .Caption = cst_cbarMacro8
            .OnAction = sAddin & "!" & cst_cbarOnAction8
        End With
        With .Controls.Add
            .Style = msoButtonCaption
            .Caption = cst_cbarMacro9
            .OnAction = sAddin & "!" & cst_cbarOnAction9
        End With
        With .Controls.Add
            .Style = msoButtonCaption
            .Caption = cst_cbarMacro0
            .OnAction = sAddin & "!" & cst_cbarOnAction0
        End With
        With .Controls.Add
            .Style = msoButtonCaption
            .Caption = cst_cbarMacroQ
            .OnAction = sAddin & "!" & cst_cbarOnActionQ
        End With
        With .Controls.Add
            .Style = msoButtonCaption
            .Caption = cst_cbarMacroS
            .OnAction = sAddin & "!" & cst_cbarOnActionS
        End With
        With .Controls.Add
            .Style = msoButtonCaption
            .Caption = cst_cbarMacroU
            .OnAction = sAddin & "!" & cst_cbarOnActionU
        End With
    End With
    'メニューバー表示
    Application.AddIns(cst_cbarMainMenu).Installed = True
End Sub

frmDisp

f:id:wd4096:20200530104202p:plain

Option Explicit

Private Sub cmdExit_Click()
    Unload Me
End Sub

frmSelect

f:id:wd4096:20200530103944p:plain

Private Sub cmdClose_Click()
    Unload Me
End Sub

Private Sub lstSheets_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    ActiveWorkbook.Sheets(lstSheets.Text).Activate
    Unload Me
End Sub

Private Sub lstSheets_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    Select Case KeyAscii
        Case vbKeyReturn
            ActiveWorkbook.Sheets(lstSheets.Text).Activate
            Unload Me
        Case vbKeyEscape
            Unload Me
    End Select
End Sub
Private Sub UserForm_Initialize()
    Dim objSheet As Object
    
    For Each objSheet In ActiveWorkbook.Sheets
        lstSheets.AddItem (objSheet.Name)
    Next
    lstSheets.ListIndex = 0
End Sub

Private Sub UserForm_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    If KeyAscii = vbKeyEscape Then
        Unload Me
    End If
End Sub

最後に

そういえば最近は全然使ってなかったりいじってなかったりします。

個人用マクロブック使ってる方も多いようですし、今更感はありますが、勤務先でも導入して流行らせてみましょうかね。

とか、考えてみたり。