テーブルデータを参照するメソッド [VBA]
プログラムからテーブルのデータを参照したい場合、ADOなどを利用する方法がありますが、Applicationオブジェクトのメソッドで、簡単に参照することもできます。
DAvg・DCount・DFirst・DLast・DLookup・DMax・DMin・DStDev・DStDevP・DSum・DVar・DVarPメソッドです。
参照できるテーブルは、現在のデータベースに定義されているテーブル、リンクテーブル、クエリです。
リンクが設定されていない、他のデータベースを参照することはできません。
クエリ グループで最大値をもつレコードの抽出(相関サブクエリ) [クエリ]
以前の記事で、テーブル全体から最大値をもつレコードを抽出する方法をとりあげましたが、今回はグループ毎の最大値のレコードを抽出します。
データはこんな感じ。
担当Aさん、Bさん、Cさん・・・が居て、日付毎に、金額が一番大きかった人のレコードを抽出します。
クエリ 最大値をもつレコードの抽出 [クエリ]
テーブルのデータから、ある項目の最大値そのものを抽出するのは、MAXで簡単に得られますが、その最大値をもつレコード全体を特定したい場合は、ちょっと工夫が必要です。
例として、下記のようなデータから、最大値をもつレコードを抽出する場合を考えます。
ぱっと見で、2011/1/9の2,000円が最大です。
システム設計の話 その3・システム化する内容をまとめる [システム設計の話]
前回、顧客の業務内容と、システム化する内容をざっくりまとめました。
これを踏まえて、具体的にシステムでどんな物を作るかを考えて行きます。前回のシステム化した業務内容から、必要な物を洗い出してみます。
・「売上入力」画面
・「納品書印刷」画面
・「納品書」帳票
・「売上伝票印刷」画面
・「売上伝票」帳票
・「経理売上報告書印刷」画面
・「経理売上報告書」帳票
・「売上実績表印刷」画面
・「売上実績表」帳票
顧客から直接見えるシステムの部品は、とりあえずこんな感じでしょうか。
画面と帳票は、ACCESSで言うところの、フォームとレポートになります。
今回は、入力画面と帳票のみで、データをごりごり処理するバッチ処理みたいなのは考えていません。もしかすると、売上実績表で、きめ細かい対比を見たいなどの、複雑な要望が合った場合は、それ用のデータをバッチで作成したほうが、作りやすいかもしれません。
この時点で、ざっと何をつくったら良いかが少し見えてきました。
しかし、それぞれ細かい内容はまだ未定です。これからは、それぞれについて、詳細な内容を検討していく工程に入ります。
説明の例なのでざっくりやってますが、それでもめんどくさいですよ。実際の現場では、こういう細かい打ち合わせを延々何時間、何日、何ヶ月ってやって、システムを作っていくわけです。
ちょっと愚痴が入りましたが、区切りが良いので今回はこの辺で。
次回は上記の一覧にそって、一つずつ詳細内容の検討をしていきます。
関数・プロシージャの呼び出しとCallステートメント [VBA]
と、いうか、引数を括弧で囲むかどうかと、Callを書くか書かないかについて。
まず、括弧について。
関数やプロシージャを呼び出す場合、関数名(プロシージャ名)の後に括弧「(」「)」を付けるかどうかについてです。
関数やプロシージャから戻り値を受け取る場合、括弧を付けます。
例えば、
MsgBox "テスト", vbInformation
この場合は、メッセージボックスを表示させるだけなので、括弧なしでOKです。
戻り値を受け取る下記のような場合は、
intR = MsgBox("テスト", vbInformation + vbYesNo)
と、なります。
また、
MsgBox("テスト", vbInformation + vbYesNo)
intR = MsgBox "テスト", vbInformation + vbYesNo
これらは、構文エラーになります。
次に、Callステートメントについて。
Callステートメントは、関数名・プロシージャ名の後ろに括弧を付けるけど、戻り値を受け取らない場合に記述します。
例えば
Call MsgBox("テスト", vbInformation + vbYesNo)
このような記述になります。
最初っから括弧を書かなければCallも書かずに済むのですが、引数部分は括弧で囲んだ方が見やすいとか、戻り値があるけど捨ててることを明示的にしておきたいとか、いや、正確な理由は分かりませんが、こういうことになってます。
こちらも、下記のような記述は、
Call MsgBox "テスト", vbInformation + vbYesNo
構文エラーになります。
さて、なんでこんな事を取り上げたかと言いますと、たまに下記のようなコーディングに遭遇するからです。
Dim intR As Integer
intR = MsgBox("テスト", vbInformation)
たぶんですね、見よう見まねでMsgBoxを使ってみたら、なにやらエラーがでる。なんだかわかんないけど、こうするとエラーにならないから、以後ずっとこうしてる的な感じでしょうか。
ちゃんと理由を理解してないとこうなります。
そして、派遣プログラマにはこういう人がたくさんいます。