Excel VBA シートに入力されているの文字数の合計を取得する

スポンサーリンク

ワークシートに入力されている文字数の合計を取得する方法

文字列や数値、記号などの文字の合計を取得するには、文字列の長さを取得するLen【レン】関数で取得できますが、文字の間に空白があると、一つの空白を1文字として加算してしまいます。また、セル内で改行している場合も見た目ではわかりませんが、改行コード(Chr(10))があり、こちらも一つの改行を1文字として加算してしまいます。

そこで、Range【レンジ】オブジェクトのデータを置換えるReplace【リプレイス】メソッドを使用して、全角半角空白を長さ0文字の文字列「””」に、Chr【キャラクター】関数で取得した改行コード「Chr(10)」を長さ0文字の文字列「””」に置き換えてから、Len【レン】関数を使用して文字の長さ(数)を取得します。

ただ、Replace【リプレイス】メソッドで空白や改行を「長さ0文字の文字列」に置換えしてしまうと文字列の配置が変わってしまい元に戻せないので、不具合が生じます。そこで、シートの複製(コピー)を作成して、その複製シートにReplace【リプレイス】メソッドを使用して置き換えを実行し、空白や改行を除いた文字だけにし、その数をLen【レン】関数で取得し、変数に格納します。その後、複製シートは削除して、元のシート(置換えをしていないシート)をアクティブにして、MsgBox【メッセージボックス】関数を使用して、文字数の合計を表示します。

実行例(1から5の数値が10個のセルに入力されているので文字数は50です。)

コードと解説

Sub 文字数2()
Dim 文字() As Variant
Dim セル数 As Long
Dim i As Long
Dim セル As Range
Dim 文字数 As Long
Dim 文字数合計 As Long
Dim データ範囲 As Range
Dim シート名 As String
シート名 = ActiveSheet.Name
Sheets(シート名).Copy after:=Sheets(シート名)
Set データ範囲 = ActiveSheet.UsedRange
With データ範囲
    Application.ReplaceFormat.Clear
    .Replace " ", ""
    .Replace " ", ""
    .Replace Chr(10), ""
    Application.ReplaceFormat.Clear
End With
    セル数 = データ範囲.Count
ReDim 文字(セル数)
  i = 0
For Each セル In データ範囲
    文字(i) = セル.Value
    文字数 = Len(文字(i))
    文字数合計 = 文字数合計 + 文字数
  i = i + 1
Next
   Application.DisplayAlerts = False
    ActiveSheet.Delete
   Application.DisplayAlerts = True
    Sheets(シート名).Select
   MsgBox 文字数合計
End Sub

2行目【Dim 文字() As Variant】
使用されているセル範囲のセルを1つ1つ繰り返し処理で参照し、セルの文字を配列に格納する、配列変数「文字」を配列の上限値がわからないので動的配列としてバリアント型(Variant)で宣言します。


3行目【Dim セル数 As Long】
使用されているセル範囲のセルの数をCount【カウント】メソッドで数えて、変数「セル数」に格納します。


4行目【Dim i As Long】
繰り返し処理の中で、配列の要素番号を表すカウンター変数「i」を長整数型(Long)で宣言します。


5行目【Dim セル As Range】
繰り返し処理の中で、セルの集まりのコレクションからオブジェクトを取り出し、その取り出したセルを格納する変数「セル」をオブジェクト型(Range)で宣言します。


6行目【Dim 文字数 As Long】
繰り返し処理の中で、配列「文字」から取り出した要素をLen【レン】関数で数えて、その数を格納する変数「文字数」を長整数型(Long)で宣言します。


7行目【Dim 文字数合計 As Long】
繰り返し処理の中で、配列から取り出した要素の文字数が格納されている変数「文字数」を加算して、最終的にシート内の文字数を格納する「文字数合計」を長整数型(Long)で宣言します。


8行目【Dim データ範囲 As Range】
Worksheet【ワークシート】オブジェクトの使用されているセル範囲を取得するUsedRange【ユーズドレンジ】プロパティで取得したセル範囲を格納する変数「データ範囲」をオブジェクト型(Range)で宣言します。


9行目【Dim シート名 As String】
文字数を数えるシートのシート名を格納する変数「シート名」を文字列型(string)で宣言します。


10行目【シート名 = ActiveSheet.Name】
Worksheet【ワークシート】オブジェクトのName【ネーム】プロパティを使用して、現在アクティブな文字数を数えるシートのシート名を取得し、変数「シート名」に代入します。


11行目【Sheets(シート名).Copy after:=Sheets(シート名)】
Sheets【シーツ】プロパティで引数に指定した変数「シート名」のシート、つまり文字数を数えるシートをWorksheet【ワークシート】オブジェクトのCopy【コピー】メソッドを使用してコピーし、移動先を表す引数after【アフター】に変数「シート名」のシートの後(右側)を指定します。


