ExcelでネストしたIf関数をVBAでインデントして分析しやすくする
ExcelでIF関数を使うと条件によっていろいろと処理を変えることができる。複雑な条件はIF関数を組み合わせることで実現できるが、やりすぎるとすごく見づらい。たとえば、以下のような式を作ってみた。=IF(条件,IF(条件,IF(条件,TRUE,FALSE),IF(条件,IF(条件,FALSE,TRUE),FALSE)),FALSE)ネストしすぎて解析が困難になっている。これを解析用にインデントしてみ...
View ArticleVBAで関数型プログラマーの思考法を学ぶ
これは私に関数型言語の素晴らしさを教えてくれた本である。プログラミングGauche作者:Kahuaプロジェクト,川合史朗出版社/メーカー:オライリージャパン発売日: 2008/03/14メディア:大型本購入: 22人 クリック: 713回この商品を含むブログ (244件)...
View ArticleVBAでランダムかつセキュリティポリシーを満たす8桁のパスワードを生成する
今回はパスワードを生成するコードを紹介する。過去すでに書いた気がしてたのだけど、↓と勘違いしてた。thom.hateblo.jp簡易版のプログラムさて、ただランダムなパスワードを作るだけなら簡単だ。さっそくコードを書いてみた。Subランダムパスワード簡易版()Dim i AsLongFor i =1To8...
View ArticleVBA クラスモジュールで今月末・来月初などの日付計算を楽に扱う
今日はVBAで日付を扱う案件があった。とりいそぎ、日付関連の関数で済ませたけれど、オブジェクトがあると楽だなと思ったのでクラスモジュールを作ってみた。作り方まずはクラスモジュールを挿入し、プロパティウインドウから名前をDateObjectに変えておく。DateObjectモジュール内に以下のコードを張り付ける。PublicValueAsDatePrivateSub...
View ArticleVBA クラスモジュールでExcelのテーブル(ListObject)を操作する
今回はVBAでちょっと扱いにくいExcelのテーブル(ListObject)をクラスモジュールで包んで簡単に操作できるようにするコードを紹介。作り方まずVBEで対象のブックを選択し、挿入メニューからクラスモジュールを挿入する。挿入されたクラスモジュール(Class1)を選択し、プロパティウインドウ(表示されてなければF4キーで表示)から、モジュールのオブジェクト名を「TableOperator」に変...
View ArticleVBA フォームのボタンの反応が遅い理由と対策
今回はVBAでユーザーフォームに配置したボタンの反応が遅い理由とその対策について紹介する。検証のため、以下のようなカウンターフォームを作った。作成方法フォームに配置した各オブジェクトは以下のように名前を変更した。コードは以下のとおり。PrivateSub cmdCountUp_Click()Me.lblCounter.Caption...
View ArticleVBA クラスモジュールを使ってフォームに動的なメニューを作る
今回作成するのはボタンを動的に切り替えられるメニューである。これだけでは意味が分からないと思うので動作サンプルを紹介する。通常は1つのボタンに1つの処理なので、5つボタンがあれば5つしか処理は書けないが、このメニューは▲と▼で動的にボタンを切り替えることができる。作り方の紹介必要なものは、クラスモジュール「SelectButton」クラスモジュール「PagedButtons」フォームモジュール「(任...
View ArticleAccess VBAでフォームのコントロールイベント共通化
前回紹介したExcelVBAのユーザーフォームに動的メニューを追加する方法を紹介した。thom.hateblo.jpただ、実は作りたかったのはAccessで、連票フォームのフッター領域にそれを配置したかったのだ。慣れないAccessと格闘する前にまずExcelフォームでプロトタイプを作ろうと思い立ったのが前回の記事。Accessフォームで発生した問題さて、Accessに移植するにあたり、ひとつハマっ...
View Articleひと足先にPythonでCOMを利用したExcel操作をやってみる
MicrosoftがExcelにPythonを搭載することを真剣に検討しているらしい。www.itmedia.co.jpまだ検討の段階なので、どんな実装になるかは明らかにされていないが、基本的にはVBAと同じくCOMの操作になるんじゃないかと思う。今回はひと足先に、PythonでCOMを利用したExcel操作をやってみようと思う。参考にしたサイトはこちら。Python Win32...
View ArticleExcel VBAで音声読み上げ
今回はExcelVBAでSAPIを使った音声読み上げを紹介する。 SAPIとはSpeech Application Programming Interfaceの略で、Windowsアプリケーションで音声認識や音声合成を使うためにマイクロソフトが開発したAPIである。Windows 8.1以降のOSには標準で音声合成エンジンが同梱されている。※Windows...
View ArticleVBScriptとSAPIとタスクスケジューラで、一定時間ごとに音声で休憩を促す仕組みを構築
前回の記事で紹介した音声読み上げの仕組みをVBScriptに移植して、タスクに登録することで一定時間ごとに音声で休憩を促してくれる仕組みを作った。Windows...
View Article節目のブースト効果について
さて、そろそろ世間の皆様もお仕事が始まる頃だろうか。新年を迎え、今年こそは「〇〇」と意気込んでいる方も多いと思う。これに対し先日、Twitterでは冷ややかな反応が「いいね」を集めていた。普段から「〇〇」してない連中が新年にこぞって「〇〇」を誓う姿が滑稽だし、どうせ三日坊主だろうという反応である。なるほど一理ある。というか、私もどちらかと言えば冷ややかに見守る側の人間だった。しかし、日々の生活はあま...
View Articleオブジェクト指向の本質はカプセル化 ~継承も多態性も脇役にすぎない
ずいぶんと挑発的なタイトルをつけてしまったが、継承や多態性が重要でないなどというつもりはない。ただオブジェクト指向の本質はどれかと言われると、やっぱりカプセル化だろうなと。オブジェクト指向とはオブジェクト指向とは、データや機能をまとめて「モノ」として扱いましょうという方針を言う。オブジェクトってのはモノのこと。フランス語の「オブジェ」のほうがイメージしやすいかも。指向ってのは「はじめからその方向を指...
View Articleオブジェクト指向における「メッセージ」とは何か
現在主に認知されているオブジェクト指向私がオブジェクト指向というとき、それは基本的にC++から始まりJavaに受け継がれた、あのオブジェクト指向を指す。つまり、カプセル化、継承、多態性で説明されるアレだ。VBAは継承、多態性のサポートがほとんど無いけれど、その中心となる考え方はC++のオブジェクト指向から受け継いだものだと思われる。結論から言ってしまうと、このようなC++系統のオブジェクト指向におい...
View ArticleVBA Rangeオブジェクトはシートを操作するエージェント
VBAで扱える代表的なExcelのオブジェクトにWorkbook、Worksheet、Rangeなどがある。ひとつのブックにはひとつのWorkbookオブジェクトが対応している。ひとつのシートにはひとつのWorksheetオブジェクトが対応している。ではひとつのセルに対応する固有のオブジェクトは?5秒、4、3、2、1、はい。Cellと答えたあなた。ぶっぶー。Rangeと答えたあなた。ぶっぶっぶー。実...
View Articleそんなに沢山のソートアルゴリズム、意味あるの?って方へ
みなさん本日は情報処理試験お疲れ様でした。(私は今回申し込みすらしてないけど)本当は試験前にこの記事を書きたかったんだけど文章悩んでるうちに試験が終わってしまった。まぁ今回ダメだった方、決意を新たにした方もいると思うので一応公開するか。さて、何かを学習しようとしたときに障害になる考え方がある。「それ、意味あるの?」ってやつだ。試験のためと割り切れる方は良いけど、試験でしか役に立たないような知識を無理...
View ArticleVBA クラスモジュールでRangeの仕組みを説明する
昨日公開した以下の記事について、比喩ではちょっと難しいという声をいただいたので、今回はクラスモジュールを使って私が想像するRangeの仕組みを具体的なコードで解説しようと思う。thom.hateblo.jpまずはSheetの模擬クラスとRangeの模擬クラスを用意する。本物と同じ名前にしてしまうと、メインコードで使う際にちゃんと自作の方を使ってるの?という疑惑につながるので、オブジェクトの名前はオリ...
View ArticleVBAでアホな実験 ~ Not演算子は何個連続で使えるか
二重否定文…それは時に控えめな肯定を、時に強い肯定を生み出す日本語のテクニックである。控えめな肯定の例「できなくもない」強い肯定の例「やらねばならない」なんてことを考えてたら、そういやNotって二個以上つなげても大丈夫なんかしらと、アホなことを思いついたので、これは検証せねばならない。実際にやってみた。Sub hoge() a...
View ArticleVBA Boolean型をTrueやFalseと比較することの是非について
If文の条件式でBoolean型をTrueやFalseと比較することは昔から論争の種だった。たとえば以下のようなIf文。IfIsNumeric(x)=TrueThenIfIsDate(x)=FalseThenわざわざTrueやFalseと比較しなくても、このように書くことができる。IfIsNumeric(x)ThenIfNotIsDate(x)Then...
View ArticleVBA 矩形選択範囲で重複データの入ったセルを塗りつぶす方法
重複データを探すというのは比較的よくやる処理だけれど、データが矩形に配置されていてその姿のまま処理したい場合は関数では少々面倒くさい。今回は選択した矩形範囲のデータから内容の重複するセルを塗りつぶして可視化するマクロを作った。ちなみに定数でどれを何色で塗るか、塗らないかを選択できるようにした。Sub重複orユニークを塗る()Const重複を塗る =TrueConst重複セル色...
View Article