t-hom’s diary

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

VBA

VBA 数値をふりがなに変換するマクロ

VBA

今回のマクロは、数値をふりがなに変換するマクロの紹介。 例えば1なら「いち」、290なら「に / ひゃく / きゅう / じゅう」という具合だ。これの何が難しいかというと、単純に数値の読み「1~9」と位の読み「じゅう・ひゃく・せん」を組み合わせればできる…

VBA 減量のためのカロリー計算

VBA

ちょっと最近太りぎみなのでそろろそマジでダイエットでもしようかと思い立ったところ、世の中には種々様々なダイエット法が存在していて、一体どうすれば良いのか混乱する。ただ基本的には、シンプルにこういう式で表すことができる。 摂取エネルギー > 消…

VBA 電波の図形を作成するマクロ

VBA

今回は電波の図形を作成するマクロを作った。 といってもサイン派みたいなのではなく、イラストでよくある電波でてますよーというアイコンみたいなもの。 下図のように基本図形の「円弧」を使って作画するのだが、手動でやるとどうにも綺麗にできないのでプ…

VBAで外部ツールを使わずに簡易テスト駆動開発をやってみる。

VBA

最近会社の会議でTDDが話題になった。 TDDとは何か?まずWikipediaを引用してみる。 テスト駆動開発 (てすとくどうかいはつ、test-driven development; TDD) とは、プログラム開発手法の一種で、プログラムに必要な各機能について、最初にテストを書き(これ…

VBA 開発中マクロブックのバックアップを取るマクロ

VBA

開発中のマクロで、こまめに保存しておきたいケースがあったのでコードを書いてみた。 これは開発中のブックに埋め込んで利用する前提。私は標準モジュール「DevTools」に保存して使っている。 Sub BackupFile() 'Microsoft Scripting Runtimeへの参照設定が…

Excel VBAでスクロール可能なフォームのアイデア

Excel VBAでフォームを作る際に、項目が多くてウインドウの高さに収まりきらないことがある。 そこで今回はスクロールによってフォーム全体をウインドウに収めるアイデアを紹介する。言葉では何がやりたいのか伝わりにくいと思うのでまずは動作イメージから…

VBA 連続して与えられた数の最大値、最小値を求めるクラス

今回は連続して値を投げ込み、その最大値・最小値を求めるクラスを紹介する。 かなりシンプルなのでわざわざ記録しておくこともないかなと迷ったけど、クラス初心者向けにはちょうど良いサンプルになりそうなのでとりあえず。 クラスモジュールのコード クラ…

VBA 呼び出し履歴を使ったデバッグ

VBA

VBEditorには呼び出し履歴という機能がある。たとえば、プロシージャProcAからプロシージャProcBを呼び出した際にProcBで実行時エラーを吐いて中断したとする。 このとき、中断モードでプロシージャ呼び出しを遡ることができる機能である。本記事ではこれを…

VBA Debug.Print、Debug.Assertの代用クラス案

Debug.Print、Debug.Assertはいずれもデバッグ用の機能なので、リリース版のコードには不要である。 かといって消してしまうと、次にコードを修正するときに面倒なので残しておきたい。そこで代用クラスを作ってみたので紹介。まずクラスモジュールを挿入し…

VBA アサーションチェックとは

最近Twitterで何件か、Debug.Assertについて語られているのを見かけたので乗っかってみる。Debug.Assertの使い方自体は以下で述べたので今回はその意義を中心に説明してみようと思う。 thom.hateblo.jp アサートとは Assertという英単語には、主張する・断言…

VBA ユーザーフォームでDual Listboxを作成

今回紹介するのは、複数アイテムの選択でよく見かけるDual Listbox UI。 一応説明しておくと、左のリストからアイテムを選択し、右へ移動させ、最終的に右にあるものが選択したアイテムとして扱われるユーザーインターフェースだ。構造はそれほど難しくない…

VBA 繰り返される定常業務の工数を見える化するアイデア

VBA

サービス業において、業務工数を見える化するというのはとても難しい。 実績ベースで工数入力をしている職場は多いと思うけど、実際のところその方法は担当者の匙加減で何とでもなってしまう。工数分析をしようと思ったら、工数は理論値で出して、実績との乖…

VBA 特定日付が、第何週目の何曜日なのかを求める関数

VBA

今回は特定日付が、第何週目の何曜日なのかを求める関数を紹介する。 といっても曜日はWeekday関数やFormat関数で簡単に求まるので、今回紹介するのは月のうちの何週目に相当するかを求める関数だ。まず、特定月のうち何週目に当たるのかは、次の関数で求め…

PowerPoint VBA スライドにプロジェクトのスケジュール図をプロットするマクロ

VBA

今回はパワポでよくあるこういうスケジュールスライドを作るVBAコードを紹介。 と言っても現段階では完成度は低いのであまり期待されると困ってしまう。ところどころハードコーディングしているし、クラスモジュール内でSelectionを参照しちゃってるし、変数…

VBA マクロのバージョン番号の付け方

ソフトウェアは一度作って終わりではなく、公開後もバグの修正や機能向上のため修正を繰り返すことになる。 マクロも同様で、通常はバージョン番号をつけて管理したりする。バージョン番号の付け方は特に決まっているわけではないが、一般的には次のルールに…

VBA Win32API GetAsyncKeyStateを使ってマクロ実行時に特定キーが押されているかを検知する。

VBA

今回はWin32APIのGetAsyncKeyStateを使ってマクロ実行時に特定キーが押されているかを検知するコード。 この手の情報は既に沢山出ているが、検索したサイトはいずれも情報が完全ではなかったので少し苦労した。では、早速完成コードを紹介する。 今回はシフ…

VBA フローチャート作成ツールBread Chartに挿入機能検討

VBA

先ほど新版を公開したところだけど、以前から悩んでいた機能がなんとか実現できそうな感じがしてきたので、取り急ぎコードだけここに書いておく。 thom.hateblo.jp 実現したい機能 たとえば下図のようなことをやりたいとする。 しかし、単純に列ごと切り取っ…

VBA フローチャート作成ツール(BreadChart)の更新 Version 1.2

VBA

GitHubで公開しているフローチャート作成ツールをアップデートしたので変更点のご案内。 入手場所 こちらからアクセスしていただき、 github.com以下のDownloadボタンで入手できます。 更新内容 Configシートでシェイプの色を指定できるように変更 Process・…

VBA 狙った範囲だけをAutoFitするマクロ

VBA

以下のような表を作ったとき、普通にオートフィットをかけるとA1セルに入力されたタイトルの幅もカウントされてしまい、幅がおかしくなる。 ↓AutoFit後 今回はこれを何とかするマクロ。元ネタはこちら。こういった表、よく作るんですが、列幅のオートフィッ…

VBA そのマクロ集約、ちょっとまった!

たとえば、とあるデータを次のようなステップで加工しているとする。それぞれのマクロはボタンを押すだけで完了する。 だったら、わざわざ3つもボタンを押させる意味はあるのか。 普通はそう考える。そしてボタンを3つ押す作業を一つのボタンに集約する。こ…

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

冪等性(べきとうせい)とは、ある操作を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を使って、文字列の幅を測りなが…

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