読者です 読者をやめる 読者になる 読者になる

t-hom’s diary

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

VBA XlRgbColor定数をシート上に色相順、明るさ順で出力する

VBA

「あなたの好きな色は何色ですか?」と聞かれたら赤、青、緑、黄、黒、白、紫…まあ、普通はこんな感じで答えると思う。ここで、狐色、若草色、深紅、枯草色といったちょっとこだわった感じの名前を返してくると、「おっ、情緒的でいいな」と思う。ラベンダー…

VBA オートシェイプで作った桜のアイコンでユーザーフォームを可愛くデコレーションする

普段からこのブログを読んでくれてる方は、今回のタイトルを見て「ついにthomもVBAのやり過ぎで頭がおかしくなってしまったか」と思われた方もいるかもしれない。可愛くだなんて。30超えたオッサンが何言うとんねん。 さてさて、今回作ったのはこれ。でん! …

VBA クラスモジュールを使ってセル内の文字を簡単に色づけ

VBAでセル内のテキストの個別の文字に色をつけるのはわりに面倒くさい。たとえばこんな風に、着色したいとしよう。 上のテキストを実現するには、以下のコードを書けば良い。 Sub hoge() Sheet1.Range("A1").Value = "Red, Green, Blue" Sheet1.Range("A1").…

VBAでテンプレートを元にHTMLコードを自動生成する

VBA

今回はVBAを利用してHTMLを生成するテクニックを紹介題材は先日紹介した、参照設定とCreateObjectの対応リスト - You.Activate thom.hateblo.jpこのページはご覧いただくとわかるように、項目名は同じで内容だけ異なるものが複数回出てくる。 ひとつのオブジ…

VBA 中級者を悩ませるプロシージャ分割をマスターする極意

VBA

タイトルで大きく出てしまった。極意だなんてまあよく恥ずかしげもなく。 「だって教えるプロの~」よりマシか。。なんちゃって。ま、是非知ってほしい内容ではあるので、釣ってみた感じ。さて、それなりにVBAを書けるようになった方が次に悩むこととして、…

VBA WSHとScriptingに存在するFileSystemObjectは同一のバイナリーであることが判明

VBエディタから参照設定で「Windows Script Host Object Model」と、「Microsoft Scripting Runtime」の両方にチェックを入れると、どちらのライブラリにもFileSystemObjectが存在する。 今回はこの2つが同じものなのか、それとも別物なのかを検証してみた。…

VBA ありそうで無かった、参照設定とCreateObjectの対応表を作った

VBA

表題のとおり。。。なんだけど、作ったといってもまだたったの6点のみ。 ファイルシステムオブジェクト ディクショナリーオブジェクト WSHシェルオブジェクト WMIオブジェクト InternetExplorerオブジェクト 正規表現オブジェクト しかしこれがまた曲者で、…

(解決済)VBAからPowerShellのパラメーター付きコマンドが実行できずにハマった話

先日以下の記事を書いたが、ひとつ問題が発覚した。thom.hateblo.jpパラメーター付きのコマンドがうまく実行されないのだ。 実行時エラーで、「ファイルが見つかりません」と出てしまう。つまり、コマンドが失敗してテンポラリーファイルが作成されてないと…

VBAから手軽にDOSコマンドやPowerShellを実行して結果を取得するモジュールを作成

VBA

システムの運用をやっていると、VBAからDOSコマンドとかPowerShellを実行したくなるケースがある。 WScript.ShellのExecメソッドなら標準出力が取得できるのだが、一瞬DOS窓が開いてしまうのがちょっと格好悪い。非表示でやりたいと思ったら、Runコマンドで…

VBA マクロ、プロシージャ、メソッドなどの用語について正確に理解する

初心者向けの解説によくマクロとVBAの違いが取り上げられる。 一応違いについて説明した後、同じようなものなのであまり気にしなくて良いと締めくくるケースも多いけど、私はやはり違いを意識したほうが良いと考える。初心者は同じようなものと言ってくれた…

九九、FizzBuzz、じゃんけんの3つをプログラミングの「永字八法」に認定する

漢字の「永」の字には、書に必要な以下の技法8種が全て含まれている。 点 横画 縦画 はね 右上がりの横画 左はらい 短い左はらい 右はらい このことを永字八法(えいじはっぽう)というらしい。カッコイイ!つまり書の練習に「永」という漢字をチョイスすれ…

VBAのコーディングガイドラインを作ってみた

VBAのコーディングガイドラインを作ってみた。掲載先は私のメインサイト。VBA コーディングガイドライン - You.Activateガイドライン作成にあたり参考にしたのはこちらの4冊VB.NETルールブック ?読みやすく効率的なコードの原則作者: 向山隆行,片山優司,阿部…

