猫と一緒にガジェットライフ♪ムチャです。
以前Excelスクショ問題のときにも書きましたが、開発環境の制限で手頃な作画ツールを導入できないためにExcelで業務フローや処理フローなんかを作ることがあると思います。
困ったことに、Excel単体では図形内のテキストを検索できないのですよね。
Excelに対応した検索ツールやアドインを導入できれば良いですが、それすらも不可能な現場にいたときに、JavaScript+ActiveXで検索ツールを作りました。
いくつか不満点をアップデートしたので改めて公開します。
対象ユーザー
このツールは以下のような状況下で開発している方を対象としています。
- Excelで作られた資料が大量にある
- 図形をふんだんに使っていて標準の検索では探せない
- 自由にソフトウエアを導入できない
- Excelのアドインも導入できない
アドインが導入可であれば、「RelaxTools Addin」を導入するのが良いと思います。
単体のソフトウェアとしては「探三郎」が良さそうです。スタンドアロン版はフリーソフトとして公開されています。
自分の作った物は、ソフトの導入はもちろん、インターネットにも繋がらず、かろうじてソースコードを紙で持ち込むくらいしかできない状況下で使えるように、単一のHTMLファイルにしています。
アップデートした内容
セル内文字列の検索が正規表現に対応してなかったので、正規表現で検索するようにしました。コメントやオートシェイプは正規表現で検索してたのですが。
というのも、以前はRange#Findで文字列検索したあと、FindNextメソッドで次を検索とやっていました。どこかのサンプルをコピってきただけです。
じゃあ普通に使われている範囲のRangeオブジェクトを取得して、ループで回せばいいと思って以下のようなコードを書いたのですが、遅いのなんの。
Rangeオブジェクトを1つずつ取得する度にExcelが動いてるようで、対象セルが2000個くらいあると数十秒もかかりました(;´Д`A
VBAだと配列化というテクニックで対象セルの値を一気に配列へコピーしてから検索すると速くなるようなのですが、VBScriptは使いたくなくてJavaScriptで書いているのでうまくいきません。
Range#Valueで2次元配列が取り出せるようなのですが、デバッガで見るとプロパティは見えるのに、参照するとundefinedになるという謎(´・ω・`)
調べた結果、VBArrayというクラスでラップするとアクセスできるのが分かりました。
調べた結果、VBArrayというクラスでラップするとアクセスできるのが分かりました。
VBArrayはlbound(次元数)で最小値、ubound(次元数)で最大値が取れるので、その範囲で回してやります。これでセル数が多くてもそこそこの速さで検索できるようになりました。
あとはShape#TextFrame#Characters()がExcel2016だと例外吐く時があるようで、めんどいのでtry~catchでスルー(;´∀`)
Internet Explorerで開きます。上のような警告がでますが、問題無いのではいを押します。
フォームにキーワード(正規表現可)、検索したいExcelファイルのあるパスを指定します。サブフォルダも辿るので、必要なファイルだけ適当なディレクトリにコピーして置くと良いです。
ファイルにパスワードがかかっている場合は1つだけ指定可能です。ファイル毎に異なる場合は対応できていません。
検索対象としてセル、オートシェイプ、コメントを選べます。不要な項目は外すと早く終わります。
オプションとして英字の大文字小文字の区別と、非表示の行/列やオートフィルタによる隠し部分も対象とするかを選べます。
検索が終わるとフォームの下にテーブルで検索結果が表示されます。
項目は見つかったファイル名、シート名、セル・オートシェイプ・コメントの区分、ヒットした領域の文字列全体、開くボタンです。
開くボタンを押すと、該当シートの該当セル(オートシェイプの場合は図形が乗っかっている左上のセル)が選択された状態で読み取り専用で開くようになっています。これはけっこうポイント高いのではないかと思います(`・∀・´)
あとはShape#TextFrame#Characters()がExcel2016だと例外吐く時があるようで、めんどいのでtry~catchでスルー(;´∀`)
使い方
コードは最後に載せるので、使い方を先に説明します。
コードはhtmlファイルとしてローカルディスク上に保存します。ネットワークドライブに置いてあるとセキュリティ関係でうまく動きません。
フォームにキーワード(正規表現可)、検索したいExcelファイルのあるパスを指定します。サブフォルダも辿るので、必要なファイルだけ適当なディレクトリにコピーして置くと良いです。
ファイルにパスワードがかかっている場合は1つだけ指定可能です。ファイル毎に異なる場合は対応できていません。
検索対象としてセル、オートシェイプ、コメントを選べます。不要な項目は外すと早く終わります。
オプションとして英字の大文字小文字の区別と、非表示の行/列やオートフィルタによる隠し部分も対象とするかを選べます。
検索が終わるとフォームの下にテーブルで検索結果が表示されます。
項目は見つかったファイル名、シート名、セル・オートシェイプ・コメントの区分、ヒットした領域の文字列全体、開くボタンです。
開くボタンを押すと、該当シートの該当セル(オートシェイプの場合は図形が乗っかっている左上のセル)が選択された状態で読み取り専用で開くようになっています。これはけっこうポイント高いのではないかと思います(`・∀・´)
と言うわけで完成版
以下が全コードです。gistで公開しています。何か不明点や不具合がありましたら、各種SNSで突っ込んでやってください。
おしまいのひとこと
たまには技術的なことも書かないとということで(;´∀`)
良かったら使ってやってください。最近のJavaScriptの書き方ではないと思いますが、その辺も突っ込んでいただけるとありがたいです。
デザイン面は全く考慮していないので、かっちょよくて短いCSSを書いてくれる方募集してます。
デザイン面は全く考慮していないので、かっちょよくて短いCSSを書いてくれる方募集してます。
それではみなさまよきガジェットライフを(´∀`)ノ
※もしとても役に立ったら投げ銭でもしてやってください(;´∀`)
Amazonギフトで15円から可能な「Kampa!」というサービスです。
Amazonギフトで15円から可能な「Kampa!」というサービスです。