取り消し線の文字を削除するには

Excelの資料の修正を繰り返していく中で、履歴として取り消し線で残している場合があります。

この取り消し線の部分をもう不要だからと削除することもあります。削除前後はこんな感じです。

削除前(「竣工」という取り消し線になっている文字を削除する)

削除後

手作業の場合は以下のような手順になります。

  1. セルを選択する。
  2. 取り消し線文字部分にカーソルを当てる。
  3. 取り消し線の文字部分を削除する。

1か所程度なら大したことありませんが、あまりにも多いと時間が掛かって仕方ありません。面倒です。

そこで、取り消し線の文字列を一括で削除する方法を紹介します。簡単な方法と複雑な方法の2つを紹介します。

簡単な方法のソースコード

以下のコードは選択しているセル範囲を1セルずつ処理します。セルの文字列を1文字ずつ取消線が設定されてあるかを確認し、設定されていればCharacters.Deleteメソッドでその文字を削除します。対象の文字を削除するだけのため、他の文字の書式には影響がありません。また、取消線がないセルで実行しても問題ありません。

実行方法は、セルを選択して実行するだけです。

 

複雑な方法のソースコード

簡単な方法の通り、Characters.Deleteメソッドを使えば対象の文字を削除できます。以下の方法はFontオブジェクトがどのようなプロパティで構成されているかが分かりますが、ただの参考です。実際に使う場合は上の簡単な方法のをお勧めします。

Fontオブジェクト用の構造体

メインのソースコードではFontオブジェクトの各プロパティの保持と再設定を行っています。以下のユーザー定義型(構造体)のST_FONTはそのために利用します。

Fontオブジェクトをそのまま使えればそれがいいのですが、セルの文字列が書き換わると保持していたFontオブジェクトも変わってしまうという特性がVBAにはあります。VBAにはオブジェクト変数にディープコピーの概念(コピー元が変更してもコピー先に影響がないコピー方式)がないため構造体で代用しています。

構造体の各変数はFontオブジェクトの各プロパティを同じ名前と型にしています。この構造体は後述のメインコードと同じ標準モジュール等でモジュールの一番上あたりに配置してください。Option Explicitの直後あたりです。

メインコード

以下は対象のセルの文字列から取り消し線部分を除去する関数です。

取り消し線の部分を削除するだけならStrikethroughプロパティがTrueの文字だけを連結すればいいのですが、それだと問題が発生します。

問題とは、セルの文字列が再設定(再入力)するとフォントの設定がクリアされてしまう点です。

そこで、ちょっとコードが長くなってしまいますが、セルの1文字ずつのフォントを再設定するための処理を入れています。

処理概要は以下になります。

  1. セルを1文字ずつ取得。
  2. 取得した文字が取り消し線が設定されているか確認。
  3. 取り消し線が設定されていなければ残す。その際のその文字のフォントの各プロパティを保持しておく。
  4. 取り消し線を除いた文字列をセルに再設定する。
  5. 再設定後に一文字ずつフォントの各プロパティを再設定する。

なお、構造体には存在していますが使用する必要がないためBackground、Bold、ColorIndex、Italicプロパティは使用していません。

FontオブジェクトのBackgroundプロパティとThemeColorプロパティの取得と設定をコメントにしていますが、使わないので消しています。

 

使い方

いくつかのパターンの使い方を紹介します。

1. 指定セルから取り消し線を除く

A2セルから取り消し線を除くためのコードです。

引数にA2セルのRangeオブジェクトを渡しているだけです。

実行前

実行後

2. 選択セルから取り消し線を除く

選択セル範囲の各セルから取り消し線を除くためのコードです。

選択セル範囲をループして1セルずつRangeオブジェクトとして処理しています。

選択セル範囲に空白セルや取り消し線がないセルが存在しても問題ありません。

3. アクティブシートの全セルから取り消し線を除く

アクティブシートの全セルから取り消し線を除くためのコードです。

全セルを対象とすると処理時間がかかるため、UsedRangeプロパティで入力されているセル範囲を対象としています。

4. 全シートから取り消し線を除く

全シートから取り消し線を除くコードです。

上のコードにシートのループを追加しているだけです。