PR

【ワレコのEXCEL】エクセル罫線自動修復アドイン改良版 VSTOとVBA対応【Undo/Redo可能】

この記事は約13分で読めます。
スポンサーリンク
ワレコ
ワレコ

久しぶりにプログラミングの話題だ。

五ヶ月程前にパソコンを自作してワテもいよいよWindows10からWindows11に乗り換えた。

その新しいパソコンでファイルを整理していて、過去に作成したEXCEL VSTOアドインプロジェクトを発見した。

そのVSTOアドインに関する約五年前の記事がこちら⤵️

月日の流れは早いもので、もう五年も経つのか。

上の記事ではEXCEL作業中に表の罫線が消えてしまった場合に、消えた罫線を自動修復するVSTOアドインを紹介した。

今回、そのEXCEL VSTOアドインのソースコードを改良して以下の作業を行った。

  • VSTOアドインのVB.NETソースコードを元にVBA版の罫線自動修復アドイン(xlam)作成
  • UndoやRedoも実装した
  • そのVBA版をVB.NETに逆変換してVSTO版アドインも作成
  • VSTOアドイン版でもUndoやRedoも実装

と言う事で、当記事ではこれらの改良版EXCEL罫線自動修復アドインを動画を交えて紹介したい。

では、本題に入ろう。

スポンサーリンク
スポンサーリンク

EXCEL罫線自動修復アドインの紹介

VBA版 罫線自動修復アドインのデモ(Undo/Redoも)

では百聞は一見に如かずなので、以下に示す動画で罫線が消えた表の罫線自動修復をお見せしよう。約18秒の動画だ。音声は無し。

動画 VBA版 罫線自動修復アドイン(xlam)のデモ

上動画のように罫線が消えてしまった表をマウス選択して、リボンのWarekoVBAにある「罫線修復」ボタンをクリックすれば良い。

なかなかいい感じに罫線自動修復が動作しているでしょ。

かつ、UndoやRedoまで実装出来たのだ。

よく知られているようにEXCEL VBAを使ったマクロプログラムの場合、Undoは殆ど出来ない。

Application.Undo メソッド (Excel)と言うのはあるが、「ユーザーが最後に実行した操作を取り消します。」(引用元マイクロソフトのサイト)という事なので、大掛かりなUndo操作は出来ないのだ。

もしUndoやRedoを実装したいなら、自分で何らかのUndoやRedoのプログラムを書く必要がある。上動画で示す罫線修復のUndoやRedoはまさにその手法を採用し、自前のUndo・Redo処理を実装したのだ。

VSTO版 罫線自動修復アドインのデモ(Undo/Redoも)

次はVSTO版だ。

この動画も先ほどの動画と同じエクセルデータを使い、罫線修復機能も全く同じだが参考までに動画にしてみた。

この場合は、リボンにあるWarekoVSTOの「罫線修復」をクリックしている。

動画 VSTO版 罫線自動修復アドイン(COMアドイン)のデモ

どう!

ちなみに上動画にあるリボンには以下に示す三つのグループがある。それらの説明は以下の通り。

アドイン 説明
WarekoVSTO 今回作ったVSTOアドイン(VBA版を変換して作成)
WarekoTools 以前に作ったVSTOアドイン(罫線修復のみ、Undo/Redo無し)
WarekoVBA 今回作ったVBA版xlamアドイン(WarekoTools版を改良)

表 三種類のアドインの説明

要するに以下の順番で作成した。

WarekoTools ➡️ WarekoVBA ➡️ WarekoVSTO

今回作成したVBA版とVSTO版はどちらも殆ど同じ機能なので、以下で示す動画ではVBA版やVSTO版を意識せずにどちらかを使っている。

EXCEL罫線自動修復アドインの使い方説明

複数テーブルの罫線自動修復可能

例えば下動画のように複数のテーブルの罫線を修復したい場合でも対応している。

そのやり方は簡単で、動画で示すようにマウス選択時にCTRLキーを押しながら修復したいテーブルを連続で選択すれば良い。そのあとで、罫線修復ボタンをクリックすれば良い。

動画 複数のテーブルをCTRL+マウス選択して一気に罫線自動修復出来る

まあ上動画のように幾つもの表の罫線を自動修復したいと言うような場面はあまりないとは思うが。

でもEXCELのアドイン作成では、何らかの処理を1つの選択域に対して行うだけでなく、複数選択域に対して一気にやりたい場合は多い。

なのでそう言うロジックを入れているのだ。そうしておけばその部分のコードは他のアドイン作成に応用出来るので。

修復エリアは広めに選択しても良い

今までの例では罫線自動修復したい表と同じサイズのエリアをマウス選択していた。

でも実は下動画で示すように罫線自動修復したい表を取り囲むように広めにマウス選択しても良い。

動画 罫線自動修復したい表を取り囲むように広めにマウス選択しても良い

もし広大な領域を選択した場合でも、その中の実質のデータ領域のみ探索してから罫線自動修復を行っているので、処理中に無反応になる事が無いように対策している。

