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

t-hom’s diary

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

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

VBA

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

Thinkpad X200のHDDをSUMSUNGのSSDに換装

今回は私のノートPC(Lenovo Thinkpad X200 Type 7454-PU3)のハードディスクをSSDに換装した話。※この記事はあくまで参考情報です。これにより発生したいかなる損害に対しても私は責任を負いません。この記事を参考に作業される場合は自己責任でお願いします…

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に上限・下限を設けていないためクリックし続ける…

VBA クラスモジュールに自作のEventを実装する

今回はクラスモジュールに、自作のEventを実装し、シートモジュールでクラスのイベントを受け取る処理をやってみる。 まずはEventを使用しないクラスサンプル クラスモジュールを挿入し、以下のコードを貼り付け。 ※サンプルなのでクラスモジュールのオブジ…

SEOは情報を探している人にきちんと届ける技術

※この記事はあくまで個人的な見解です。昨日、VBAカテゴリーの記事が200に到達しました。記念にいつもの「だ・である調」じゃなくて「です・ます調」で書いてみます。もともとこのブログに「だ・である調」を採用したのは、これまで苦手な文体だった為に慣れ…

VBA クラスモジュールはもっと当たり前に使われるようになって欲しい

私がクラスモジュールの使い方を知るまでのエピソード 私が初めてオブジェクト指向の便利さを理解したのは、なぜかVBScriptだった。ExcelファイルをVBScriptのファイルにドラッグ&ドロップすると内容を読み取ってAccessのデータベースに登録し、ドロップさ…

VBA豆知識 String、Long、Doubleなどの型名の由来について

VBA

VBAの型名は英単語であるが、そのまま和訳しただけで意味が通じるものとそうでないものがあるので、一通り解説しておこうと思う。 Byte型 バイトと読む。 整数型で1~256を格納できる。 「2GBのメモリ」などデータサイズを表す用語としてもお馴染み。Byteは1…

VBA オブジェクトとメモリの関係 ~ オブジェクトが参照型と呼ばれる理由

前回、VBAを擬人化して、変数が記号表によって管理されているというところまで書いた。※読んでない方はこちら thom.hateblo.jpさて、今回はオブジェクトがメモリ上でどう扱われるのかという話。次のコードで説明しようと思う。 Dim c As Collection Set c = …

VBA 変数とメモリの関係 ~ 値渡しと参照渡しをメモリの動きから理解する

今回は変数とメモリの関係について書こうと思う。 ちょっと「記号表」とかいろいろ難しいモノが登場するのだが、ちょっとわかりやすく説明するためにVBAを擬人化しておこうと思う。 コンパイラー君とインタープリターさんの紹介 まずあなたがVBAコードを書く…

VBA シートと不可分のマクロはシートモジュールに書くとスッキリする

VBAの書籍を見ていると、だいたい標準モジュールにマクロを書くように指示されている。マクロの記録で保存されるのが標準モジュールということもその理由かもしれないし、そもそも「標準」という名前が「ふつうはここに書け」という指示に見えるのかもしれな…

VBAの特徴について ~歴史、利用者層、サポートするパラダイムと型付けの作法など

これまでVBAについて色々記事を書いてきたけれど、VBAってそもそもどんな言語なのか、自分が学んできたことを整理する意味でひととおり書いておこうと思う。 VBAの歴史をざっくりと説明 VBAの祖先はアメリカのダートマス大学で作られたBASICという教育用言語…

VBA クラスという用語は「類(るい・たぐい)」を指す言葉である。

これまでクラスモジュールについて扱ってきたけど、言葉の意味を知らないままクラスクラス言っててもなかなかその本質的なイメージをつかむことは難しいと思う。やはり人間、なじみのない言葉で何かを覚えようというのは無理がある。そこで今回はVBAは一旦脇…

VBA モデル化の概念を理解すると、クラスモジュールの使い方が分かる

クラスモジュールを使いこなすためには、モデル化という概念をおさえておくと分かりやすい。しかしいきなりモデル化といわれても何のことかわからないと思うので、順を追って説明していく。まずプログラミングにおけるモデル化の話をする前に、モデルという…

VBA オブジェクト変数の宣言時にNewすると何がまずいのか

オブジェクト変数の宣言と使用については、以下の2パターンが存在する。■パターン1 宣言と同時にNewしてしまう方法 Dim C As New Collection■パターン2 宣言とオブジェクトのSetを分ける方法 Dim C As Collection Set C = New Collection私はこれまで大体の…

VBA 脱初心者を目指す ~ Functionを使いこなすにはHowではなく、Whatに注目する

VBA

VBAではFunctionプロシージャを使いこなせるようになったら、中級の域に達したと言っていいと思う。あくまで個人的な意見であるが。さて、Functionプロシージャの仕組み自体は、それほど難しいものではない。ただ初心者の方と話をしていると、Functionを使う…

だれだ、俺の紅茶に砂糖を入れたのは!まずい。。

まぁ、実際に入れられたわけじゃないんだけれども。今朝コンビニでサンドイッチと紅茶を買った。こちらの商品キリン 午後の紅茶 あたたかい ストレートティーPET 345ml×24本出版社/メーカー: キリンビバレッジ発売日: 2015/09/08メディア: 食品&飲料この商品…

