カテゴリー別アーカイブ: コード

コントロールを変数にしてForループ Excel VBA


コントロール引数にしたプロシージャを作るにはどうすればいいのか、
コントロールForループに入れてやるにはどうすればいいのか。

経緯

フォームをダブルクリックした際に フォーム上の 全テキストボックスについて .Enabled を変化させようとしました。 全てのコントロール名を書き連ねるのは大変なので、 ループ を使って複数のコントローラに対して処理を行おうと考えました。

解決法

VBA では Me.Controls("ControlName") でコントロールを取得できます。 そこで、 .Enabled を変更する TextBox の名前を txtTitle1txtTitle2 というようにしておき、次のようなループ処理を実行します。

Me.Controls で取得したコントローラについて複数行の初期化処理を行う場合は With を使うのもいいですが、 次のように変数に代入して使うこともできます。

変数宣言のところで As TextBox などと書くと エラーが出ます。

これらを利用して作ったのが次のコードです。

その他下記のような方法が使えそうです。

配列を使う

.Net では コントロール の 配列 (のようなもの) に コレクション というのがあり、 配列のように扱うことができます。 しかし VBA には コレクション クラス が用意されていません。

しかし、 Me.Controls の引数にする String は配列にできます。

コレクションクラスを作ってしまう

コントロールの集合を扱えるようなクラスを作ってしまうのもいいと思います。


クリスタルレポート 説明文を1ページ目に表示


発注書などでは、最初のページに説明文を表示したいことがある。 しかし、レポートヘッダでは位置が悪い。かといって、ページヘッダではすべてのページに表示される。 そんなときは次のようにすると、1ページ目にだけ表示する項目を設定できる。 1行程度の説明文の場合におすすめ。

  1. ページヘッダ内にテキストを入力する。

  2. 入力したテキストを選択して、メニューバーから CrystalReport を選び、その中から、式ワークショップをクリック。

  3. 左に表示されるツリーから、ページヘッダを選び、その中の説明文を書いているテキストオブジェクトを選択する。

  4. 次に、新規作成を選び、非表示というのを選ぶ。

  5. 次のコードを入力する。

これで、1ページ目にだけ表示される。


CrystalReport: グループを作るとできる空白ページを消す


クリスタルレポートでグループ化をして、グループフッタ表示後に改ページをするようにしておくと、最後になにもない空白のページができてしまいます。

続きを読む CrystalReport: グループを作るとできる空白ページを消す


Oracle: Group 化 の際に文字列を結合する


Group 化 する際に 文字列を カンマ区切りで結合する方法を 2つ 紹介します。

ストアドファンクション

ストアドファンクション を使って文字列を結合します。

このようなファンクションを作っておいて、 次のような SQL を実行します。

出力結果サンプル
GROUP_ID MEMBER_NAMES
1 A, B, C
2 D, E

もし、 MEMBER_NAMES の出力結果が文字列として長くなりすぎる場合は、 文字数の長さを調べて分岐処理を行うように ファンクション を変更すれば OK です。 末尾に “等” をつけたりもできます。 区切り文字を変更することもできます。

ファンクション内で使われている LTRAM(PARAM1, PARAM2) は、 PARAM1 の左端に、 PARAM2 があれば削除する関数です。 右側を削除する場合は RTRAM が使えます。

wm_concat

wm_concat という関数を使っても同じことができます。 Oracle(オラクル) のマニュアルにも載っていない関数なので、 オラクルのサポートは受けられないと思います。

上の SQL を実行すると、 AAAAA, BBBBB, CCCCC, DDDDD というような結果が出力されます。


同等の機能をもつ ListAgg 関数 が Oracle 11g R2 で 正式にサポートされました。

参考: Oracleの階層問い合わせ