VBAの勉強を始めてみた

色々試しています。

選択範囲の金額を千円単位にする(四捨五入版)

タイトルのとおり選択範囲の金額を千円単位に変換し、小数点以下を四捨五入します。
ちなみに、下記のコードでは小数点以下を四捨五入ますが、小数点以下を切り上げたり切り捨てしたい場合もあると思いますのでそっちのバージョンも作ってみました。コード後のリンクから飛べます。


***************************************
Sub 選択範囲の金額を千円単位にする四捨五入版()
   
    Dim myRange As Range

    For Each myRange In Selection
        If myRange.Value <> 0 And myRange.Value <> "" And _
        TypeName(myRange.Value) <> "String" And TypeName(myRange.Value) <> "Date" Then
        'セルの値が0,空白,文字列,日付のいづれかの場合は処理をしない
            myRange.Value = Round(myRange.Value / 1000, 0)    '小数点以下は四捨五入
        End If
    Next myRange
   
End Sub
***************************************

 ※SubからEnd Subまでをコピペしてマクロを使用できます。使用の際は自己責任でお願いいたします。

 

切り捨て版はこちら 

kouten0430.hatenablog.com

 

 切り上げ版はこち

kouten0430.hatenablog.com

選択範囲の金額を千円単位にする(切り捨て版)

タイトルのとおり選択範囲の金額を千円単位に変換し、小数点以下を切り捨てします。
ちなみに、下記のコードでは小数点以下を切り捨てますが、小数点以下を切り上げたり四捨五入したい場合もあると思いますのでそっちのバージョンも作ってみました。コード後のリンクから飛べます。


***************************************
Sub 選択範囲の金額を千円単位にする切り捨て版()
   
    Dim myRange As Range

    For Each myRange In Selection
        If myRange.Value <> 0 And myRange.Value <> "" And _
        TypeName(myRange.Value) <> "String" And TypeName(myRange.Value) <> "Date" Then
        'セルの値が0,空白,文字列,日付のいづれかの場合は処理をしない
            myRange.Value = Application.RoundDown(myRange.Value / 1000, 0)    '小数点以下は切り捨て
        End If
    Next myRange
   
End Sub
***************************************

 ※SubからEnd Subまでをコピペしてマクロを使用できます。使用の際は自己責任でお願いいたします。

 

切り上げ版はこち

kouten0430.hatenablog.com

 

四捨五入版はこち

kouten0430.hatenablog.com

選択範囲の金額を千円単位にする(切り上げ版)

タイトルのとおり選択範囲の金額を千円単位に変換し、小数点以下を切り上げします。以前に掲載した内容と重複しますが前回のコードでは下の画像のような飛び飛びのセル選択に対して正しく処理ができなかったためFor Each Nextでコードを書き直しました。

f:id:kouten0430:20170630230715j:plain


前回のコードはこち

kouten0430.hatenablog.com

 

ちなみに、下記のコードでは小数点以下を切り上げますが、小数点以下を切り捨てたり四捨五入したい場合もあると思いますのでそっちのバージョンも用意してみました。コード後のリンクから飛べます。


***************************************
Sub 選択範囲の金額を千円単位にする切り上げ版()
   
    Dim myRange As Range

    For Each myRange In Selection
        If myRange.Value <> 0 And myRange.Value <> "" And _
        TypeName(myRange.Value) <> "String" And TypeName(myRange.Value) <> "Date" Then
        'セルの値が0,空白,文字列,日付のいづれかの場合は処理をしない
            myRange.Value = Application.RoundUp(myRange.Value / 1000, 0)    '小数点以下は切り上げ
        End If
    Next myRange
   
End Sub
***************************************

 ※SubからEnd Subまでをコピペしてマクロを使用できます。使用の際は自己責任でお願いいたします。

 

切り捨て版はこち

kouten0430.hatenablog.com

 

四捨五入版はこち

kouten0430.hatenablog.com

指定した文字のみ色を変える

ある特定の文字のみ色を変えるマクロです。たとえば下のような「松島」という文字のみ色を変えたい場合に・・・・・・

f:id:kouten0430:20170626224050j:plain

色を変更したい文字が入ったセル範囲を選択した状態で、マクロを実行して下さい。

f:id:kouten0430:20170626224137j:plain

 

ちなみに、非表示やフィルタリングによって折りたたまれたセルには処理を行いません。(可視セルにのみ処理を行う)

 

***************************************
Sub 指定した文字の色を変える()
    Dim sm As Variant
    Dim ci As Variant
    Dim r As Range
    Dim i As Integer

smr:
    sm = Application.InputBox(Prompt:="色を変える文字を指定して下さい", Type:=2)
        If TypeName(sm) = "Boolean" Then
            Exit Sub
        ElseIf sm = "" Then
            GoTo smr
        End If
