[三流君 ] −−>
[VBAで楽しく ] −−>
[バックナンバー一覧 ]
−−> No.099 Access タブコントロールを探り表示データ切り替え
Access タブコントロールを探り表示データ切り替え
メルマガ発行内容
<Access タブコントロールを探り表示データ切り替え>
どうも、三流プログラマーのKen3です。
今回は、
Accessのタブコントロールを探ってみたいと思います。
たいした内容じゃないのですが。
サンプルファイルは、
http://www.ken3.org/vba/lzh/vba099.lzh
にdb099.mdb(Access2000版)が保存されています。
/*
* 1.今回のキッカケ
*/
http://www.ken3.org/cgi-bin/bbs/vba/wforum.cgi
の掲示板に、
>タイトル:タブ切り替えで、クエリ毎にレコード抽出するには?
>
>タブ切る替えることで、対象となるクエリだけを抽出したいのです。
>VBで可能なら挑戦したいのでアドバイスお願いできますか!
---
と書き込みをもらいました。
タブコントロールを探ってみたいと思います。
/*
* 2.普通の使い方?
*/
顧客 ID
会社名
顧客の氏名
顧客のシメイ
支社名/支店名
請求先住所
市区町村
都道府県
郵便番号
国/地域
顧客の部署名
電話番号
内線番号
FAX 番号
電子メール
アドレス
備考
なんて項目から単票フォームを普通に作成すると、
縦に長くなってしまいます。
これを、項目別にタブを付けた感じにするために、
タブコントロールを作成します。
タブコントロール?使ったことが無い人も多いと思いますが、
みたいにひっそりと、下のほうに存在してます。
これをフォームに配置します。
ページ33,ページ34なんて感じで、タブが表示されます。
データを3つのグループに分けてみます。
名称 住所 連絡先
とタブを作ります。
えっ、2つしかタブが表示されてないよ。
落ち着いて下さいよ、チャント追加できます、
タブコントロールを選択して、
右ボタンを押し、ページの挿入を選択します。
下記のように縦に長かった入力エリアを
タブを使って、グループ分けできました。
/*
* 3.タブコントロールのイベントを探る
*/
そんな、普通の使い方なんて、聞いてないんだよ、
質問、読み返してみろよボケ
と、
読者が言ってるかはわかりませんが、(言われてないけど)
質問を読み返すと、
---
>タイトル:タブ切り替えで、クエリ毎にレコード抽出するには?
>
>タブ切る替えることで、対象となるクエリだけを抽出したいのです。
>VBで可能なら挑戦したいのでアドバイスお願いできますか!
---
そっか、タブが切り替わったタイミングで、
クエリーを変更させたいのか(データを絞りたいのか、、、)
よし、イベントを探りますか。
各ページのイベントには、
クリック
ダブルクリック
マウスボタンクリック
マウスボタン移動時
マウスボタン開放時
とあるので、
クリック時に、
Private Sub P1_Click()
MsgBox "p1タブが押されました"
End Sub
なんてやってみます。
オイオイ、反応しないよ(笑)
で、エリア内をクリックすると、
p1タブが押されました
と、メッセージが表示された、
これじゃタブをクリック時じゃなくて、エリアをクリックだよ(笑)
いつものように読みが外れたので、
今度は、ページのイベントでは無く、
本体のタブコントロールのイベントを探ります。
変更時
クリック時
ダブルクリック時
・
・
とイベントが存在します。
変更時のイベントを確認したかったので、
Private Sub tab_ctl_TEST_Change()
MsgBox "_Change 変更時のイベントです"
End Sub
と、やると、やっとタブ(グループ)を変更したタイミングが取れました。
タイミングが取れたら、
あとは、どの女の子じゃなくって、どのページを選択したか?ですよね。
.Valueのヘルプを見ると
>タブ コントロール
>現在選択されている Page オブジェクトのインデックス番号を表す
>整数型 (Integer)の値 タブ コントロールの Value プロパティには、
>現在の Page オブジェクトのインデックス番号が含まれます。
>タブ コントロールの各タブには 1 つの Page オブジェクトがあります。
>最初の Page オブジェクトのインデックス番号は 0、2 番目は 1、
>というようになります。
よし、.Valueを入れてテストしてみると、
Private Sub tab_ctl_TEST_Change()
Dim select_page As Integer
'選択ページの番号を代入する
select_page = Me![tab_ctl_TEST].Value
'メッセージを表示する
MsgBox select_page & "番目のタブが選択されました"
End Sub
のように、3番目のページを選択すると、2と返してくれます。
これは、ヘルプにもあるように、
0,1,2とページ番号が振られているためです。
※左から0番目とは言いにくいけど(人間的には1番目と言いたい)
パターン的に覚えてね。
/*
* 4.応用してみる
*/
タブコントロールで、タブを選択したタイミングで処理が可能なことがわかりました。
普通の使い方は、タブが変わると、入力画面の内容が変わるんだけど、
今回は、ズルして、タブの上の部分だけ使って、中身は気にしないことにします。
えっ?何言ってんの?
三流プログラマーの言葉は、イマイチわかんないんだよ、
まわりくどくってさ(みんなも、そんな感じしない?)
ドキッ。
えっと、、、タブの上のボタンだけ使いたくって。
例えば、セリーグの打撃成績の表があります。
順位 選手名 チーム 打率 試合数 打数 得点 安打 二塁打 三塁打 本塁打
1 今岡 阪神 0.365 75 318 43 116 28 0 6
2 矢野 阪神 0.352 75 267 46 94 15 4 9
3 赤星 阪神 0.350 75 297 57 104 10 4 0
4 高橋由 巨人 0.350 59 223 47 78 17 1 13
5 ラミレス ヤクルト0.348 75 305 61 106 20 3 24
6 鈴木 ヤクルト 0.336 74 277 45 93 24 0 11
7 福留 中日 0.332 76 289 60 96 19 6 14
8 木村拓 広島 0.330 60 194 24 64 13 0 5
9 シーツ 広島 0.322 69 261 42 84 19 1 11
10 金城 横浜 0.314 73 296 38 93 17 1 7
なんだ横浜はカネシロだけか(金城はカネシロじゃなくてキンジョウです)
って話は、置いといて、
T_AVGってテーブルがあって、規定打席以上の選手の打率を表示してます。
この一覧形式フォームのヘッダー部に、
タブコントロールを配置して、
横浜、阪神、巨人、ヤクルト、中日、広島
とページを作ります。※ページのサイズは無しで頭のタブだけ使う。
ページを6つ追加して、
その後、名称を
横浜、阪神、巨人、ヤクルト、中日、広島
に変更します。
ヤバイ、ALL条件なしを忘れてた(画面のコピーを取ってから気が付いたので(笑))
ALL 横浜、阪神、巨人、ヤクルト、中日、広島
のタブ(インデックスのタグ)を作成します。
ALL 横浜、阪神、巨人、ヤクルト、中日、広島
0 1 2 3 4 5 6
って、タブ構成です。
TAB_SELECTって名前のタブコントロール名にして、
_Changeの変更時のイベントに、クエリーを変えるじゃないけど、
フォームの元になるレコードソースを変えてみます。
Private Sub TAB_SELECT_Change()
Dim strチーム名 As Variant 'チーム名を配列で受け取る
'タブの順番と同じ名前の配列を作成する
strチーム名 = Array("ALL", "横浜", "阪神", "巨人", "ヤクルト", "中日", "広島")
Dim strTNAME As String '選択されたチーム名を受け取る
'選択されたタブに対応したチーム名を配列から代入
strTNAME = strチーム名(Me![TAB_SELECT].Value)
'データソース用のSQL文を作成する
Dim strSQL As String
If strTNAME = "ALL" Then '全てのデータ条件無しなら
strSQL = "select * from T_AVG Order By 打率順位"
'↑T_AVGテーブルから全ての項目をセレクト、打率順位順とする
Else
'T_AVGテーブルから全ての項目をセレクト、
'条件はチーム名が一致するデータ、打率順位順とする
strSQL = "Select * From T_AVG " _
& "Where チーム = '" & strTNAME & "' " _
& "Order By 打率順位"
End If
'データを絞り込むSQL文が完成したので、
'それをフォームのレコードソースにセットする
Me.RecordSource = strSQL '単にSQL文を代入するだけでOKなんですよ
End Sub
処理のポイントは、
^^^^^^^^^^^^^^^^^^
タブが変更されたとき、TAB_SELECT_Change()のイベント発生。
Me![TAB_SELECT].Valueで選択されたタブの番号がわかるので、
strチーム名 = Array("ALL", "横浜", "阪神", "巨人", "ヤクルト", "中日", "広島")
で作成したチーム名の配列をそのまま、
strTNAME = strチーム名(Me![TAB_SELECT].Value)
で代入する。
横浜が選択されると、
Me![TAB_SELECT].Valueは1、
strTNAMEには、strチーム名(1)で横浜の文字列が入る。
作成されるフォームのレコードソースは
strSQL = "Select * From T_AVG " _
& "Where チーム = '" & strTNAME & "' " _
& "Order By 打率順位"
で、strTNAMEが横浜なので、
Select * From T_AVG Where チーム = '横浜' Order By 打率順位
とSQL文が作成されます。
作成されたSQL文を、
Me.RecordSource = strSQL
と
Me.RecordSource に セット(代入)するだけで、
横浜の選手の規定打席以上を表示するフォームに。
↑寂しい、横浜のバッター陣・・・規定打席は4人かぁ・・
↓それに比べて阪神は規定打席7人も、固定メンバーだと強いよね・・
/*
* 5.終わりの挨拶
*/
今回は、
横浜のバッター陣、規定打席は4人しか居なかった。
って話でした。
オイオイ、違うだろ、
でしたね、
横浜は開幕戦しかまだ阪神に勝ってないって話でした。
※いい加減にしてよ。(と、意味ありのどちらとも取れる言葉を書きつつ)
今回は、タブコントロールのイベントを探り、
イベントが取れるので(変化を判断できたので)
タブのページを使わないで、選択後にレコードソースを変えて、
表示データの変更処理を書いてみました。
サンプルファイルは、
http://www.ken3.org/vba/lzh/vba099.lzh
にdb099.mdb(Access2000版)が保存されています。
本来の使い方にこだわらないで、タブコントロールを使ってみました。
何かの参考となれば幸いです。
Excel/Access大好き、三流プログラマーKen3でした。
ページフッター
ここまで、読んでいただきどうもです。ここから下は、三流君のホームページの紹介・案内です
目的の情報が見つかったか?少々心配しつつ、、、
種類別のリンク や 広告など
Blogとリンク :[三流君の作業日記 ]/
[VBAやASPのサンプルコード ]/
広告-[通販人気商品の足跡 ]
[三流君(TOP ken3.org へ戻る) ]
/ [VBA系TOPへ ]
/ [VBA系バックナンバー目次へ移動 ]