VBA 「これはマクロ化しない」という決断も必要

VBAを覚えてマクロを作れるようになると、業務を手当たり次第自動化したくなるものだ。しかし安易な自動化は慎むべきかもしれない。このように考えるようになったのは、以下の記事がきっかけだった。 自動化をどこまで進めるか|会社で役立つリスクマネジメ…

VBA SmartArtを使ってシートごとに作業ステップを表示するバーを作成するマクロ

VBA

今回はVBAでSmartArtを使ってシートごとに作業ステップを表示するバーを作成してみようと思う。作成物のイメージはこのようなもの。 今回マクロで作成するのは上部のStepを表示するバーの部分だけ。シート2ならStep2がハイライトされる。 ひとつの業務に使用…

VBA デザインしたユーザーフォームを元にNewで複数のフォームインスタンスを作る。

VBAでユーザーフォームはふつう、単一のオブジェクトとして扱う。たとえば以下のようなフォームを作ったとしよう。 オブジェクト名は「frm成績」としたので、このフォームを表示させるコードはこうだ。 Sub hoge() frm成績.Show End Sub この時フォームは、…

VBA 参照設定とCreateObjectを定数1つで切り替えるテクニック

VBA

VBAで外部のオブジェクトを扱うには、事前バインド方式と遅延バインド方式の2種類がある。事前バインドとはいわゆる参照設定のことで、遅延バインドとはCreateObject関数によるオブジェクト生成を指す。さて、どちらが良いかと言われると一長一短なので困る…

VBA ウォッチウインドウとステップ実行でオブジェクト変数の仕組みを学ぶ

以前クラスモジュールの入門記事でオブジェクト変数はタグのようなものだと書いた。 http://thom.hateblo.jp/entry/2016/12/31/013555#オブジェクト変数は箱じゃなくてネームタグでイメージしよう具体的な仕組みは以下の記事で書いた。 thom.hateblo.jpとは…

ExcelVBAの開発用アドインをGithubで公開してみた

VBA

ExcelVBA開発用のアドインをGithubで公開してみたのでご自由にお使いください。 ただしトラブル発生時は自己責任でお願いします。URLはこちらです。 https://github.com/thom-jp/thoms_ExcelAddIn_for_VBADeveloperファイルの直接ダウンロードはこちらです。…

VBAを写経しながらタイピング練習するツールを作成

今回作成したのは、以下のようなツール。 ※GIFアニメなので読み込み終わって動き出すまで時間かかるかもしれません。 サンプルコードが表示され、その通りに入力していくだけのシンプルなものであるが、次に入力すべきキーとそれを押す指の名前が赤く表示さ…

VBA If文の多重ネストを回避するチュートリアル

VBA

Chemiphysさんのブログで If文のお化けフィールド数が多いデータに取り組む④ - chemiphys’s blogという名言を発見。どうやら条件が増えすぎてIf文が多重ネストになってしまうということらしい。 ちょっと修正してみたので記事にして良いですかと確認を取った…

VBA MsgBoxのオプションはなぜ足し算できるのか

VBAのメッセージボックスでは、以下のように適用したいスタイルを足し算できる。 Sub hoge() MsgBox "処理を続行しますか。", vbYesNo + vbQuestion + vbDefaultButton2, "確認" End Sub 上記のマクロを実行すると、このように表示される。 変な文法だと思わ…

VBA VBエディタ上から実行できるRGB関数入力用のカラーパレットフォームを作成

VBA

ちょっと長めのタイトルになってしまったが、要はこんなの↓を作った。 VBEのメニューからパレットを起動し、目当ての色のラベルをクリックするだけでカーソル位置にRGB関数が挿入される。きっかけはこちらの記事。(感謝) chemiphys.hateblo.jp 作りかた こ…

VBA 複数の引数をとるPropertyプロシージャ

これまでProperty Getは複数の引数を受け取ることができないと思っていたが、昨日Twitterで以下のご指摘をいただいた。@thom__jp https://t.co/pgPwIa8S2pの記事で少し気になったのですが、PropertyLetは複数の引数をとれる(最後の一つが右辺、残りは左辺の…

VBA クラスモジュールでフィールド数の多いデータを扱う

最近読者になったブログにこんなお悩みが。 80以上の要素を持つ400~500件のデータをどう扱おうか悩み中。Powerpoint VBAに触れてみて - chemiphys’s blog自分ならどうするってのを考えてみたので公開。 やはり人のブログを読むと刺激されて執筆が捗る…

VBA 変数宣言で途中改行する

VBAでは、半角スペースに続けてアンダーバーを書くことでステートメントの途中で改行することができる。実は昔、この途中改行が嫌いだった。理由は単に自分が途中改行されたコードに慣れてなかっただけで、慣れてからガンガン使うようになっている。たとえば…