Excel TRIM関数で消えない謎の半角スペースをVBAでなんとかする

VBA

先日、仕事で受け取ったExcelデータにTRIM関数で除去できない謎の半角スペースが混じっていた。その現象を再現したのがこちら。 A1セルとA2セルは全く同じに見えるが、A1セルの1文字目はトリムできない謎のスペース。A2セルの方は通常のスペースである。この…

amazonアソシエイトのウィジェットがChromeで自動再生されなくなったのでランダムに商品を並べる機能をJavaScriptで自作する。

このブログはamazonアソシエイトに参加しており、その広告収益を運営費に充てている。 先日までこのブログのサイドバーにはA8.netの固定バナーを表示していたが、まったく収益になってなかったので、そちらを削除して空いたスペースにおススメの小説を掲載す…

VBA 配列とコレクションの違いをメモリ上のデータ構造から理解する

VBAでは複数データを格納できるデータ型として、配列とコレクションがある。 それぞれ一長一短あり、どちらが優れているというものではないのだが、どちらかといえばデータの追加・削除が簡単に行えるコレクションのほうが使い勝手は良いかもしれない。さて…

VBA 新しい色の指定方法 ~XlRgbColor定数

VBA

VBAで使える色定数は以下の8種類がある。 vbBlack vbBlue vbCyan vbGreen vbMagenta vbRed vbWhite vbYellow 私も今までこれ以外使ったことが無かったが、先日オブジェクトブラウザを探索していたらXlRgbColor列挙型なるものを発見した。rgbAliceBlueとか、r…

VBA 初学者こそ、なんでもVBAでやるべし

Excelには高度な機能が備わっており、VBAを使わなくても例えば関数やピボットテーブルなどの機能で問題が解決してしまうことも多い。 その意味で、VBAでなんでもやろうとするのは効率が悪い。 でも、ことVBAの学習においては、それらExcelの機能を知っている…

VBA 業務フローチャートをマクロで簡単に作成する

VBA

フローチャートはプログラミングでよく用いられていたが、最近は専ら業務の流れを説明する図として利用されている。 特に部門をまたがる業務の全体像を把握するには便利である。しかし、図なのでとにかく作成が面倒くさい。 どうしてもボックスのサイズをそ…

VBA Withを使ったコードをWith無しのコードに変換するマクロ ~ スタックの応用 ~

今回は、Withを使ったコードをWith無しのコードに変換するマクロを作ってみる。 何の役に立つんだというツッコミはなしで。目次 マクロの概要 実現方法を検討する 入れ子になったWithの扱い方 VBAでスタックを実装 スタックを使ったWithを外すコード 課題 マ…

プログラミングだって立派な趣味だ

家でプログラムを書いているという話をすると、仕事中毒だと言われることがある。わざわざ休日に家で仕事をしているつまらない奴だと思われているようで癪である。でもプログラミングだって立派な趣味だ。絵を描いたり、作曲したりするのと同じ、創作活動だ…

VBA インターフェースを活用してコードの抽象度を上げるテクニック

以下のような注文票にマクロでデータを記入することを考えてみる。 人間が記入する場合は、次のように考えながら記入していくだろう。 「注文票の、ひとつ目の商品名は"パソコン"で、単価は10万円、個数は40個。二つ目の商品は"複合機"で、単価は150万円、個…

VBA Rangeでセル範囲に付けた名前を参照

VBA

Excelでは、セルに任意の名前を付けることができる。 任意のセルを選択した状態で、数式バーの左にある名前ボックスに名前を入れてEnterで確定させるだけだ。 セル範囲に対しても同様の操作ができる。 付けた名前は数式で参照させることができる。 行や列を…

執筆環境のグレードアップ

パームレスト 私は普段からプログラミングの学習やブログの執筆などでキーボードを良く使う。 それで結構いい値段のキーボードを使っているのだが、パソコン専用のローデスクを使うようになってから今一つ入力しづらい。 スライド式のキーボードテーブルは、…

VBA なぜ引数が一つのときは、カッコを付けても付けなくてもプロシージャを呼び出せるのか

初心者の方はプロシージャ呼び出しの時にカッコを付けるかどうか迷う方もいると思う。基本ルールは、Callを書く場合と、戻り値を利用する場合にカッコを付け、それ以外では付けてはいけないである。以下のように、不要なカッコを付けると、コンパイラに叱ら…

VBA Cellsの正体は、全セルを包むRangeオブジェクトである

セルを行・列の数値で指定するCellsはRangeと並んで基礎中の基礎であるが、その正体を知る者は少ない。まあ別に知ったところで使い方が変わるわけではないのだが、知っておいて損になるものではないので紹介しよう。今回も評価という用語を用いるので、意味…

VBA Sheetsの後にドットを入れても入力候補の自動補完がされない理由

'============▼2016/5/31追記▼============Workbooksオブジェクトは存在しないと書きましたが、Microsoft MVPの伊藤さんから誤りを指摘いただいたので修正しました。伊藤さん、ありがとうございます。【参考】 SheetとSheetsとWorksheetとWorksheets:エクセ…

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