VBAで指定セル範囲から取消線の文字を削除する

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

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

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

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

削除後

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

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

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

そこで、取り消し線の文字列を一括で削除する方法を紹介します。

ソースコード

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

メインのソースコードではFontオブジェクトの各プロパティの保持と再設定を行っています。

以下のユーザー定義型(構造体)のST_FONTはそのために利用します。

Fontオブジェクトをそのまま使えればそれがいいのですが、セルの文字列が書き換わると保持していたFontオブジェクトも変わってしまうという特性がVBAにはあります。

VBAにはオブジェクト変数にディープコピーの概念(コピー元が変更してもコピー先に影響がないコピー方式)がないため構造体で代用しています。

構造体の各変数はFontオブジェクトの各プロパティを同じ名前と型にしています。

この構造体は後述のメインコードと同じ標準モジュール等でモジュールの一番上あたりに配置してください。Option Explicitの直後あたりです。

メインコード

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

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

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

そこで、ちょっと長いですが、セルの1文字ずつのフォント設定用の処理を入れています。

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

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

注意点ですが、70行目のColorIndexプロパティと71行目のColorプロパティの設定はこの順でなければなりません。

理由は、Colorプロパティを先に設定してしまうとColorIndexプロパティの設定により色がColorプロパティで設定したRGB関数色ではなく近似色に変わってしまうためです。

取得時の34行目と35行目では既に設定済みの値を取るだけなので順番は関係ありませんが、設定時は影響があります。

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

使い方

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

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

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

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

実行前

実行後

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

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

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

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

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

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

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

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

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

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

関連記事

サブコンテンツ

このページの先頭へ