VBA 起動部分テンプレート

いつも忘れてしまうのでメモ。

右クリックメニューの階層化。高速化等々。

 

VBA 並び替え(Sort)

いつも忘れてしまうので。

ダイアログを表示させ、実行は手動にする場合。

 

VBA ビット演算

各ビットごとの条件式(True/False)として考えるとわかりやすい。

And
左右がTrueでTrue

Or
左右いずれかTrueでTrue

Not
TrueならFalse、FalseならTrue

Xor
左右が違う場合True

VBAでは10進法のまま計算する。

2進法から10進法へは各フラグを下記の数値を足すだけ。
128,64,32,16,8,4,2,1

例えば、
10進法で3なら、00 00 00 11
10進法で6なら、00 00 01 10
なので、Andで計算すると2のフラグのみTrueとなる。

2,8のフラグを立たせたければ10とすればいい。

 

VBA 時刻計算で問題

時刻の処理を考えていて、1分ずつ加算するループを試してみたときのこと。

上と下ではスタート(s)の開始時刻が違うだけなのだが、3:00から3:15までというIFに対して上と下で判定が違って、bの値が同じにならない。

比較をDateDiffにすることで解決した。

 

 

VBA 仕入台帳から注文書

台帳に入力された内容を注文書の雛形に書き込み、指定したブックに新しいシートとして複写する。レジストリにパスを保存することでブックを記憶することができる。

 

VBA 仕入シートコピー・マスタチェック

以前利用していたVBA

 

VBA VBAからPOSTする方法

 

VBA 表からカレンダー形式に変換

前回はJavascript/C#版で今回はVBA版

○○表という感じの帳票を作る場合、行が単位で列が明細というのが一般的。

明細の中に納期や出荷日など日付に関わる情報が入っていることも多く、そこで問題になるのが、この日付情報同士の関係性がパッと把握できないこと。

日付情報がおまけの場合はいいけど、日付情報が重要な場合は把握しやすいフォーマットに変換してみようということで、表からカレンダーに変換する機能を作成してみた。

ループが2重になるので、行数が多い場合は工夫したほうがいいかもしれない。行数が少なければ問題ないと思う。

VBA 講座 ワークシート関数を挿入

以前書いたエクセルVBA講座の続きです。

VBA 講座

今回は少し実用的なものとしてループでワークシート関数を挿入する方法をお伝えしたいと思います。

ワークシート関数だからといって挿入自体に特別な方法は必要ありません。そのまま文字として入力すれば大丈夫です。

これを実行すると、Sheet1というシートのA1セルにSUM関数が入ります。

ではもう少し便利にするためにForループのカウンター変数を利用してみます。

細かく見ていきます。

先ずForループの中の処理は4回実行されます。そのときrというカウンタ変数は1,2,3,4というように変化していきます。

rの変化と指定しているセルの位置を考えてみると、
rが1のときCells(1,2)
rが2のときCells(2,2)
rが3のときCells(3,2)
rが4のときCells(4,2)
となります。Cellsの中身は行,列ですので、A1,A2,A3,A4セルを対象にして挿入していることが分かります。

“=SUM(B” & r & “:C” & r & “)”の部分について、文字としてそのまま利用したい部分はダブルクォーテーションで囲い、変数の中身を利用したい部分はダブルクォーテーションで囲わずそのまま記入します。それらを&記号(左右に半角スペース必須)でつなぎます。

***

この部分は分かりづらいのもう少し細かく解説すると、セルの中に書き込める値は2種類(実際はもっとありますが現時点では)あると考えてください。1つはダブルクォーテーションで囲った文字、もう1つは変数で、ダブルクォーテーションで囲った文字はそのまま書き込まれ、変数は中身が利用されます。

そしてその2種類は&記号(左右に半角スペース必須)で、順番や数に制限なく自由につなぐことができます。

どちらも実行するとhello worldと表示されます。

***

話を戻します。

具体的にrの変化を見ていくと、
rが1のとき、”=SUM(B1:C1)”
rが2のとき、”=SUM(B2:C2)”
rが3のとき、”=SUM(B3:C3)”
rが4のとき、”=SUM(B4:C4)”
となります。

結果として
rが1のとき、A1セルに”=SUM(B1:C1)”
rが2のとき、A2セルに”=SUM(B2:C2)”
rが3のとき、A3セルに”=SUM(B3:C3)”
rが4のとき、A4セルに”=SUM(B4:C4)”
が入るということになります。

Forループのカウンタ変数をループの中で利用することはよくあります。むしろループの中で固定の文字列を挿入することの方が少ないぐらいです。

さらにカウンタ変数を利用したワークシート関数を挿入する方法が使えるようになると、かなり複雑なことができるようになります。

VBA SQL実験用④(SQLite)

最近では専門家ではなくてもデータ分析ができたほうがいいという話をよく聞きます。そういう話の中で利用されているソフトはだいたい専用ソフトかエクセルといった感じでしょうか。

ただ数は少ないですがSQLを使おうというのもあるようです。実際SQLは非常に便利でエクセルより多少敷居は高いですが、少し使えればエクセルでは面倒な処理も簡単にできたりします。経験上、ワークシート関数、VBA、SQLを使い分ければほとんどの処理ができると思います。

ですが、いざSQLを使おうとするとどのソフトを使ったらいいのか迷うと思います。一般的にはAccess、SQL Server、MySQL(MariaDB)、SQLiteあたりがお勧めされていますが、もしPCにAccessが入っているならAccessが一番手軽に始められるのではないかと思います。今回はSQLiteを採用していますが、私も最初はAccessを使っていました。

中小企業で働いているとデータ分析やITの専門家がいない場合も多いので、自分たちで少しでもデータ分析ができると役に立つことが多いです。

追記

ちょっと原因は分からないけど、SQLite標準のカラムのデータ型(textやinteger)でテーブルを作成するとCopyFromRecordsetで取得できなくなる。

varchar(255)をカラムのデータ型に指定しているとCopyFromRecordsetで問題なく取得できる。

CopyFromRecordsetはテーブル作成時の型の影響を受けているらしい。とりあえずCopyFromRecordsetを使わないパターン