罫線自動修復が無反応になった場合にはESC押下で中止

ただし、一般にEXCELのファイルを編集や上書き保存を何度も繰り返していると、いわゆるゴミがセルに溜まっていく問題がある。

つまり見た目はデータが無い空のセルなのに書式設定などのゴミが残っているなどだ。その結果、ファイルが肥大化したり、動作が重くなったりする事がある。

そのゴミがもしエクセルシートの最下行とか最右列などに有れば、そのシートを全選択して罫線自動修復を実行すると、実質データ範囲を取り出す処理でもそのゴミを有効データと判定してしまう場合がある。

その結果、罫線自動修復が1行目から最下行(1,048,576行)までとか、1列目(A列)から最右列(XFD列=16,384列)までなどの広大な範囲に対して実行される場合がある。

もしそのような状況で罫線自動修復処理が無反応になってしまった場合には、ESCキーを押下あるいは連打すれば処理中止するように工夫している。

今までテストした限りでは、ESCキー押下で100%中断出来ている。

ただし、完全とは言い切れない。

なので、当ブログ読者の皆さんがもし罫線自動修復アドインをお試しされる場合には、重要ファイルの編集時には、そのコピーファイルで実験するなどの安全対策をした上で罫線自動修復をお試し下さい。

2つの表を1つのエリアとして選択すると誤った修復結果になる

下動画では、前半部分では2つの表を2つのエリアとして選択して罫線自動修復を実行している。後半では2つの表を1つのエリアとして選択して罫線自動修復を実行している。後半部分に注目して頂きたい。

動画 2つの表を1つのエリアとして罫線自動修復を実行すると1つの表になる

上動画に示すように、2つの表を1つのエリアとして選択して罫線自動修復を実行すると予想外の結果となる。というか予想通りかも知れないが。

EXCEL罫線自動修復アドインの制限事項

EXCEL罫線自動修復アドインの制限事項は以下の通り。VBA版もVSTO版も同様だ。

  • Microsoft Excelのバージョン情報
    Microsoft®Excel® 2013 (15.0.5603.1000) MSO (15.0.5603.1000) 32ビット
    でのみ動作確認
  • Excel 2016、Excel 2019、Excel 2021、Excel 2024でも多分動くと思う
  • エクセル罫線の縦線や横線の修復のみ可能
  • 斜め罫線は現時点では未対応
  • あまりにも複雑な表の罫線自動修復は間違う可能性はある
  • 結合セルが有っても動作する(はず)
  • 修復範囲内のセル内データや罫線以外の他の属性(背景色、その他)には影響は無いはず
  • あくまで個人作成なので商品レベルの動作確認やバグ調査は不十分

などです。

罫線自動修復アドイン開発経緯

罫線自動修復アドインはどのようなロジックになっているのか?

読者の皆さんは、罫線自動修復アドインはどのようなロジックになっているのか興味あるだろう。

実は、そんな複雑な処理はしていなくて、罫線が消えた表に対して罫線が残っている部分を見つけて、その線種(実線、点線など)と線太さの情報を取得して消えている罫線を描いているだけなのだ。

ただしオリジナルの罫線自動修復VSTOアドインは五年前に作ったもので、そのアドインすら更にその数年前にVSTOアドイン製作を自習していて罫線関連の処理を実験したVisual Studioのプロジェクトを見つけて、それを流用して作成したものだ。

でも昔のことなので、作ったワテ自身、良く覚えていない。

今回その五年前記事で紹介した罫線自動修復VSTOアドインのVB.NETソースコードをVBA版に移植作業を開始した。

VSTOのVB.NETコードをVBAコードへ変換はChatGPTさんに依頼

その際には、ChatGPTさんの力を借りながら、少しずつVB.NETコードをVBAに変換した。

とは言っても、VBA版のソースコードやロジックをVB.NETに自動変換する事は困難だ。

なので、全プロジェクトの複数のファイルを一発で自動変換するなどは不可能なので、クラス定義や関数を1つずつ変換して行った。

作業を開始するとChatGPTさんの優秀さには驚いた。VB.NETコードで書いた関数をVBAコードに変換してくれる。

まあ今の場合はEXCELのセルの操作なので、VSTOでもVBAでもセル操作に関する処理はどちらでも行えるので変換操作はやりやすい。もちろん間違いもあるが、自分でコードを書く作業に比べれば作業効率は何十倍も速い。

その結果、数時間くらいでVSTOのVB.NETコードをVBAに書き換え成功し、無事にVBA版の罫線自動修復が動作したのだ。

それはにワテ自身も驚いた。ChatGPTさんの協力が有ればこんなに効率良くプログラミングが可能なのか!と。

で、試しに「Undo/Redo処理も追加したいのだが」と、ChatGPTさんに相談した。

その結果、ChatGPTさんが言うには「あなたのコードはUndo/Redo処理を組み込みやすいロジックになっています。Undo/Redo処理を組み込んだコードを示しましょうか?」と。