cir:
    ci = Application.InputBox(Prompt:="色を選んで下さい" _
    & vbCrLf & "1:黒" & vbCrLf & "2:白" & vbCrLf & "3:赤" & vbCrLf & _
    "4:明るい緑" & vbCrLf & "5:青" & vbCrLf & "6:黄色" & vbCrLf & _
    "7:ピンク" & vbCrLf & "8:水色" & vbCrLf & "9:明るい赤" & vbCrLf & _
    "10:緑" & vbCrLf & "(11以降の色番号はVBAのヘルプ等で確認下さい)", Type:=1)
        If TypeName(ci) = "Boolean" Then
            Exit Sub
        ElseIf ci < 1 Or ci > 56 Then
            MsgBox "1~56の数値で入力して下さい"
            GoTo cir
        End If

    For Each r In Selection.SpecialCells(xlCellTypeVisible)
   
        i = 1
   
        Do While i <= Len(r)
            If InStr(i, r, sm) > 0 Then
                r.Characters(InStr(i, r, sm), Len(sm)) _
                .Font.ColorIndex = ci
           
                i = InStr(i, r, sm) + Len(sm)
            Else
                Exit Do '永久ループを回避
            End If
        Loop
    Next r
End Sub
***************************************

 ※SubからEnd Subまでをコピペしてマクロを使用できます。使用の際は自己責任でお願いいたします。

コマンドバーのリスト表示

以下はコマンドバー(コマンドバーコントロールの上位階層にあたるもの)の一覧をリスト表示するコードです。マイクロソフトのヘルプページにあるものです(使い勝手のいいよう少し改良しました)。

 

***************************************
  Sub GetCommandbarInfo()
      Dim AppCmdBar As CommandBar
      Dim i As Integer
      i = 0
      For Each AppCmdBar In Application.CommandBars
          i = i + 1
          'インデックス番号の取得
          Cells(i, 1) = AppCmdBar.Index
          'コマンドバーの名前の取得
          Cells(i, 2) = AppCmdBar.Name
          'コマンドバーの種類の取得
          Select Case AppCmdBar.Type
          Case 0
              Cells(i, 3) = "msoBarTypeNomal"
          Case 1
              Cells(i, 3) = "msoBarTypeMenuBar"
          Case 2
              Cells(i, 3) = "msoBarTypePopup"
          End Select
      Next AppCmdBar
  End Sub
***************************************

 ※SubからEnd Subまでをコピペしてマクロを使用できます。使用の際は自己責任でお願いいたします。

コマンドバーコントロール(Cell)のリスト表示

右クリック時のショートカットメニューにマクロを登録する際、上から何番目にメニューを配置するか指定できますが、EXCELの標準で隠されたメニューなどがあるため、正しい順番が分からないことがあります。
その際には下記のマクロで右クリック(Cell用)ショートカットメニューのすべてをリスト表示することができます。これはマイクロソフトのヘルプページにあるコマンドバーのリスト化のマクロをCell用に改良したものです。実行すると、A1~C1列にリストが表示されるので、何もない空白のSheetなどで実行してください。


***************************************
  Sub Cell用コマンドバーコントロールの情報を取得()
      Dim i As Integer
     
      For i = 1 To Application.CommandBars("Cell").Controls.Count
          'インデックス番号の取得
          Cells(i, 1) = Application.CommandBars("Cell").Controls(i).Index
          'Cell用コマンドバーコントロールの名前の取得
          Cells(i, 2) = Application.CommandBars("Cell").Controls(i).Caption
          'Cell用コマンドバーコントロールの種類の取得
          Select Case Application.CommandBars("Cell").Controls(i).Type
          Case 1
              Cells(i, 3) = "msoControlButton"
          Case 10
              Cells(i, 3) = "msoControlPopup"
          End Select
      Next
  End Sub
***************************************

 ※SubからEnd Subまでをコピペしてマクロを使用できます。使用の際は自己責任でお願いいたします。

 

以下の記事にオリジナルのコードを紹介しています。

 

kouten0430.hatenablog.com

 

右クリックショートカットメニューにマクロを登録

f:id:kouten0430:20170615151507j:plain

こんな感じで、右クリックした時のショートカットメニューにマクロを登録できたらいいなと思ったので、下記のようなマクロを作ってみました。対話形式で好きなマクロを右クリックのショートカットメニューに登録することができます。失敗してもリセットし、初期状態に戻せるようになっているので怖がらずに試してみて下さい。このマクロのカラクリについては後日改めて記載してみたいと思います。