CallByNameを使ったコレクションの非再帰クイック&挿入ハイブリッドソート

VBA

前回はCallByNameを使ってCollectionのバブルソートを作成した。 thom.hateblo.jpそのあとコメントでやりとりがあり、非再帰のクイック&挿入ハイブリッドソートでお悩みの様子。 kantoku.hatenablog.com幸いにもベースになるコードは以下にあるとのことで、…

VBA PowerPointでShapeを一気に削除するマクロ

こちらのブログで、PowerPoint VBAでFor Eachを使ってShapeを消すとうまくいかないという問題が紹介されていた。chemiphys.hateblo.jpやってみたところ、実際に1つ飛ばしで削除される。 実際に検証 Excelで検証してみた。 Sub Excel版ShapeAdd() Dim i As Lo…

VBA クラスモジュール 超 入門

このブログではこれまでにクラスモジュールを活用したコードをいくつか紹介してきたが、使いどころの紹介がメインでクラスモジュールそのものの使い方について一から学べるような構成は取っていなかった。今回は「クラスモジュール超入門」と題してクラスモ…

VBA Application.Runの代わりにCallByNameを利用したCollectionのバブルソート

VBA

以前、Collectionのバブルソートを記事にした。 thom.hateblo.jpこの記事ではCollectionに数値や文字列ではなくオブジェクトが入っていた場合も任意のプロパティを元に比較を行うことができる。プロパティの指定には別途以下のようなFunctionプロシージャを…

コンピューターの得意なことを人間がしない。

VBA

