はじめに

多量の行が表示されないように、このブログは1コンテンツしか表示されない。ブログアーカイブから、他の記事を捜してくれ。

環境作れし。
・gawk 3.1.5 for Windows をググッて入手。
・gawk.exeをpathの通ったフォルダにぶち込めし。
 (「windows パスを通す」ググッて)
 (面倒なら、C:\windowsにぶち込む)
・環境変数「awkpath」にスクリプトを保存するフォルダを設定。
 (「環境変数 設定 windows」ググッて)
 (面倒なら、C:\windowsに、紹介されているスクリプトぶち込む)

2025年3月12日水曜日

VBA EXCELブック正規表現検索外部結果一覧作成機能(見切れ、LINK抽出) (UPDATE20250317)

 こちらで紹介した EXCELブック正規表現検索外部結果一覧作成機能 に見切れセル抽出とリンク設定セル抽出機能を追加したぞ。

見切れセルに関しては簡易判断している。厳密に判断できない理由はこちらで書いた理由以外に、セルが持つセル幅(文字数、ピクセル数)とWin32APIが返すテキストのピクセル数が食い違っていることも原因となっている。

多分、Excelではテキストの描画にWin32APIではなくDirectDraw系のAPIを使ってるんだろな。

こちらで紹介したコードとは異なり、チェック対象セルをはみ出していても、チェック対象セルから右側50カラム以内にある(文字があるor罫線がある)セルまでかぶらないものは見切れなしの判断をしている。方眼紙的な書きぶりでも見切れチェックができるというわけだ。

リンク抽出は直接リンクを追加しているセルとHYPERLINK関数が書かれたセルが対象となる。
追加後のコードは元記事に貼っている。

※20250317

・セルが持つセル幅のピクセル値と文字列が持つ幅のピクセル値がどうしても合わないぞ。
フォント指定時にWin32APIのSetTextCharacterExtraを使ってみたがそれでも合わない。

特にプロポーショナルフォント使用時や全半角混在文字の時の乖離は顕著だ。

しょうがないので実測結果に基づいて係数をかけて求めているが、フォントの種類、表示する文字によって、すべての場合に正確な見切れを判断できてはいない。

一応、縦書きフォント1行、セル結合、自動で折り畳み等対応しているが、見切れの目安程度に考えろし。
見切れ判断の調整は、コード中GetTextExtentPoint32Width関数内の係数0.72(半角用)、 0.91(全角用)の増減で可能だ。調整してくれ。

・結果ファイルのファイル名はEXCEL同時オープンを考慮しフォルダ単位に簡易ハッシュをプレフィクスに付けている。16進4桁のハッシュなので衝突したら簡便な。

・HDCやRegExpオブジェクト等リソースを都度生成/破棄してるとVBAが暴走するぞ。
VBAのガベージコレクションがショボいせいだと思うが、生成したリソースは解放せず可能な限り使いまわすのがよい。

・ここで超重要な情報だ。VBAのIF文等に使用される条件式のAND、ORは短絡判断を間違う。

IF A AND B THEN・・・の判断でAが偽であってもBの評価を実行してしまう場合がある。
条件Bが自作関数の場合など暴走の危険もある。安全のため、AND/OR 結合式を使わず多段IF文を使えし。



2025年3月10日月曜日

VBA 見切れセル判断関数

パラメタで渡されたセルに見切れが発生しているか判断する関数、TestIsTextClipped()だ。
WindowsAPI バリバリ呼んでるぞ。

VBAのつぼ
50%程度、gemini先生に書かせてみた。
都度、バグを指摘すれば、改善したコードを書いてくれる、、、が、こちらが気が付かないと正しいコードを書いてくれない。
現時点では、自分の能力以上のコードは作ってくれない。
しかし、優秀で仕事の早い後輩程度の助けにはなる。

セル見切れは以下の考慮の元作成したので、判断が正確じゃない場合がある。
・セル内一部の文字だけのフォント・フォントサイズの変更を考慮すると処理が重くなりすぎるので考慮していない
・セルに「縮小して表示」が設定されている場合、高さの見切れは考慮してない。表示上のフォントサイズを取得して、高さの再計算をする必要がある。
・セルに「折り返して表示」が設定されている場合、折り返しの正確なルールを再現できなかったので、高さの見切れに間違う場合がある。英語、日本語の混合ルールは複雑。
・セルの横位置が標準以外の場合、幅見切れを正確に認識できていない。
・セルの横位置が標準の場合、セル標準横余白が不明のため、余白は考慮していない。
・セルが結合されている場合、結合範囲で見切れや折り返しを判断している。

しかし、仕様書等、標準の書式で書かれている文書なら、ほぼ正確に見切れ判断できるだろう。
単体では用途が狭い関数だが、こちらで公開している検索一覧作成機能に追加する予定だ。

2025年3月4日火曜日

VBA 取り消し線文字排除コピー

 セル範囲選択した状態で呼び出すと、取り消し線で消された文字列を抜かしてクリップボードにコピーするぞ。

取り消し線文字排除コピー

セルでの右クリックメニューに「取り消し線文字排除コピー」を追加






2025年3月1日土曜日

VBA EXCELブック正規表現検索外部結果一覧作成機能(20250327Update)

 ※20250327 エラーセル抽出機能追加

 ※20250317 見切れ、リンク抽出機能追加
多量のDB定義書や仕様書から特定項目の内容を抽出したりできる。

自分で作っておいて何だが、マジ神アプリ。これが無いと仕事をしたく無くなる最強マクロだ。

できること
正規表現検索(+図形内テキスト検索)、ブック/シート一覧作成、文字色設定テキスト抽出、塗りつぶしセル抽出、取り消し線セル抽出、太文字セル抽出、文字見切れセル抽出、リンク設定セル抽出、エラーセル抽出


面倒なんでツボだけ解説。あとは下に貼ったスクショみれし。
・シート内セルはコンテンツと計算式の両方をSpecialCellsでデータが存在するセルだけループ対象。2つのSpecialCellsをunionで合成して使用。

・SpecialCellsは複数行範囲指定すると最終セルがバグる。回避のため行ループから呼び出す。

・図のコレクションはグループ指定されてると階層構造データになる。再起呼び出し関数で対応

・図内テキスト検索が不要ならコメントアウトした方が高速になる。

・アドインにするより専用XLSMにした方がいいんでない?
・グループ化された図はTopLeftセルがグループ全体のTopLeftになってしまう。正しいTopLeftを取りたい場合、グループ化解除しろし。
・正規表現不整合な文字を検索ワードに入れると、メッセージを表示し処理中断するぞ。
これを機会に正規表現覚えろし。

・正規表現制御文字自体を検索文字に入れたい場合、直前に"\"を付加しろし。正規表現のお約束だ。

・昭和香るクセのあるコードだ。好き嫌い言うなし。

 End IF を使わない一行IF文多用。マルチステートメント":"やElse節まで1行にはしてないのでマシだと思えし。

 エラートラップは On Error。行番号多用。
 功罪どちらになるか知らんが、VBの文法ではなくBasicの文法だ。


EXCELブック正規表現検索外部結果一覧作成 "外部検索.BAS"