使用する前に以下の点に目を通していただけると幸いです。
・単一のセルまたはセル範囲を選択している状態で右クリックした時のメニューを追加できます。
・列または行を選択している時の右クリックメニューには追加されません。
・特別な設定等をされているBook(Sheet)では使用できない場合があります。
・ショートカットメニューに登録するマクロは「個人用マクロブック」にあるといつでも呼び出せるので便利です。
・メニューやサブメニューを削除する際、存在しない名称を記入したり、名称を間違えるとエラーとなります。
・サブメニューを作成する際、上位階層のメニュー名に存在しない名称を記入したり、名称を間違えるとエラーとなります。
・登録するマクロ名は、Sub マクロ1 ()の「マクロ1」の部分を入力して下さい。
・マクロ名を間違えたり、存在しないマクロ名を入力すると、メニューからマクロを起動する際にエラーになります。
・マクロ名を間違えた場合は、該当のメニューまたはサブメニューを削除して再度追加し直して下さい。
・サブメニューを作成できるのは第二階層までです。第三階層以降の作成には対応していません。
・下記のマクロは保存しなくても、追加したショートカットメニューが消えることはありません。追加、削除、リセットはマクロからのみ行えます。


***************************************
Sub 右クリックショートカットメニューにマクロを登録()
    'このマクロ自体をメニューまたはサブメニューから呼び出している場合は、該当のメニューまたはサブメニューの削除はできません
   
    Dim sn As Variant
    Dim ct As Variant
    Dim bf As Variant
    Dim oa As Variant
    Dim bg As Variant
    Dim cts As Variant
    Dim myButton As CommandBarButton
    Dim myPopup As CommandBarPopup
   
    sn = Application.InputBox(Prompt:="処理内容を選択して下さい" & vbCrLf & "1:メニューの追加" & _
    vbCrLf & "2:サブメニューを含むメニューの追加" & vbCrLf & "3:サブメニューの追加" & vbCrLf & _
    "4:メニューの削除" & vbCrLf & "5:サブメニューの削除" & vbCrLf & "6:初期状態に戻す(リセット)", Type:=1)
        Select Case sn
       
        Case 1
ctr:
            ct = Application.InputBox(Prompt:="メニュー名を入力して下さい", Type:=2)
                If TypeName(ct) = "Boolean" Then
                    Exit Sub
                ElseIf ct = "" Then
                    GoTo ctr
                End If
oar:
            oa = Application.InputBox(Prompt:="メニューに登録するマクロ名を入力して下さい", Type:=2)
                If TypeName(oa) = "Boolean" Then
                    Exit Sub
                ElseIf oa = "" Then
                    GoTo oar
                End If
bfr:
            bf = Application.InputBox(Prompt:="メニューを上から何番目に配置しますか?(0で末尾)", Type:=1)
                If TypeName(bf) = "Boolean" Then
                    Exit Sub
                ElseIf bf = 0 Then
                    Set myButton = CommandBars("Cell").Controls.Add
                ElseIf bf >= 1 And bf <= CommandBars("Cell").Controls.Count Then
                    Set myButton = CommandBars("Cell").Controls.Add(Before:=bf) 'Before:=で配置位置を指定する。省略で末尾に配置
                Else
                    MsgBox "0~" & CommandBars("Cell").Controls.Count & "の数値で入力して下さい"
                    GoTo bfr
                End If
            myButton.Caption = ct '追加するメニュー名を入力
            myButton.OnAction = oa    '実行するマクロ名を入力
bgr:
            bg = Application.InputBox(Prompt:="メニューの上側に区切り線を入れますか?" & vbCrLf & _
            "1:入れる" & vbCrLf & "2:入れない", Type:=1)
                If TypeName(bg) = "Boolean" Then
                    Exit Sub
                ElseIf bg = 1 Then
                    myButton.BeginGroup = True  'Trueで上側に区切り線が表示される。Falseで区切り線なし
                ElseIf bg = 2 Then
                    myButton.BeginGroup = False
                Else
                    MsgBox "1または2を入力して下さい!"
                    GoTo bgr
                End If
               
        Case 2
ctrr:
            ct = Application.InputBox(Prompt:="サブメニューを含むメニュー名を入力して下さい", Type:=2)
                If TypeName(ct) = "Boolean" Then
                    Exit Sub
                ElseIf ct = "" Then
                    GoTo ctrr
                End If
bfrr:
            bf = Application.InputBox(Prompt:="サブメニューを含むメニューを上から何番目に配置しますか?(0で末尾)", Type:=1)
                If TypeName(bf) = "Boolean" Then
                    Exit Sub
                ElseIf bf = 0 Then
                    Set myPopup = CommandBars("Cell").Controls.Add(Type:=msoControlPopup)
                ElseIf bf >= 1 And bf <= CommandBars("Cell").Controls.Count Then
                    Set myPopup = CommandBars("Cell").Controls.Add(Type:=msoControlPopup, Before:=bf) 'Before:=で配置位置を指定する。省略で末尾に配置
                Else
                    MsgBox "0~" & CommandBars("Cell").Controls.Count & "の数値で入力して下さい"
                    GoTo bfrr
                End If
            myPopup.Caption = ct '追加するメニュー名を入力