12行目【Set データ範囲 = ActiveSheet.UsedRange】
現在アクティブになっている複製(コピー)シートを表すWorksheet【ワークシート】オブジェクトの使用されているセル範囲を返すUsedRange【ユーズドレンジ】プロパティを使用して、文字が入力されているセル範囲を取得して、オブジェクト変数「データ範囲」にSet【セット】キワードを使用して代入します。


13行目【With データ範囲】
複製シートの文字が入力されているセル範囲が格納されているオブジェクト変数「データ範囲」をWith【ウィズ】ステートメントで指定します。


14行目【 Application.ReplaceFormat.Clear】
Application【アプリケーション】オブジェクトのReplaceFormat【リプレイスフォーマット】置換えの書式を表すCellFormat【セルフォーマット】オブジェクトを取得し、Clear【クリア】メソッドで、設定されていなくても念の為、置換え書式を削除します。


15行目【 .Replace ” “, “”】
With【ウィズ】ステートメントで指定した複製シートの文字が入力されているセル範囲が格納されている変数「データ範囲」にRange【レンジ】オブジェクトのReplace【リプレイス】メソッドを使用して半角空白「” “」を長さ0文字の文字列「””」に置換えます。


16行目【 .Replace “ ”, “”】
With【ウィズ】ステートメントで指定した変数「データ範囲」にRange【レンジ】オブジェクトのReplace【リプレイス】メソッドを使用して全角空白「” ”」を長さ0文字の文字列「””」に置換えます。


17行目【 .Replace Chr(10), “”】
With【ウィズ】ステートメントで指定した変数「データ範囲」にRange【レンジ】オブジェクトのReplace【リプレイス】メソッドを使用してASCII【アスキー】コード対応する文字を取得するChr 【キャラクター】関数を使用して改行を表す文字を取得し、長さ0文字の文字列「””」に置換えます。


18行目【 Application.ReplaceFormat.Clear】
Application【アプリケーション】オブジェクトのReplaceFormat【リプレイスフォーマット】置換えの書式を表すCellFormat【セルフォーマット】オブジェクトを取得し、Clear【クリア】メソッドで、設定されていなくても念の為、置換え書式を削除します。


20行目【セル数 = データ範囲.Count】
複製シートの文字が入力されているセル範囲が格納されている変数「データ範囲」にRange【レンジ】オブジェクトのCount【カウント】プロパティを使用してセルの数を取得し、変数「セル数」に代入します。


21行目【ReDim 文字(セル数)】
動的配列変数「文字」のReDim【リデム】ステートメントを使用して配列要素の上限値を設定を変数「セル数」に設定します。


22行目【 i = 0】
繰り返し処理の中で、配列変数の要素番号を表すカウンター変数「i」に0を代入します。


23行目【For Each セル In データ範囲】
For Each Next【フォーイーチネクスト】ステートメントを使用して繰り返し処理の始まりです。コレクションには、文字が入力されているセル範囲が格納されているオブジェクト変数「データ範囲」を指定し、オブジェクト変数「セル」に繰り返し処理の中で
範囲のセルを一つずつ取り出して代入します。


24行目【文字(i) = セル.Value】
配列変数「文字」の「i」番目の要素にオブジェクト変数「セル」の値をRange【レンジ】オブジェクトのValue【バリュー】プロパティで取得し、代入します。


25行目【 文字数 = Len(文字(i))
引数に指定した文字の長さ(数)を取得するLen【レン】関数を使用して、配列変数「文字」に格納されている文字の要素番号をカウンター変数「i」にして繰り返し処理の中で順に取り出し、文字の長さを取得して変数「文字数」に格納します。


26行目【文字数合計 = 文字数合計 + 文字数】
Len【レン】関数で取得した文字数の合計数が格納されている変数「文字数合計」に25行目のLen【レン】関数で取得した文字数を加算して再度、変数「文字数合計」に代入します。


27行目【i = i + 1】
カウンター変数「i」に1を加算して再度、カウンター変数「i」に代入します。


28行目【Next】
23行目からここまでの処理をオブジェクト変数「データ範囲」のセルの数分繰り返し処理をします。


29行目【Application.DisplayAlerts = False】
Application【アプリケーション】オブジェクトのDisplayAlerts 【ディスプレイアラーツ】プロパティにFalseを指定して、次の行で実行するシート削除の注意メッセージの抑制をします。


30行目【 ActiveSheet.Delete】
Worksheet【ワークシート】オブジェクトのDelete【デリイト】メソッドを使用して、現在アクティブな複製シートを削除します。


31行目【Application.DisplayAlerts = True】
抑制していた注意メッセージを再開します。


32行目【Sheets(シート名).Select】
Sheets【シーツ】プロパティで変数「シート名」に格納されている元のシートを参照してSelect【セレクト】メソッドで選択します。


33行目【MsgBox 文字数合計】
MsgBox【メッセージボックス】関数を使用して、変数「文字数合計」に格納されている合計の文字数を表示します。

以上で、 シートに入力されているの文字数の合計を取得する方法についての解説を終了します。ありがとうございました。

スポンサーリンク

関連記事・広告