先日、カレンダーのヘッダー作成を題材にコード整理のプロセスを紹介した。 thom.hateblo.jp最終的に曜日ヘッダー作成部分は以下のようにシンプルなサブプロシージャにまとまったのだが、やはりこれを手で書くとなると面倒くさい。 Sub 曜日ヘッダー作成(開…

VBA 私がコードを整理するときの思考プロセスを紹介

今回は私が普段どんなことを考えながらコードを整理しているのかを紹介する。 題材としてはなるべくシンプルなものがよかったので、カレンダーのヘッダー部分を作成するマクロを取り上げた。 最初に書いたコードがどういう風に変化していくか、またなぜその…

VBA Static変数を活用してローテーション表を作成する

VBA

今回はちょっと使いどころの難しいStatic変数を活用してみようというお話。 今回作成するもの 勤務シフト表とか、何かの当番表を作るのに、たとえば鈴木さん→佐藤さん→山田さん→鈴木さん→佐藤さん→山田さん→(略)とローテーションさせるケースがある。 今回は…

VBA ファイル名に入ったyyyymmdd形式の日付をDate型として取り出すための関数を自作

VBA

VBAでDate型の値をyyyymmdd形式にするのはすこぶる簡単だ。 format関数を使えばよい。たとえば今日の日付をもとに、「sample_yyyymmdd.log」というログファイルの名前を出力したかったら、次のように書けば良い。 Sub ログ名を出力() Debug.Print "Sample_" …

VBA If文の多重ネストを避けるためのテクニック ~ 早期リターン、疑似コンティニュー、フラグ変数

VBA

今回は、If文の入れ子を避けるためのテクニックについて説明する。 よくIf文が何重にも入れ子になったプログラムを見かけるけれど、あまり入れ子が深くなると複雑になってしまう。たとえば以下のようなコードである。 Sub Ifのネスト() If a = b Then If c =…

VBA ローカル変数は使用する直前で宣言する

ネットや書籍で見かけるマクロでは、変数宣言はプロシージャの先頭にまとめられているものが多い。一般的に変数宣言はプロシージャの先頭にまとめて書くものだと紹介している記事さえある。それはなぜかというと、みんながそうしてるからだ。先頭にまとめる…

VBA プロシージャ呼び出しのオーバーヘッドについて

今回はVBAでプロシージャ呼び出しにかかるオーバーヘッド時間を計測してみた。 プロシージャ呼び出しのオーバーヘッド改善はコンパイラの領分 一般的に、プログラミングではプロシージャの呼び出しにはオーバーヘッドが発生すると信じている方もいるようだけ…

VBAの標準モジュールはオブジェクトなのか

結論として、私は最近標準モジュールを「オブジェクト」と見做すようになったのだが、そのあたりの経緯と悩みをうだうだと書こうかと。 MSの公式見解によると、標準モジュールはオブジェクト モジュールではない Excel VBAでコードを書ける場所は、Microsoft…

VBA 自分と同じクラスの新規オブジェクトを返すメソッドを作ってコレクションにスマートに代入する

VBAではコンストラクターに引数を渡すことができないので、一旦オブジェクトを作ってから値をセットするという二度手間が発生する。今回はその手間を省くべく、引数をもとにオブジェクトを自己複製するメソッドを作ってみた。まずクラスモジュールを挿入し、…

VBA 標準モジュールのマクロを読み取って起動時にVBEのメニューに自動登録するアドインを自作する

今回は、指定の標準モジュールにマクロを書いておくとブックの起動時にVBエディタのメニューに自動登録してくれるアドインを作る。 VBエディタのメニューから実行するマクロなので、主に開発支援のためのコードを登録すると便利。 アドイン化することで常にV…

VBA クラスモジュールをゴミ箱代わりに使って複数列を一気に削除する方法

先日Excel方眼紙で作成された表を1データ1列の綺麗な表に変換するために、空白行を削除するというシチュエーションが発生した。以下は今回のマクロ紹介のために作成したダミー。全国の郵便番号データから無作為に100件選んだものである。 上記の表では列が結…

VBA WBSのように大中小カテゴリで階層ごとに結合されたセルをマクロで扱う方法

VBA

※WBSとは、Work Breakdown Structureのこと。プロジェクト管理なんかで使われる、仕事を段階的に細分化した表だ。まぁWBSのようにと言っておきながら、適当なサンプルが見つからなかったので全然WBSじゃないけど。Wikipediaから鳥類の分類表を拝借してきた。…

VBA 苦労して作ったマクロを操作ミスで消してしまったあなたへ、これはチャンスだ

2~3時間、あるいはもっと時間をかけて作ったマクロを、操作ミスで消してしまうことがある。 「うっかりxlsxで保存してしまった」などは代表的なミスである。ネットを探し回り、エラーと格闘して、必死の思いでやっと動くプログラムができたところで消えてし…

VBA インターフェースとは、プロパティやメソッドの存在を保証する規格のようなもの

プログラミングの学習途中で、いくつか難しい概念にぶつかる。 インターフェースもその一つだと思う。このインターフェースは、フォームのボタンなどの、ユーザーインターフェースのことではない。 クラスモジュールなどで作ったオブジェクトに適用するイン…

VBA エラーは忌むべきものではなく、非常に重要な機能である

プログラマーなら誰でもエラーで悩んだ経験があるだろう。特に初心者の頃はなかなか思ったように動かずにイライラしたことがあるハズだ。しかしエラーは本来、忌むべきものではない。 プログラムエラーは現実世界で問題が起きる前に、「それは間違っている」…

VBA ユーザーの領分を侵さないコードを書く ~ SelectionやActiveWorkbookはユーザーのもの

セルやブックの操作にSelectionやActiveWorkbookが多用されているコードを見かけることがある。特にマクロの記録を使った場合は顕著だ。 これはこれでちゃんと動くのだが、できればちゃんと変数に格納したほうが良いと思う。さて、いちいちSelectionを用いる…

VBAで「プログラマ脳を鍛える数学パズル」にチャレンジ

以前から気になっていた書籍「プログラマ脳を鍛える数学パズル」を買ってきた。プログラマ脳を鍛える数学パズル シンプルで高速なコードが書けるようになる70問作者: 増井敏克出版社/メーカー: 翔泳社発売日: 2015/10/14メディア: 単行本(ソフトカバー)こ…

VBA 基本情報技術者試験に出てくる半加算器と全加算器をVBAコードで作って学習する

コンピューターは「電子計算機」と訳されるように、計算する機械である。 Youtubeを見ているときも音楽を聴いているときも、ゲームで遊んでいるときも、メールを読んでいるときも、CPUでは絶えず「計算」が行われている。さて、今回はそのコンピューターがど…

VBA Propertyはフィールドのフリをしたメソッド ~ プロパティに値を代入するという表現は厳密には正しくない

プロパティーに値を代入するという表現をよく見かける。 私もつい最近までそのように表現していたけれど、これって厳密には間違ってるんじゃないかと思い始めている。 というのも、Propertyプロシージャを学習する際、この「代入」という表現が理解を難しく…

VBA クラスモジュールで連結リストを作成する方法

今回はクラスモジュールを使って連結リストを作成してみる。 実験ではなく、必要性があって作ることになったのでそういう意味では実用的なサンプルとして紹介できるかと思う。 連結リストとは 情報処理技術者試験などで学習したことがある人も要ると思うが、…

VBA 自作クラスのBeforeChangeイベントでCancel処理をする方法

さて、前回は自作クラスにEventを実装する方法について説明した。 thom.hateblo.jp前回紹介したマクロはMoveNextをクリックするたびにカーソルが下に移動するというものだったが、CursorオブジェクトのValueに上限・下限を設けていないためクリックし続ける…

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