そこでワテは「はい、お願いします。」と言うと、まずはUndo/Redo処理に必要なクラス定義など行い、あとは今まで完成しているコードにUndoやRedoの処理を追加してくれた。

ただし、当然ながら一発では動作しない。ChatGPTさんが出力するソースコードにはバグも有ればロジックの間違いもある。ただし、ChatGPTさんがやろうとしている処理の意図を理解出来れば、あとは自分で間違いを訂正すれば良いのだ。

まあそのChatGPTさんの意図を理解するのは難しいのだが、やれば出来る。ワテも勉強になるし。

その結果、Undo/Redo処理も案外簡単に組み込めたのだ。いや~、ChatGPTさんは優秀だ。

今回採用したUndo/Redo処理のロジックは他のVBAやVSTOアドイン作成時にも応用出来るので、大変役立つ。とは言っても今後、ワテ自身、EXCELアドインはあまり作らないとは思うが。でもボケ防止にプログラミングをやろうかな。

と言う事で、ここまでの作業時間としては合計すると一日くらいで出来た。

Undo/Redo可能なVBA版をVSTOに逆変換も成功

で、その数日後に夜に時間が有ったのでChatGPTさんに質問してみた。

「このVBAコードをVB.NETコードに逆変換してVisual Studio 2022のEXCEL VSTOアドインにしたいが可能か?」と。

そしたら、再びChatGPTさんが大活躍して、VB.NETのコードを一気に生成!

凄いわ。

もちろん、幾つかの修正を経て、こちらの作業は数時間で完了。

もう世界はChatGPTさんに支配されていると言っても過言ではない。

罫線修復機能をRibbonから実行できる

VBA版もVSTO版もEXCELのリボンに登録するようにしたので、リボンから罫線修復/Undo/Redoを実行出来る。

VBAではリボンを直接操作する事は難しいので、この記事で紹介しているOffice Custom UI Editorを使ってリボンに登録出来るようにした。

一方、Visual Studio2022を使えばVSTOにリボンを簡単に入れる事が出来る。

このようにしてVBA版もVSTO版もリボンが動作するようになった。

エクセル罫線自動修復VSTOアドインを試したい人は?

エクセル罫線自動修復VSTOアドインを試したいと言う読者の皆さんもいるかも知れない。

なので、近日中に当サイト https://www.wareko.jp からダウンロード出来るようにしたい。

ワテ自身はVisual Studio2022のデバッグビルドしたVSTOは何度も実行して試しているが、Visual StudioでVSTOの「発行」機能を実行して作成したセットアップファイル(setup.exe、その他)は自分のパソコンではインストール実験はしていない。その実験も近日中に予定している。

当アドインに興味ある読者の皆さんがおられましたら、当記事下部のコメント欄か下記メールアドレスからご連絡下さい。

個人の趣味的な利用の場合には無償で公開するかな。

もし罫線自動修復アドインを自社の業務効率化に使いたいというような企業、団体、個人事業主などの場合には、有償VSTOアドインとして販売しようかな。あるいはアマゾンギフト券でも良いが。

あるいはVBA版やVSTO版のソースコードを購入したいと言うような、嬉しいお問い合わせも歓迎です。

問い合わせ: wareko77@gmail.com

まとめ

ワレコ
ワレコ

罫線自動修復アドインの初期版製作は五年前の事なのに、すっかり記憶にない。

この調子ならあっという間に五年、十年と経つぞ。

まさに光陰矢の如し

当記事では、ワテが五年前の記事で紹介したEXCEL罫線自動修復VSTOアドインを、VBA版に移植した作業を紹介した。

ChatGPTさんに協力してもらいながら作業した結果、案外簡単に移植に成功した。かつUndo/Redoの処理も追加することに成功した。

その結果、エクセル作業中に何らかの作業で罫線が消えてしまった場合には、自動で罫線修復が出来るし、もし修復結果が期待した結果でない場合にはUndoも可能となった。

Undo/Redoを実装出来たことで実用性がかなり高まったのだ。

かつ、VBA版をVSTO版に逆変換も成功したので、VSTOアドイン(COMアドインの一種)でも罫線自動修復/Undo/Redoの処理が可能となった。

頭の体操の為には時々はプログラミングをするのも良いな。

プログラミング関連書籍

Excel VBA関連書籍をすべて見る>>>

Excel VSTO関連書籍をすべて見る>>>

Visual Studio関連書籍をすべて見る>>>

Visual StudioとVisual Studio Codeは別物なので要注意だ。

Visual Studio Code (VS Code)でExcel VSTO (Visual Studio Tools for Office)開発を行うことは現状では出来ない。

Visual Studio Code関連書籍をすべて見る>>>

(つづく)

スポンサーリンク
コメント募集

この記事に関して何か質問とか補足など有りましたら、このページ下部にあるコメント欄からお知らせ下さい。

ExcelVB.NETVBA
スポンサーリンク
シェアする
warekoをフォローする
スポンサーリンク

コメント