t-hom’s diary

主にVBAネタを扱っているブログです。

VBA

VBA 正円同士の当たり判定用クラス

ゲームでは正確性よりもスピードが求められる場面がある。 当たり判定もその一つで、キャラ同士がぶつかったかどうかの判定は矩形や正円などに単純化して表現される。今回Twitterで羽毛田氏がたい焼きのキャラの当たり判定の方法を模索してるようなので以下…

PowerPoint VBA サンプル ~ フロー図のコネクタだけ選択・複数シェイプに書かれた数字を一括インクリメント

VBA

何やらTwitterでPowerPoint VBAネタがよく流れてくるので便乗してみる。と言っても新規ネタは無いので昔Webサイトに掲載した内容の再掲。 パワーポイントVBA - You.Activate (サイトの方のアクセスは微量なのでなかなか日の目を見ない。) フローチャート等…

VBA IfやForの終了構文を自動補完するマクロ

VBA

※タイトルにつられた皆さん。多分イメージしてるものと違いますのでガッカリされないようご注意ください。Twitterで、IfやForの終了構文を自動補完することができないのかなという疑問が投げかけられた。 VBEには文字入力を検知してマクロを走らせるような機…

VBA 複雑な罫線をVBAで描き分ける

VBA

Twitterでお題が流れてきたので乗っかってみた。方眼紙Excelの正しい使い方。 pic.twitter.com/a05wFJpatH— waenavi (@waenavi_jp) 2018年8月31日これの本人返信ツイートでマクロは禁止ですと書いてあったんだけど気にせずにマクロ記述時間込みでトライアル…

VBA オートシェイプを使った泡のアニメーション

TwitterでJavascriptを使った綺麗なアニメーションが流れてきたので、VBAでも真似してみた。 ics.media本家の躍動感まではコピーできなかったけど、それなりに見栄えのするアニメーションができたので紹介。 作り方 まずSheet1のオブジェクト名をプロパティ…

VBA 業務フローチャートをマクロで簡単に作成するツールの更新と公開

VBA

以前、フローチャートを作成するツールの作り方を紹介した。 thom.hateblo.jpこちらの反響が良かったのと、ちょうどお盆休みをいただいてて良い機会なのでもうすこしブラッシュアップし、GitHubで公開してみた。 公開場所とダウンロード方法 以下のリンクに…

VBA For Eachが順番を保証しない理由を自作のコレクションで説明

今回はVBAのFor Eachステートメントが仕様上、出力順を保証しない理由についてC#で作った自作のコレクションを使って説明してみようと思う。さて、普段ならコードから紹介して後で説明に入るスタイルを取るが、今回はちょっとややこしいのでいきなり本題の説…

VBA セル上で文字列の置換を取り消し線と置換後の新しい色で表現する

元ネタはこちら。おもしろそうなのでやってみた。 infoment.hatenablog.com今回やりたいことは、文字列の一部を置換したときにその履歴そのものを取り消し線と色で表現したいというネタ。つまり図示するとこういうこと。 参照元の記事では1回目は上手く行っ…

VBA 循環的複雑度という指標でプロシージャの複雑度を測ってみる

VBAに限らずすべての言語に言えることだが、プロシージャが複雑になればなるほどバグが混入しやすくなる。そこで今回はプロシージャの複雑度を測る「循環的複雑度」という指標を紹介する。 何がどう循環的なのか知らないけど、名前が醸し出すややこしさとは…

VBA マージソートの為に配列を左右に分ける計算式の妥当性を検証する方法

VBA

今回すんごいスコープを絞ったタイトルにしたけど、それには訳がある。このブログで過去にマージソートのコードを紹介した。 thom.hateblo.jpその際コードを作るのにとても苦労したので、もう少し配列を抽象的に扱えるクラスを作って楽にマージソートしよう…

VBA TRANSPOSE関数で一次元データのみの二次元配列を一次元配列に変換する。

VBAでは、セル範囲と配列の相互変換ができるが、たとえ1列分しか変換しなくても二次元配列となってしまう。参考 infoment.hatenablog.comVBAのJoin関数でひとつの文字列に加工しようと思ったら色々と工夫が必要なのだが、実はワークシート関数のTRANSPOSEを…

VBA プロシージャ呼び出しの仕組みから再帰を理解する

以前に以下の記事で再帰を説明するのに、普通の関数呼び出しに置き換えるアプローチをとった。 thom.hateblo.jp今回はそもそものプロシージャ呼び出しの仕組みから説明しようと思う。例えば以下のコードでProcedureCall1を実行してみる。 Sub ProcedureCall1…

VBA 固定長のコードを扱うオブジェクトをクラスモジュールで作ってみた

業務では固定長のコードを扱うプログラムを作ることがある。例えば以下のようなコードがあったとする。 20180728MPGこれは私が考えた適当なコードだが、2018年7月28日生まれの男性プログラマーを表すことにする。つまり先頭8桁が生年月日、次の1桁が性別、最…

VBA Select Case文における条件式の短絡評価活用の是非について

VBA Select Case文における条件式の短絡評価活用の是非について述べる。 前提 以下の書籍で、Select Case文の条件式短絡評価について記載されているが、そのテクニックとしての是非についてTwitter上で疑問が上がっていた。入門レベルでは決して足りない実務…

VBA オブジェクトのメソッドチェーン

メソッドチェーンとは メソッドチェーンとは、ひとつのオブジェクトに対して複数メソッドを1ステートメントで実行するテクニックである。 具体的には、オブジェクトのメソッドが自分自身を返すように設計することで、メソッドをドットで繋ぐだけで次々とその…

