[三流君] −−> [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でした。


ページフッター

ここまで、読んでいただきどうもです。ここから下は、三流君のホームページの紹介・案内です
目的の情報が見つかったか?少々心配しつつ、、、

種類別のリンク や 広告など

気になったジャンル↓を選択してください。

人気記事(来場者が多いTOP3):
[VBAでIE,WebBrowserを操作]・・・VBAでIE,WebBrowserを操作する サンプルです
[Access から Excel 連携 CreateObject("Excel.Application")]・・・AccessからExcelを操作したりデータの書き出しなどです
[VBAでOutlookの操作 CreateObject("Outlook.Application" )]・・・VBAからOutlookを使い、メール関係を処理するサンプルです
↑上記3つみたいなCreateObjectで他のアプリケーションを操作するサンプルが人気です。

Excel関係:
[Excel UserFormを操作する]・・・エクセルでユーザーフォームを作成して入力などを行ってます
[ExcelからAccessを操作する]・・・ExcelからAccessのマクロを起動してみました、
[Excel関係 関数、その他]・・・その他Excel関係です

Access関係:
[Access UserForm/サブフォーム 操作]・・・アクセスでフォームを使ったサンプルです
[Access レポート操作]・・・レポートを操作してみました
[Access クエリーやその他関数]・・・あまりまとまってませんが、スポット的な単体関数の解説です

その他:VBAの共通関数やテキストファイルの操作など
[VBAでテキストファイル(TextFile)の操作]・・・普通のテキストファイルを使ったサンプルです
[VBA 標準関数関係とその他解説]・・・その他、グダグタ解説してます

開発時の操作: [F1を押してHELPを見る]/ [Debug.Print と イミディエイトウインドウ]/ [実行時エラーでデバッグ]/ [ウォッチ式とSTOP]/ [参照設定を行う]

仕様書(設計書?) XXXX書類: [基本設計書や要求仕様書]/ [テスト仕様書 テストデータ]/ [バグ票]/ [関数仕様書]/ [流れは 入力・処理・出力]

※↑文章の味付けが変わっていて、お口に合うかわかりませんが。。。
※※読んで、気分を悪くされたらスミマセン。

Blogとリンク:[三流君の作業日記]/ [VBAやASPのサンプルコード]/ 広告-[通販人気商品の足跡]



[三流君(TOP ken3.org へ戻る)] / [VBA系TOPへ] / [VBA系バックナンバー目次へ移動]