t-hom’s diary

主にVBAネタを扱っているブログ…とも言えなくなってきたこの頃。

VBA

マクロ作成者が覚えておきたい重要な概念「冪等性(べきとうせい)」について

冪等性(べきとうせい)とは、ある操作を1回行っても複数回行っても結果が同じであることをいう概念である。 言葉の響きは難しいが、これはプログラマーなら何度も遭遇するシチュエーションなので、是非とも覚えておきたい。たとえばExcelマクロにおいて、以下…

VBA 私のコーディング風景垂れ流し動画紹介

先日Twitterでは公開したんだけど、ツイッターは鍵垢なのでこちらでも公開。20分くらいあるので倍速再生でも良いかも。以下に最初に動画内でテキスト入力してる内容を転記したので、1:30まで飛ばしてそこから見ていただけたら良いかと思う。 みなさんこんに…

VBA イミディエイトウインドウを使って簡単にカレンダーを作る方法

VBA

Excelでは色んな方法でカレンダーを作ることができるが、割と面倒くさい。今回はイミディエイトウインドウを使って、以下のようなカレンダーをサクっと作る方法を紹介。 まず、曜日を描きたい場所を範囲選択しておく。 そしてイミディエイトウインドウで次の…

VBA 過去直近のX曜日を求めるワンライナーコード

VBA

今回はさくっと短めの記事。まず過去直近の日曜(当日含む)の日付を求めるコードがこちら。 ?date-weekday(date,vbSunday)+1 クエスチョンマークは、イミディエイトウインドウで実行することを想定して書いている。 そして当日を含まない過去直近の日曜の日付…

VBA Excelがフリーズするほど大量のデータを特定列の値で分類して別シートに分ける処理

※注意 今回の記事はアイデアを記したものであり、コードの全体は掲載していません。ヒントを求めている方向けです。答えを求めてる方はごめんなさい。Excelシートの特定列の値でレコードを分類し、個別のシートに転記する処理を作りたい場合がある。 いつも…

VBA タイムスタンプからユニークキーを生成する。

VBA

Excelでレコードごとにユニークキーが欲しくなることがある。ユニークキーとは、一意にアイテムを特定でき、変わることのないコードのことで、数桁の数値や文字列で表現される。 実用上は単純な連番でも全く問題ない。ただ以下のようなシチュエーションで連…

VBA オートシェイプを使って般若心経をスクロールするアニメーション

今回の記事はオートシェイプを左から右へスクロールさせながらメッセージを表示させるマクロ。 ありがたいお経を題材にしてみた。 コード クラスモジュール クラス名は「CharBox」として、以下のコードを張り付ける。 Private sh As Shape Private limit As …

VBA 環状矢印を複数個つなげてリング状にするマクロ

VBA

オートシェイプで矢印を綺麗な環状に並べたい場合がある。 その名の通り「環状矢印」というシェイプを使うのだが、手でやるとなかなか綺麗にできない。 試しに手でやってみたのがこちら。。 ひどい。そこで今回は環状矢印を綺麗に並べるためのマクロを作成し…

VBA マクロでExcelのシェイプを旋回運動させる

VBA

こちらの記事に触発されて、ちょっと昔やった別の方法をご紹介。 infoment.hatenablog.com参照元はとても王道的に計算してるんだけど、私のは手抜き。コードはこちら。 Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Sub FakeCi…

VBA Win32APIを使って、文字列の実描画幅を取得する。

VBA

PCのフォントには固定幅のものと可変幅のものがある。固定幅のフォントは単純に同じ文字数で改行すれば綺麗な矩形になるが、可変幅のフォントでは単純に同じ文字数で改行してもガタガタになる。これを概ね揃うようにWin32 APIを使って、文字列の幅を測りなが…

基本情報技術者の受験に役立つ、過去に書いたVBA記事の一覧をまとめてみた。

新年の初投稿で書き忘れてたので。さて、新年と言えば去年はこのような記事を書いた。 thom.hateblo.jp節目のブースト効果で、今年こそは何か資格を取ろうとか、色々考えている方もいると思う。 私が購読しているブログでも新年の意気込みが。 今さらながら…

VBA Dir関数とFileSystemObjectの比較

※ 冗談の通じない方はご退場願います。はじめに私の立場を明確にしておくと、私は個人的にFileSystemObject(以降FSOと記載)が好きで、Dir関数はあまり好きではない。従ってDir関数で事足りる処理でも基本的にVBAコードではFSOを利用する。この記事ではその理…

VBA 標準モジュールの分割基準

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を呼び出すとき、呼ばれる側を先に定義しておくという意味で先に…

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