素人がExcelVBAによる「一人働き方改革」に挑むブログスマートフォン用の表示で見る素人がExcelVBAによる「一人働き方改革」に挑むブログExcelVBAネタです。存在は知っていたけど、実はやったことなかった。Edition』の説明が実にわかりやすかったので、ちょっとやってみようと思った。今回は、三つのクラスモジュールを用いる。Ahoクラスアホを表すクラス(笑)。AhoesクラスAhoクラスのインスタンスの集合体を表すクラス。このクラスにイベントを装備する。AhoTestクラスAhoesオブジェクトでイベントが起こったときに、そのイベント発生を検知して処理を行うクラス。うーむ、わかりにくい。詳しくやろうとしていることを述べる。AhoesオブジェクトにAhoオブジェクトを追加するAddメソッドを持たせる。AhoesオブジェクトでAddメソッドが実行されると、Addedイベントが起こるようにする。AhoTestオブジェクトにAddedイベントを検知したときに実行されるイベントプロシージャを置く。これで、AhoTestオブジェクト内の処理でAhoesクラスのAddメソッドを実行したときに、イベントプロシージャが実行されることになる。うーむ、やっぱりわかりにくい。Ahoクラスを作るまずは、Ahoクラスを作る。Subinitメソッドで名前を設定する。Nameプロパティを持ち、introduceMyselfメソッドで素敵な自己紹介をするクラス。Ahoesクラスを作る次に、先ほど作成したAhoクラスのインスタンスを大量に保持することのできるAhoesクラスを作成する。Function組み込みのCollectionクラスをラップしたクラスにしている。Nextで回せるようにしたりしているのだが、今回は関係ないのでパス。String)というやつ。「このクラスはこんなイベントを持っています」というもの。引数を持たせることができるので、イベントを検知して実行するプロシージャに引数を渡すことができる。Added(AhoName)というやつ。読んで字の如しで、この行が実行されると「イベント発生!」ということになる。event」と説明されていた。「発火」というイメージ。AhoTestクラスを作るさて、ここまででAddedイベントが起こるようにすることはできた。Ahoesクラスのインスタンスを作成して、Addメソッドを実行すれば、めでたくAddedイベントは起こる。このままではただイベントが起こるだけ。人知れずイベントが発生して終了し、見かけ上は何も起こらない。イベントが起こったことを検知して、何らかの処理を行わねばならぬ。そのために、イベントに対応して処理を行うクラスを作る。それが、AhoTestクラスである。"おれぁ、そういう男よ。Subポイントは二つ。Ahoesクラスのインスタンスを保持するためのモジュールレベル変数なんだが、WithEventsというキーワードが付いている。"おれぁ、そういう男よ。Subこいつが、Addedイベントが検知されたときに実行されるプロシージャ。AhoesObjectという変数にぶちこまれたAhoesオブジェクトでAddメソッドが実行されると、こいつが実行されるのだ。使ってみる次のコードで使ってみる。SubAhoTestクラスのインスタンスを作成し、AhoTestクラスのAhoesプロパティでAhoesオブジェクトを取得してAddメソッドを実行する。AhoTestクラス経由で[Ahoes].Addメソッドを実行することによって、イベントを検知してAhoesObject_Addedを実行させようという目論見。うーむ、やっぱりわかりにくい。よって、単純に実行結果をお目にかけるよりも、ステップ実行の様子をお目にかけた方がよかろう。おわりに標準モジュールでWithEventsキーワードを用いた変数宣言ができたら、もうちょっと簡単に説明ができるのだが、残念ながら標準モジュールでは不可。modules.と書いてある。modules"にはシートモジュールも含まれるので、今回の例の場合、別にAhoTestクラスなんぞ作らずとも、シートモジュールを使えば同じことができます。"おれぁ、そういう男よ。Subそれにしても、わかりにくいなあ。わかりやすい説明が思いついたら、書き直そう。VBA自作メソッドキーワードをカッコで括るマクロWordドキュメントの中に出てくるキーワードをカッコで括るマクロ。キーワードの部分を取得するまずは、キーワードの部分を取得しなければならない。Rangeオブジェクトとして取得すれば、あとは[Range].Textプロパティを書き換えればオッケー。FunctionおなじみFindオブジェクトを用いてキーワードを検索する。Find.Executeメソッドを実行すると、キーワードがヒットした場合、その箇所が選択された状態になる。この性質を利用して、Selection.Rangeを参照し、返ってきたRangeオブジェクトを返す。検索でヒットしなければ、Find.FoundプロパティがFalseを返すので、その場合はNothingを返すことになる。このメソッドを用いて取得したキーワード部分の[Range].Textプロパティをカッコ付きの文字列に書き換えてやる。Subドキュメント内の「アホ」を「[アホ]」に書き換えるマクロ。ついでにフォントをゴシック体に返るようにしている。実行このようなドキュメント(笑)を用意し、上掲のリスト2を実行する。VBA自作メソッドWordドキュメント上で指定した段落以外の段落を折り畳む段落を折り畳むことができる知らなかった。Wordの標準機能にあった。次をご覧いただきたい。「百聞は一見に如かず」と偉そうに言った割にはわかりにくい画像ですまないw見出しスタイルを当てた段落は、左側に「・」(ポツ)が付く。このポツにカーソルを近づけると、小さな三角形が表示される。そいつをクリックしてやると、その見出しに属する本文が折り畳まれたり、展開されたりするのだ。こいつをVBAで操ってみる。[Paragraph].CollapsedStateプロパティ[Paragraph].CollapsedStateというプロパティがある。こいつがTrueだとその見出しに属する本文が折り畳まれ、Falseだと展開される(表示される)という仕組みらしい。Boolean.とのこと。指定した見出しスタイルに指定したキーワードが含まれている段落のみ表示するメソッド長ったらしくて意味が取りづらくてすまぬ。いう見出しの段落だけを表示して、他の見出しの段落本文は折り畳んでしまおう、ということ。要するに、こんな状態にしたい、ということ。String)'///指定したスタイル名の見出しの段落のみ表示し、他は折り畳む。''///headerKeyを指定すれば、そのキーワードを含む見出しの段落のみを表示。表示したい見出しのキーワード。Sub処理の手順は細かくコメントを入れたので、それを見ればだいたいわかると思う。段落のスタイル名にstyleNameKeyで指定したキーワードが含まれていて、なおかつその見出し段落の文字列にheaderKeyで指定したキーワードが含まれていたら、CollapsedStateプロパティをFalseにし(つまり、折り畳まない。)、それ以外のときはTrueにする(つまり、折り畳む。このメソッドを、先ほどののドキュメント(笑)に対して、次のコードで使ってみる。2」という文字列を含み、なおかつ見出しに「安倍晋三」という文字列を含む段落の本文だけを残し、他の段落の本文は折り畳む、というマクロ。コイツを実行すると、こうなる。改良しかし、上掲のshowOnlySpecifiedParagraphメソッド。困ったことに見出しのキーワードが一つしか指定できない。先のドキュメント(笑)の場合、「議長と銭田掏次郎委員の発言だけを表示させたい」という場合には対応できないのだ。そこで、先の第3引数headerKeyに複数のキーワードが指定できるように改良する。'......(1)''///指定したスタイル名の見出しの段落のみ表示し、他は折り畳む。''///headerKeysを指定すれば、そのキーワードを含む見出しの段落のみを表示。表示したい見出しのキーワード。'headerKeysが省略されていれば、""にする。Function変更したのは(1)~(5)の5箇所。Variant)で第3引数を変更。Variantにして、文字列でも配列でも受け取れるようにした。""は引数チェックその1。第3引数が省略されていたら、headerKeysを""にする。Ifは引数チェックその2。配列でなかったら、値を文字列型にキャストしてheaderKeysに格納。Ifでは、折り畳むかどうかの判定にisToCollapseメソッドを用いている。Trueなら、その段落の本文は折り畳むべし、ということだ。Functionこのとおり。引数tgtArrayの要素のうち、どれか一つでも見出し段落の文字列に含まれていたらFalse(つまり、折り畳まんでいい)を返す。使ってみる次のコードで実験。いう二つのキーワードを格納した配列を渡す。コイツを実行すると、こうなる。発言を折り畳むことができた。おわりに議事録なんかで、特定の出席者の発言だけを抽出したいときに便利だと思います。20:49Wordドキュメント上で指定した段落以外の段落を折り畳むTweet広告を非表示にするもっと読むコメントを書く2020-02-14自作クラスのオブジェクト型デフォルトメンバ......???自作クラスのオブジェクト型デフォルトメンバ......???ちょっと衝撃的な実行結果が出たので報告。Edition』に載っていたテクニック。さんもブログで紹介していたりする。thom.hateblo.jpこれをちょっとやってみたのである。やり方は、ちょっと面倒だけれど簡単。0(XXXXは、当該プロシージャの識別子)を追加して保存プロジェクトに戻って、インポートし直すこれでオッケー。PoweredSheetというクラスモジュールを次のように作成したとする。Subモジュールレベル変数self_にWorksheetオブジェクトを持たせておいて、Selfメソッドで返す、というだけのもの。こいつをエクスポートして、テキストエディタで次のように編集する。Sub付け加えたのは(*)の1行のみ。こいつを上書き保存して、もとのプロジェクトにインポートし直す。開いてみてみると、Selfがデフォルトメンバになっていることがわかる。Subとすれば、psだけでps.Selfのように振る舞ってくれるというわけではない。そもそもコード入力時にこのようになる。デフォルトメンバであるSelf(Worksheet型)のメンバが自動表示されるわけでもない。強引にたとえば「ps.Name」と入力したとて、こうなってしまう。そもそもコンパイルが通らないという屈辱の結果。なんたる屈辱......!秘策、発動すそこでふと、「これ、カッコで括ったらどうなるんやろ???」と思い、やってみた。Sub変えたのは(*)のところだけ。PoweredSheet型の変数psをカッコで括ってみた。「カッコで括っていっぺん評価させてみたらいいんでね?」と思いついたのだ。ウインドウに出力されている。PoweredSheetクラスのインスタンスをWorksheet型変数にほぼそのまま突っ込んだみたいになった。おわりにただし、だからといって(ps).Nameとしてもダメです。このように入力しても、行を移動した途端、こうなりますw自作クラスにオブジェクト型のデフォルトメンバを設定することは、半分可能、ということでいいのでしょうか。](半角モード)をVBAで実現する方法。これまで、[Window].[View].ShowFieldCodesプロパティのオンオフ(True/False)切り替えしか知らなかった。調べてみたら、選択範囲のフィールドコードだけを表示させる方法が判明したので、覚書的に記しておく。FieldオブジェクトのShowCodesプロパティ早い話、[Field].ShowCodesプロパティのオンオフ(True/False)を切り替えたらよい。Subとりあえず、選択範囲にフィールドコードがあることが前提の決め打ちコード。フィールドコードのある部分を選択せずにこのコードを実行したら、当然実行時エラーになるので注意。ドキュメント(笑)上で、このようにルビが施された部分を選択して、リスト1を何度か実行。]を押したかのように、フィールドコードの表示・非表示が切り替えられる。フィールドコードを表示させるFind.Executeメソッドを用いてフィールドコードを置換する再度フィールドコードを非表示にするという非常に面倒な操作が必要っぽいので、いちいち全てのフィールドコードを表示させなくても済む、というのは、処理速度の関係でちょっと有利になるかも知れない。*フィールドコード文字列は、[Field].Code.Textプロパティで取得することができるが、マクロでこのプロパティを書き換えることによってフィールドコードを書き換えた場合、ルビ情報が一部死ぬ。詳しくは、akashi-keirin.hatenablog.comコチラをどうぞ。VBA自作メソッド[Range].PhoneticGuideメソッドを使いやすくする[Range].PhoneticGuideメソッドはちょい使いにくいので、使いやすく改良。改良したコード[Range].PhoneticGuideメソッドは、何といっても引数Raiseが超絶わかりにくい。ゆえに、[Range].PhoneticGuideメソッドをラップして使いやすくした。Subちょっと引数祭り状態だが、そもそも[Range].PhoneticGuideメソッドが引数祭りメソッドなので許してほしい。何といっても、ルビの親文字からの距離を指定できるようにしたことがポイント。実は、めっちゃめんどくさいことをしている。tgtOffsetコメントを読んでもらったら、いかにめんどくさいことをしているのか、わかっていただけると思う。使ってみるたとえば、この状態で、このように「本気」の部分を選択し、次のコードを実行。Subすると、こうなる。ルビの設定を確認すると、バッチリ。同じ箇所を選択した状態で次のコードを実行。Pゴシック」にしてみる。ルビの設定を確認すると、やはりバッチリ。おわりにこれで使いやすくなった。基本、これでルビを設定し、細かなチューニングはフィールドコードをFindオブジェクトを用いて書き換えるようにすれば良い。先日、akashi-keirin.hatenablog.comこのような、衝撃的な実行結果についてお伝えした。今回は、安心の実行結果である。フォントサイズは0.5の倍数のみ?今まであまり気にしたことはなかったのだが、ルビのフィールドコードをいじくっていてちょっと気になったことがあった。ルビのフォントサイズをフォントサイズの2倍の値で取り扱うのかということ。整数にならんぞ?」と思ったのだ。フォントサイズ表示・設定窓に「10.6」を入れてみる初期状態はこれ。選択箇所のフォントサイズは、見てのとおり「12」だ。ここに、「10.6」というちゅ~とはんぱな数値を入力してみる。確定してみると......、ち~んwwwあえなく撃沈wVBAで設定するとどうなるか手動でだめなら、VBAで指定するとどうなるのだろうか。10.6と入力して、[Enter]を押してみる。フォント名に「ち~んw」を指定することはできたが、如何。07:47安心の実行結果(Word)Tweet広告を非表示にするもっと読むコメントを書く次のページプロフィールid:akashi_keirinExcelVBAネタです。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。