読者です 読者をやめる 読者になる 読者になる

Excelファイルの打ち消し線を一気に全部消すスクリプト

ワタシ達は、日々、Excel方眼紙に儚い夢を描いていますが、その夢は、あんなとこやこんなとこ、はたまたそんなとこからもツッコミを受け、真っ赤っ赤な打ち消し線だらけになって、世に羽ばたく時を迎えます。

世に羽ばたく改版の儀式では、生みの親であるワタシ達は、赤字を黒字に戻し、打ち消し線部分を削除し、感極まって目の前の罫線が滲む中、版数を叩き込みます。

でも感傷に浸っている時間などありません、儚い夢ノルマは次々とワタシ達を襲い続けるのです。できれば改版の儀式は一瞬で済ませたい。

赤字を黒字に戻すのは、全選択で一気に変えることができます。 でも打ち消し線部分の文字を削除するのは、一気にやるのは難しいです。 スタイル指定で検索しても、セル内の一部だけ打ち消し線になっている場合は、引っかかりません。

そこで打ち消し線部分の文字削除マクロを作ってみたりするのですが・・・セルを1個1個調べて削除するとメチャメチャ時間がかかります。 とても悩まshit。

そこでワタシは、ExcelファイルがXML形式で保存できることを思い出し、domで一気に絞込むやり方で削除しようと思い、試行錯誤しました。 結果、あっという間に消える、驚きの白さ。

勤務地でのネットアクセスが制限されているので、スクリプトを公開するのが難しいのですが、とりあえずやり方だけ共有します。

自分はWSHで作成しました。流れは・・・

1.対象ファイルを開く。

// こんな感じ
var EXCEL = WScript.createObject('Excel.Application');
var fr = EXCEL.Workbooks.Open(path, 9, true);

2.XML(xlsx形式ではない)形式で保存する。

var xlXMLSpreadsheet = 46;
fr.SaveAs(temppath, xlXMLSpreadsheet);

3.保存したXMLをDOMで開く

var txt = File.load(tmppath); // すみません。この部分は汎用クラス化していているので省略します。ファイルの全文字列を入れているだけです。
var dom = WScript.CreateObject('MSXML.DOMDocument');
dom.async = false;
dom.loadXML(txt);
dom.setProperty('SelectionNamespaces', 'xmlns:a='http://a.jp'); // おまじない

4.打ち消し線ありスタイルのスタイルIDを取得→idlst

var lst = dom.documentElement.selectNodes('//Style/@ss:ID[../Font/@ss:StrikeThrough="1"]');
var idlst = [];
for ( int i=0; i<lst.lenfth; i++ ) {
    idlst.push(lst.item(i).nodeValue);
}

5.スタイルから打ち消し線指定を削除

lst.item(i).removeAttribute('ss:StrikeThrough');

6.取得したスタイルIDが指定されているセルの文字列を削除

for ( var i in idlst ) {
  var l = dom.documentElement.selectNodes(['//Cell/Data[../@ss:StyleID="', i, '"]"'].join(''));
  for ( var j=0; j<l.length; j++ ) {
    if (l.item(j).selectNodes('./S').length==0) {
      l.item(j).childNodes.item(0).nodeValue=''; // Sタグがある場合は、セル内の一部のみ打ち消し線のため、ここでは削除しない
    }
  }
}

7.セル内の一部が打ち消し線パターンの文字列削除

var l = dom.documentElement.selectNodes('//S');
for ( var i=0; i<l.length; i++ ) { 
  var elm = l.item(i);
  elm.parentNode.removeChild(elm);
}

8.保存!

dom.save(tmppath);

9.保存後のXMLファイルを開き、シートを元のEXCELファイルにコピー 力尽きたので省略・・・

10.元のEXCELファイルを保存 力尽きたので省略・・・

以上〜

© 2009-2017 Osajiru All Rights Reserved.