VBAの勉強を始めてみた

タイトルの通りVBAの勉強を始めました。効率化と暇つぶしを兼ねています。VBA以外の話題もあるよ(笑)

数字を計算可能な数値に変換する

ここに外部アプリケーションが出力したEXCELファイルがあります。

f:id:kouten0430:20170823001304j:plain

 

SUM関数で数値を合計をしようとしたのですが、画像のように計算結果が「0」になってしまいました・・・・・・。

f:id:kouten0430:20170823001427j:plain

 

結論からいうとこれはセル内にカンマが存在し文字列扱いとなっているためです。書式設定で「数値」や「通貨」などにしても計算対象になってくれません。

数値が文字列となってしまう原因は他にもありえます。
・冒頭にシングルクオートが入っている
・なんらかの原因で改行コードが入ってしまっている 等々

 

数字が入った列を選択した状態で、区切り位置→区切り位置指定ウィザード1/3で完了することで数字を計算可能な数値にすることができます。

f:id:kouten0430:20170823001558j:plain

f:id:kouten0430:20170823002441j:plain

 

・・・・・・が、区切り位置指定ウィザードは1列ずつしか処理することができないため対象の列が多いと手間と時間がかかります。

そこでマクロの登場です。文字列となってしまっている数字の入ったセルを複数選択し、まとめて数値に変換します。シングルクオート、カンマ、余白、改行を取り除き、最後にVal関数で数値変換しています(ダメ押し)。

 

***************************************

Sub 数字を数値に変換()
   
    Dim myRange As Range

    For Each myRange In Selection.SpecialCells(xlCellTypeVisible)
        If myRange.Value <> "" And TypeName(myRange.Value) <> "Date" Then
        'セルの値が空白,日付の場合は処理をしない
        '数字以外はVal関数が0を返すので選択しないで下さい
            myRange.Value = Trim(myRange.Value)
            myRange.Value = Replace(myRange.Value, vbLf, "")
            myRange.Value = Replace(myRange.Value, vbCrLf, "")
            myRange.Value = Replace(myRange.Value, "'", "")
            myRange.Value = Replace(myRange.Value, ",", "")
            myRange.Value = Val(myRange.Value)
        End If
    Next myRange
   
End Sub

***************************************
※SubからEnd Subまでをコピーし、標準モジュール等に貼り付けて使用して下さい。なお、マクロで実行した処理は「元に戻す」ことができません。実行前に一旦保存しやり直しのできる状態にしておいて下さい。標準モジュールにコードを貼り付けてマクロを使用する方法はこちら