文字列の数字や数式を”数値”や”数式”として扱うには書式を変更しないといけない
新規ブックを作成した際に、全てのセルの書式設定は「標準」になっています。「標準」書式の場合は数字を入力すれば数値として認識できますし、「=1+5」や「=SUM(A1:A3)」のような数式を入力すれば数式として認識され演算結果が表示されます。
ところが、入力した内容をそっくりそのまま表示させたい場合があります。そのような場合には「文字列」書式を使います。
「文字列」書式は使い方によってはとても便利ではありますが、数値と数式を入力したい場合は機能しません。「標準」書式や「数値」書式などを使う必要があります。ただ、そういうセルを探し出していちいち「標準」書式や「数値」書式に変換するのは面倒です。
ここでは、文字列書式のセルで、入力内容が数字や数式であれば、標準セルに変換して、数値や数式として認識できるようにするマクロを紹介します。
コード
以下のコードは2つの関数を利用しています。実行するのは1つ目のChangeCellFormatToStandard関数です。2つ目の関数はセルの再表示を行う関数です。
1つ目の関数を実行すると入力セル範囲の中で数字だけのセルや=で始まるセルを「標準」書式に変更して、変更後の書式で再表示します。書式を「標準」に変更するだけではセルの表示は変わらないため、2つ目の関数を利用しています。
2つ目のReloadFormat関数については「VBAでセルの書式変更を反映させる」で詳しく書いているためそちらをご参照ください。コードは参照先のものをそのまま持ってきています。
コードの内容はコメントに大体書いているのでその通りなんですが、補足を入れると、数式の判定を行っている条件文「ElseIf Left(r.Value, 1) = “=” Then」のところは若干仕方なしで書いています。
というのも、=(イコール)で始まるセルが全て数式のセルか、というと、そういうわけではないため、一律に標準セルに変更しない方がいい場合もおそらくあるとは思いますが、ただ、実際にセルに入力する場合で=から入力するような文章はほとんどないため、もうこれでいいや、というコードになっています。
HasFormulaプロパティを使って数式かどうかのチェックを入れることもできますが、そこまでやらんでも、というのがあるのでやってません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
Sub ChangeCellFormatToStandard() Dim r As Range '// セル Dim f As Boolean '// 変換処理対象判定フラグ(True:処理対象、False:処理対象外) '// アクティブシートの入力セル範囲を1セルずつループ For Each r In ActiveSheet.UsedRange '// セルの書式が文字列ではない場合 If r.NumberFormatLocal <> "@" Then '// 次セルの処理を行う GoTo CONTINUE End If '// 変換処理対象判定フラグを初期値として「処理対象外」に設定 f = False '// セルの値が数値の場合 If IsNumeric(r.Value) = True Then f = True '// セルの値が数式の場合 ElseIf Left(r.Value, 1) = "=" Then f = True End If '// 変換処理対象の場合 If f = True Then r.NumberFormatLocal = "G/標準" End If CONTINUE: Next '// 入力セル範囲を再読み込み Call ReloadFormat End Sub Sub ReloadFormat() Dim iColStart As Integer '// 開始列位置 Dim iColEnd As Integer '// 終了列位置 Dim i As Integer '// ループカウンタ Dim iCol As Integer '// 列位置 Dim iRow As Long '// 行位置 Dim rInit As Range '// 開始時選択セル Application.ScreenUpdating = False Set rInit = Selection iRow = ActiveSheet.UsedRange.Row iColStart = ActiveSheet.UsedRange.Column iColEnd = ActiveSheet.UsedRange.Columns.Count + iColStart - 1 '// 開始列から終了列までループ For i = iColStart To iColEnd '// 列選択 Cells(iRow, i).Columns("A:A").EntireColumn.Select '// データ区切りを指定列に対して実行 Call Selection.TextToColumns( _ Destination:=Cells(iRow, i), _ DataType:=xlDelimited, _ TextQualifier:=xlDoubleQuote, _ ConsecutiveDelimiter:=False, _ Tab:=True, _ Semicolon:=False, _ Comma:=False, _ Space:=False, _ Other:=False, _ FieldInfo:=Array(1, 1), _ TrailingMinusNumbers:=True) Next '// 開始時セルを再選択 rInit.Select Application.ScreenUpdating = True End Sub |
使い方
アクティブシートで上のChangeCellFormatToStandard関数を実行するだけです。
実行すると、数字や数式で文字列書式のセルが標準書式になり、再表示されます。