bgrr:
            bg = Application.InputBox(Prompt:="サブメニューを含むメニューの上側に区切り線を入れますか?" & vbCrLf & _
            "1:入れる" & vbCrLf & "2:入れない", Type:=1)
                If TypeName(bg) = "Boolean" Then
                    Exit Sub
                ElseIf bg = 1 Then
                    myPopup.BeginGroup = True  'Trueで上側に区切り線が表示される。Falseで区切り線なし
                ElseIf bg = 2 Then
                    myPopup.BeginGroup = False
                Else
                    MsgBox "1または2を入力して下さい!"
                    GoTo bgrr
                End If

        Case 3
ctsw:
            On Error GoTo ErrorHandler
            cts = Application.InputBox(Prompt:="サブメニュー名を入力して下さい", Type:=2)
                If TypeName(cts) = "Boolean" Then
                    Exit Sub
                ElseIf cts = "" Then
                    GoTo ctsw
                End If
ctw:
            ct = Application.InputBox(Prompt:="サブメニューの上位階層のメニュー名を入力して下さい", Type:=2)
                If TypeName(ct) = "Boolean" Then
                    Exit Sub
                ElseIf ct = "" Then
                    GoTo ctw
                End If
oaw:
            oa = Application.InputBox(Prompt:="サブメニューに登録するマクロ名を入力して下さい", Type:=2)
                If TypeName(oa) = "Boolean" Then
                    Exit Sub
                ElseIf oa = "" Then
                    GoTo oaw
                End If
bfw:
            bf = Application.InputBox(Prompt:="サブメニューを上から何番目に配置しますか?(0で末尾)", Type:=1)
                If TypeName(bf) = "Boolean" Then
                    Exit Sub
                ElseIf bf = 0 Then
                    Set myButton = CommandBars("Cell").Controls(ct).Controls.Add
                ElseIf bf >= 1 And bf <= CommandBars("Cell").Controls(ct).Controls.Count Then
                    Set myButton = CommandBars("Cell").Controls(ct).Controls.Add(Before:=bf) 'Before:=で配置位置を指定する。省略で末尾に配置
                Else
                    MsgBox "0~" & CommandBars("Cell").Controls(ct).Controls.Count & "の数値で入力して下さい"
                    GoTo bfw
                End If
            myButton.Caption = cts '追加するサブメニュー名を入力
            myButton.OnAction = oa    '実行するマクロ名を入力
bgw:
            bg = Application.InputBox(Prompt:="サブメニューの上側に区切り線を入れますか?" & vbCrLf & _
            "1:入れる" & vbCrLf & "2:入れない", Type:=1)
                If TypeName(bg) = "Boolean" Then
                    Exit Sub
                ElseIf bg = 1 Then
                    myButton.BeginGroup = True  'Trueで上側に区切り線が表示される。Falseで区切り線なし
                ElseIf bg = 2 Then
                    myButton.BeginGroup = False
                Else
                    MsgBox "1または2を入力して下さい!"
                    GoTo bgw
                End If
                       
        Case 4
ctx:
            On Error GoTo ErrorHandler
            ct = Application.InputBox(Prompt:="削除するメニュー名を入力して下さい", Type:=2)
                If TypeName(ct) = "Boolean" Then
                    Exit Sub
                ElseIf ct = "" Then
                    GoTo ctx
                End If
            CommandBars("Cell").Controls(ct).Delete   '削除するメニュー名を入力
           
        Case 5
ctsx:
            On Error GoTo ErrorHandler
            cts = Application.InputBox(Prompt:="削除するサブメニュー名を入力して下さい", Type:=2)
                If TypeName(cts) = "Boolean" Then
                    Exit Sub
                ElseIf cts = "" Then
                    GoTo ctsx
                End If
ctsz:
            ct = Application.InputBox(Prompt:="サブメニューの上位階層のメニュー名を入力して下さい", Type:=2)
                If TypeName(ct) = "Boolean" Then
                    Exit Sub
                ElseIf ct = "" Then
                    GoTo ctsz
                End If
            CommandBars("Cell").Controls(ct).Controls(cts).Delete   '削除するサブメニュー名を入力
           
        Case 6
            CommandBars("Cell").Reset
       
        End Select
       
    Exit Sub
ErrorHandler:
    Select Case Err.Number
        Case 5
            MsgBox "入力された名称が間違っているか、存在しません"
    End Select
End Sub
***************************************

 ※SubからEnd Subまでをコピペしてマクロを使用できます。使用の際は自己責任でお願いいたします。

 

右クリックした際の第一階層メニューには隠しメニューなどがあるので、追加するメニューを配置する正確な順番を知りたい場合は下記の記事のマクロを使用下さい。

 

kouten0430.hatenablog.com