VBA マクロで利用する設定値をシートに保存し、文字列でアクセスするテクニック

VBA

今回はマクロで利用する設定値をシートに保存し、汎用的に文字列でアクセスできるようにするテクニックの紹介。 作り方 標準モジュールを挿入し、プロパティウィンドウからオブジェクト名をConfgに変更する。 Configモジュールに以下のコードを張り付ける。 …

VBA モジュールのプロシージャは呼び出し順に書く

VBAでは互いに関連するプロシージャをひとつのモジュールに纏めることが多い。 このとき、呼び出す側と呼ばれる側のどちらを先に書けば良いだろうか。以前の私の考えでは、例えばProc1がProc2を呼び出すとき、呼ばれる側を先に定義しておくという意味で先に…

VBA 専用ツールを使わないカスタムリボン作成チュートリアル

今回はマクロを実行できるリボン作成方法の紹介。 Excel2013をターゲットにしている。2010でもほぼこの通りにできるが、微妙にrelsに指定するURLが違ったりするのでうまくいかない場合は他のサイトを合わせて確認することをお勧めする。 ブックの準備 新規ブ…

VBA バグの回避コードは別プロシージャに分離し、説明的な名前をつけ、懇切丁寧にコメントする。

プログラミングでどうにもならないバグに出会ったとき、そのバグを回避するコードを書くことになる。 バグの回避コードというのは厄介で、単体で読んでも一見何をやっているのかさっぱり分からないことが多い。これをメインの処理コードに混ぜ込むと、メイン…

VBA バグ?Number Formatがコピーされない事象

作成中のマクロでバグっぽい事象が確認されたのでメモ。 発生した環境はExcel 2013 32bit on Windows 10 Home 64bit。マクロというよりは、手でやっても同じことになるので手作業の方を先に紹介。 新規シートを挿入する。 B1セルに時刻を入力する。 A1:B2の2…

VBA 角丸四角形の角の丸めサイズを統一するマクロ(Excel・PowePoint・Word対応)

VBA

角丸シェイプは普通の四角形に比べて柔らかい印象を与えるため、よく使用される。しかし普通に配置すると、シェイプのサイズによって角丸のサイズも拡大・縮小するため、丸めサイズが不揃いで格好悪い。 諦めているか、目視で微調整している方がほとんどだと…

VBA オートシェイプの吹き出しの剣先を狙った位置に表示させるマクロ

VBA

オートシェイプを扱うマクロで特にややこしいのがAdjustmentsプロパティの調整だ。Adjustmentsはシェイプを選択したときに黄色のハンドルが表示されるもので、ドラッグすることで調整ができる。 説明などでよく利用される吹き出しもAdjustmentsプロパティを…

VBA 変数宣言はIfやFor等のコードブロック中に書いても機能する

VBAでは、変数宣言をIfやFor等の制御構文の中に書くことができる。 作法としてどうなのって話は一旦置いといて、とりあえず実証してみよう。以下のマクロは正常に実行できる。 Option Explicit Sub hoge() If False Then Dim variable As Integer End If var…

VBA 重なっているシェイプをグループ化するマクロ

今回の記事は重なりあうシェイプを自動判定してグループ化するマクロ。 といっても以前にクラスモジュールを使用してシェイプ同士が重なっているかどうかの判定までは作ってるので今回は手入れしてちゃんとグルーピング部分まで完成させたのでコードの紹介の…

VBA オートシェイプのグループを再帰的にグループ解除する。

VBA

今回は多重的にグループ化されたシェイプを全てグループ解除するマクロを紹介する。 グループ化されたもの同士がさらにグループ化されていると、一度解除しても以下のようにまだ子グループが残る。 もう一度解除するとようやくすべてのシェイプが分解される…

VBA Excelのウィンドウを最前面に出してから、元の重ね順に戻す方法

VBA

今回はExcelのウィンドウを1秒ほど最前面に出してから、元の重ね順に戻すマクロを紹介。 マクロというか、ほとんどAPI処理になってしまった。何がしたかったかというと、以前作成したスクリーンショット自動貼り付けマクロ(以下)において、貼り付けがうまく…

VBA 税法条文のカッコ書き部分にオリジナルの書式を適用する。

TwitterでVBA検索してたら面白そうなネタがあったので乗っかり。税法のカッコ書きの部分にオリジナルの書式を適用するマクロが作りたい様子。ふむふむと思って調べてみた。 十 同族会社 会社(投資法人を含む。以下この号において同じ。)の株主等(その会社…

VBA SubとFunctionとPropertyの使い分け

VBAには3種類のプロシージャがある。SubとFunctionとPropertyだ。 しかしその守備範囲はキッチリ線引きされているわけではなく、使い分けに困る場面がある。今回はその使い分けのヒントとなる考え方を紹介する。なお、3種類と書いたがProperty にはLet・Set…

VBA Publicなプロシージャをマクロの実行メニューから隠す方法

ユーザーに実行させたくないマクロを「マクロの実行」メニューから隠す方法として最も簡便なのはプロシージャをPrivateにしてしまうことだ。 しかしマクロがある程度大きくなると、複数のモジュールにプロシージャを分散させたい場合がある。他モジュールか…

Static変数を利用してステータスバーに文字をスクロールさせる。

VBA

今回はExcelのステータスバーに電光掲示板のように文字をスクロールさせるマクロを紹介。 もともと作りたかった案件とは違うが、そちらが失敗して副産物として単体で何か使えそうな気がしたので簡単にメモ。矢印の方向に文字が流れる。 コード ※Mainプロシー…

当ブログは、amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、 Amazonアソシエイト・プログラムの参加者です。