VBAの勉強を始めてみた

色々試しています。

即席でちょっとだけ便利なマクロを書いてみるよ

今回は無くても困らないけど・・・あればちょっとだけ便利かもしれないマクロを書いてみます。もしかしたらエクセルの標準機能でまかなえることをやっているかもしれませんが、そこはご愛嬌。わざわざ1記事にするまでもないので纏めて詰め込みます。

 

選択範囲のセル内改行を削除する

 ご存知のようにエクセルでは、Alt+Enterでセル内改行をすることができます。  

f:id:kouten0430:20171103132934j:plain

このような、セル内改行が不要になった場合にまとめて削除するマクロです。
セル内改行は文字コード「LF」であるため、Replace関数を使って「LF」を「長さ0の文字列」にまとめて置換します。

---------------------- 

Sub 選択範囲のセル内改行を削除する()
    Dim myRange As Range

    For Each myRange In Selection.SpecialCells(xlCellTypeVisible)   '可視セルのみに処理を行う
        If myRange.Address = myRange.MergeArea(1).Address Then   '結合セルの場合は左上の値のみ処理する
            myRange.Value = Replace(myRange.Value, vbLf, "")    'セル内改行(改行コード:LF)を削除
        End If
    Next myRange

End Sub

----------------------

 

数値をパーセントスタイル(文字列)に変換する 

下記の画像では数値がパーセントで表示されています。・・・が、これは書式設定によって表示がパーセントスタイルになっているだけで、実際のデータは0.01、0.02・・・となっています。

f:id:kouten0430:20171103133340j:plain


これを1%、2%・・・のような文字列だと思い込んでコピペ(値)したり、関数やマクロで処理しようとすると予定外の結果になってしまいます。
このマクロでは、数値に100を掛け末尾に"%"を連結し文字列として返します。数値をパーセントスタイルの「文字列」として取り扱いたい場合にどうぞ・・・。

 ---------------------- 

Sub パーセント表記に変換する()
    '数値をパーセント表記(文字列)に変換する
    Dim myRange As Range

    For Each myRange In Selection
        If myRange.Value <> "" And TypeName(myRange.Value) <> "String" _
        And TypeName(myRange.Value) <> "Date" Then
        'セルの値が空白,文字列,日付のいづれかの場合は処理をしない
            myRange.Value = "'" & myRange.Value * 100 & "%"
        End If
    Next myRange
   
End Sub

 ----------------------

 

単一セルの文字列をクリップボードに出力 

例えば、下記の画像のように文字列の入ったセルをコピーすると 

f:id:kouten0430:20171103133617j:plain

 f:id:kouten0430:20171103133642j:plain

クリップボードには、カーソルの位置からも分かるように、文字列の末尾に改行が入った状態で格納されます。
この余分な改行が気に入らないために、文字列をコピーする場合は、わざわざ数式バーから文字列のみを選択してコピーしたりしていました。
・・・が、このマクロでは単一セル(結合セル含む)から余分な改行やTabがない状態でクリップボードに文字列のみを吸い取ることができます。
ちなみにマクロはクイックアクセスツールバーに登録しましょう。マクロの一覧からいちいち実行するなら、数式バーから文字列のみをコピーする従来方式のほうが速いからです(笑)
同じ動作を何十回と繰返す場面があれば、クリック回数を少なくかつコンマ数秒でも速くできたほうが、ストレスもないですし、仕事が捗ります。

----------------------

Sub 単一セルの文字列をクリップボードに出力()
    Dim V As String
    Dim myLib As Object
    Set myLib = CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
   
    V = ActiveCell.Value

    myLib.SetText V  '変数の値をDataObjectに格納する
    myLib.PutInClipboard 'DataObjectのデータをクリップボードに格納する
   
End Sub

----------------------

 


エクセルの使い方は人により千差万別なので、必ずしも「ピタッ」とくるとは限りませんが・・・。必要な場面に出くわした際に、思い出してもらえれば嬉しいです。
では失礼します。