重ねる 


得意先のコンボボックスを配置している。
名前が良く似ているため、一部を入力したらリストが絞り込まれる支援をしたい。
フォームが単票であれば容易に作成できた。

でも、やりたいのは帳票フォームに配置したコンボボックスで。

コンボボックスに指定したテーブルには、
 得意先ID(主キー), 得意先名, よみ
があり、得意先名を一覧として表示している。
検索用テキストボックス「txt検索」に入力したら、「よみ」の一部と一致するものだけを表示したい。
動きとしては、絞り込まれた内容を自動的にドロップダウン表示に。

※※ 私が解釈した内容で書き換えています。

検索したいフィールドが複数あるのであれば、コンボ vs リスト vs メイン/サブ も考えられるかと思います。
ただ、今回は1フィールドだけ・・・・

Yu-Tang さんの コンボボックスの一覧を入力時のみ制限する方法〜帳票形式編〜 が適当と思い
回答してみたんですけど・・・・

フォーム上でコントロールを重ねる・・・・・
これ、何年か前(知恵袋にいたころ)に hatana さんに教えていただいたものなんですが・・・・
(そのころの私は、帳票では実現できない・・・って思ってました)
何故重ねるのか、大きく3つあるような気がします。
・隠したい
・下の方を見せたい
・直接触らせたくない

回答後、検索用の「txt検索」ってどこに配置しているんだろう・・・
コンボボックスにコンボボックスを重ねるのは、必ず何かを見せたいんだよね。
「txt検索」が、もし詳細に配置されてたら、全レコードに同じ表示がされて邪魔と感じるのかなぁ・・・
ここで、不要な表示(処理中のレコード以外の表示)を隠すチョッと違う用途での「重ねる」を含めて
具体的に回答してみるかな・・・・

って、うまく伝えられなかったのか、環境が違ったのか、問題あってダメだったようです。
反省の意味も込めて、回答を検証しながら、サンプルを作ってみます。
続きを読んでみようかな ---≫

2012/05/16

Category: やってみる

TB: 0  /  CM: 0

top △

どの方法が良いのだろう 


あるQAで、以下の条件があったとして、フォームを作るには・・・

テーブル「Tチーム」
フィールド型 等々
 チームID オートナンバ (主キー)
 チーム名 テキスト

テーブル「T試合」
フィールド型 等々
 試合ID オートナンバ (主キー)
 試合日 日付/時刻
 天候 テキスト
 相手チーム 長整数 「Tチーム」のチームID
 試合場所 テキスト

テーブル「T選手」
フィールド型 等々
 選手ID オートナンバ (主キー)
 選手名 テキスト
 よみ テキスト

テーブル「T出場」
フィールド型 等々
 an オートナンバ (主キー)
 試合ID 長整数 「T試合」の試合ID
 選手ID 長整数 「T選手」の選手ID

つまり、自チームの選手「T選手」が、どの対戦相手の時に出場していたか・・・・

フォームのイメージとしては、
・「T試合」を登録/修正時に、
・「T選手」の全選手を表示して(100くらい)
  チェックボックス形式で入力操作したい。(「T出場」を同時に作りこみたい)

ザッと考えてみたフォームは9つ
1)帳票フォームに帳票サブフォーム(F1M/F1S)
  kEnt128_F1  kEnt128_F1D
2)単票に2つの帳票サブフォーム(F2M/F2S1/F2S2)
  kEnt128_F2  kEnt128_F2D
3)単票に10個のサブフォーム(F3M/F3S)(あ行、か行・・・毎にサブフォーム)
  kEnt128_F3  kEnt128_F3D
4)単票に6個のサブフォーム(F4M/F4S)(1つのサブフォームでは20人表示)
  kEnt128_F4  kEnt128_F4D
5)上記フォームのワークテーブル使用バージョン(F5M/F5S)
  kEnt128_F5  kEnt128_F5D
6)単票に多数の非連結チェックボックス(F6M)
  kEnt128_F6  kEnt128_F6D
  上記フォームのVBA記述量削減・操作限定バージョン(F6M2)
  kEnt128_F62  kEnt128_F62D
7)上記フォームの表示変更バージョン(F7M)
  kEnt128_F7
8)単票にタブコントロール配置(F8M)(タブページで、あ行、か行・・・)
  実際に操作するのは、多数の非連結チェックボックス
  kEnt128_F8  kEnt128_F8D  kEnt128_F8_2000
9)単票に単票サブフォーム(F9M/F9S) (ワークテーブル使用)
  kEnt128_F9  kEnt128_F9D

で、6)を回答。

回答からブログの記事にするまで、いろいろ勉強させられました。
2007 で作成して、2003 / 2000 形式に変換して確認しているわけですが・・・
これに手間取っていました。

※ 2000 には、Form_Undo がない

※ サブフォームで組み込んだフォームの Form_Open / Form_Load は、
  2000 の場合は連続して実行されない時がある。
  特に分ける必要がない場合には、Form_Open 1つに記述した方が無難

※ サブフォームコントロールで、SourceObject にフォームを設定したタイミングで
  LinkMasterFields / LinkChildFields が自動設定される時がある。

私が知らなかっただけなのかも・・・・
今回の記事はチョッくら長いです。
続きを読んでみようかな ---≫

2012/05/14

Category: サンプルかな

TB: 0  /  CM: 0

top △

Excel VBA をやってみた その3(合計値検索) 


前の記事で完敗したものを、Excel で確認できるようにしたものです。
前の記事と言うと 再帰処理にはまる(その4 乾杯!!) になるのですが・・・・

ここで、問題を再度

テーブル「T1」があったとします。
IDF1
1381
2650
3809
4870
5765
6777
7838
8806
9133
10397
1162
12132
13415
1427
15993
16121
17348
18768
19394
20297

ここで、このデータのすべての組み合わせの中から、指定した合計の組み合わせを求めなさい。
例えば、合計が、1574 になる組み合わせは、
3, 5
2, 5, 12, 14
など

Excel でやろうとした時には、
・テーブルは関係ないし、
・ID なんて、そもそもいらない(値のみの羅列で十分)
等あって、以下の様なシートを考えてみました。
kEnt127_1  kEnt127_11  kEnt127_21
つまり、
・A列には値群
・何個使って求めるか・・・・(C1 で指定・・・・空白ならできる限り使って)
・B列に求めたい合計値を入力

で、結果は E1 以降に表示するように・・・・・
(横に展開していくのではなく、下方向に展開していくように・・・・)
(何故って・・・・2000 とか列最大数を超える組合せがあったから・・・)

ただ、合計値を入力する「行」がクセモノ( B列に限定 )
例えば、 21行目( B21 )に合計値を入力したら
A21 から前行に向かって数字じゃないものが現れるまで処理対象の値と解釈します。
(A21 数字か → はい → A20 数字か → はい → A19 数字か → ・・・・・・)
数字じゃないとか、空白ならそこで値解釈は終了・・・・ってな具合で

前回触れていませんでしたが、値は > 0 が暗黙的な前提であります。

用意したシートは「T1」「T1改」「T2」「T2改」と「パターン」の5つ
「T1」と「T2」、「T1改」と「T2改」はそれぞれVBA記述は同じもので値の記述内容が
前回 再帰処理にはまる(その4 乾杯!!) の各テーブルの「F1」(値)になっているところです。
処理的には、前回の「Module31」をベースに修正を行っています。
前回は Access のリスト表示に合わせるために、いろいろとソート云々を組み込んでいましたが、
Excel でってことなので・・・・あまり考える必要はないかな・・・・・

「T1」「T2」での表示では、
 結果表示は値を昇順に並べ替えて・・・・処理の過程等把握しやすいかな・・・・見やすいかな・・・・
「T1改」「T2改」での表示では、
 A列の並び順を尊重して横も同じ順で・・・・

って違いだけです。

なお、実行速度としては、Access でのソート処理等を省くことが出来た(?)ので
1/6 程度に短縮できたような気もします。(最終的な結果表示まで)
続きを読んでみようかな ---≫

2012/04/25

Category: やってみる

TB: 0  /  CM: 0

top △

再帰処理にはまる(その4 乾杯!!) 


乾杯?
これは誤変換ですね、「完敗」が正しいものになります。

No989.合計探索問題、みなさんの頭脳に挑戦!!^^;
http://www.accessclub.jp/bbs7/0002/bbs989.html

これを見てから、いろいろと挑戦してみていました。
そこそこは良さそうなんだけど、そもそもの考え方を変えないと超えれないんですかね・・・・
ここで、問題を再度

テーブル「T1」があったとします。
IDF1
1381
2650
3809
4870
5765
6777
7838
8806
9133
10397
1162
12132
13415
1427
15993
16121
17348
18768
19394
20297

ここで、このデータのすべての組み合わせの中から、指定した合計の組み合わせを求めなさい。
例えば、合計が、1574 になる組み合わせは、
3, 5
2, 5, 12, 14
など

最近 moug の Excel VBA でも似たようなものがありましたね。

私が考えてみたのは7つ
・データごと配列に展開し直してやってみる(Module11 〜 Module14)
kEnt126_img11 kEnt126_img12 kEnt126_img13 kEnt126_img14
・データの展開先にインメモリレコードセットを使ってみる(Module21 〜 Module22)
kEnt126_img21 kEnt126_img22
・個数を制限して、その個数内で求めてみる(Module31)
kEnt126_img31
どの方法でも近づけなかったですね・・・・・
そもそもの考え方は1つですから・・・・・・・・・・
これを確認する為のフォームを作っています。
kEnt126_11a  kEnt126_11b  kEnt126_31b
ここでテーブル「T2」としてレコード数を 20 件から 30 件に増やし、重複する「F1」を1つ
テーブル「T2」で確認する時には、検索値をジワジワと増やしていっていてください。
いきなり増やすと「応答なし」になったりします。
用意したフォームは「F11」「F12」「F13」「F14」「F21」「F22」「F31」の7つ&「F11B」1つ
フォーム名「F」以降は、処理を記述した Module の後ろと同じになっています。
(「11B」は「11」のベタ記述版(再帰部分が遅くなっているのか・・・・・さほど変わりなし(記述方法?)))

また、確認フォームでリスト内をダブルクリックした時には確認用として
kEnt126_Show  kEnt126_Show2003
のフォームが起動されるようになってます。
(個数分を、スクロールしなくてもピッタリと表示できるように工夫)
2007 以降の時には「帳票フォーム」形式(左の図)、その前では「リストボックス」形式(右の図)にて・・・・
( InStr(CurrentProject.Connection.Provider, "ACE") = 0 で起動フォーム切り替え)
( F_SHOW(帳票フォーム) か F_SHOW2003(リスト表示) か)
起動しているバージョンをどう判別するか・・・・これ、わからなかったので・・・・・

処理の速い順となると「F31」≧「F11B」≒「F11」>「F14」>「F13」>「F12」>「F22」>「F21」かな

なお、投稿内にある
hatena さん、YU-TANG さん(クラス および TYPE )の内容を確認できるようにしています。
(コピーして私なりのインデントを付加/テーブル名を変更した形で標準モジュールにて)
(インデントがないと理解しにくいので・・・・って、理解できてませんが・・・・・)
※ このような場合、どのような許可を取れば良いのでしょうか???

同じ環境で起動できるので、違いをみるには良いのかと・・・・・・・・・
続きを読んでみようかな ---≫

2012/04/20

Category: やってみる

TB: 0  /  CM: 0

top △

Excel VBA をやってみた その2 


 ABCDE
1開始日2012/04/01   
2終了日2012/04/30   
3日数30   
4     
5     

という基本となるものがあります。
開始日 <= 終了日 で、日数 > 0 の規則があるとします。

処理列は限定せず1〜3行に入力した時点で自動的に計算結果を埋め込みたい。

例えば、
C1 に開始日を埋めただけでは計算できないので、
その後、C2 なり C3 を埋めた時点で空いているところを自動算出したい。
埋められる順の規則はなく、
C2 → C3 / C3 → C2 なら C1
C1 → C3 / C3 → C1 なら C2
C1 → C2 / C2 → C1 なら C3
また、すべて埋まった状態での変更では、C1 / C2 なら C3 を C3 なら C2 を求め直す。

・その部分が削除されたら計算はしない
 (C列全てが埋まっていたとして C1 を削除しても C2 / C3 から C1 を求め直すことはしない)
・開始日 <= 終了日 でない場合、 日数 は空白に
・開始日があって日数を変更した時、日数 <= 0 なら 終了日 を空白に
と、勝手に追加

Worksheet_Change を使ってみました。
2007 で確認していたのですが、いろいろな動作を確認できて収穫が多かったです。
続きを読んでみようかな ---≫

2012/04/10

Category: やってみる

TB: 0  /  CM: 0

top △

コンボ vs リスト vs メイン/サブ 


コンボボックスで候補を選択する(1件選ぶ)
候補自体が 20 件とかなら選択する操作は楽なのかも・・・・
件数が多くなっても、直に入力すれば前方一致で候補に飛んでくれます。

でも、部分的にしか覚えていない・・・・とか
表示する件数が かなりある・・・・とか

そこで登場するのが
・リストボックス表示で絞り込み・・・・
・メイン/サブの帳票表示で絞り込み・・・・

また、よくリストボックスの表示で、あるフィールド部分を右詰にしたい・・・
(文字列の部分と、数値部分の表示配置を分けたい・・・・)
こういう時には、リストボックス表示に似せた帳票サブフォームで実現したら・・・・・・・
ってなことを言う時があります。

そこで、今回はそれぞれの表示/操作を比較しながら同じような事をしてみたいと・・・
(無理な部分もありますが)

なお、
リストボックス、
メイン/サブフォーム構成では、各フィールドでの曖昧検索を組み込んでみたいと思います。
(コンボボックスでは表示している部分での前方一致だけ・・・・と言っても機能そのまま)

コンボボックスでの画面は、
kEnt124_Comb  kEnt124_Comb2

リストボックス、メイン/サブフォームでの画面では、操作も近いようにしてみる
kEnt124_List  kEnt124_Msub
(この画面では、入力するたびに曖昧検索して絞り込みできやすくするように)
続きを読んでみようかな ---≫

2012/04/09

Category: サンプルかな

TB: 0  /  CM: 0

top △

Form_Delete 以降のイベント 


ある QA で、

Private Sub Form_AfterDelConfirm(Status As Integer)
  MsgBox "Form_AfterDelConfirm"
End Sub

Private Sub Form_BeforeDelConfirm(Cancel As Integer, Response As Integer)
  MsgBox "Form_BeforeDelConfirm"
End Sub

Private Sub Form_Delete(Cancel As Integer)
  MsgBox "Form_Delete"
End Sub

と、確認用 MsgBox を記述してみたが、Form_Delete 以降のイベントが発生しない
(Form_BeforeDelConfirm / Form_AfterDelConfirm の MsgBox が表示されない)

という事がありました。
過去記事でも、削除の操作を更新操作に置換えるために上記イベントを使っていました。

どのような構成にすると、イベントは発生しなくなるんだろうか・・・・
これを考えてみました。
また、実際には子(サブ)で削除されたタイミングで、親(メイン)の表示を変更したいという事で、
自力で処理するようにしてみてはどうだろうか・・・・というものも・・・

確認するフォームは親子(メイン/サブ)構成のフォームで、
親(メイン):非連結 子(サブ)の合計を表示するもの
子(サブ):連結の帳票フォーム

kEnt123  kEnt123_d
確認のパターンは以下の6つ  以下()内の記述は(親フォーム名/子フォーム名)
0)イベント確認  (F_T0M / F_T0)
1)クラス 改良前  (F_T1M / F_T1)
2)自力 改良前  (F_T2M / F_T2)
3)クラス 改良後  (F_T3M / F_T3)
4)自力 改良後  (F_T4M / F_T4)
5)クラス 改良その2  (F_T5M / F_T5)

なお、上記画像はフォーム「F_ALL」で、オプショングループで対象サブフォームを切り替えるもの

確認操作は、
・サブフォームにレコードを追加して
・レコードセレクタを使って
・「Delete」キーで削除してみる
という流れになります。
続きを読んでみようかな ---≫

2012/03/31

Category: やってみる

TB: 0  /  CM: 0

top △

リストボックス操作の模索 


リストボックスは、コンボボックスと異なり
「複数選択することも出来る」
ものになりますが、操作する上で便利なんだろうか・・・・

マウスでクリックしながら「Shift」「Ctrl」キーを押したり・・・
便利は便利ですけど・・・・

という事で(脈絡ありませんが)、

テーブル「T1」
an: オートナンバー
src: テキスト型
メモ: テキスト型

を用意し、
「src」「メモ」をリストに表示し、選択したレコードの「メモ」に値を設定する
これをやってみたいと思います。

1)リストボックスを2つ並べて、クリックしたら他方に移す
kEnt122_11  kEnt122_12
それなりに表示する領域が必要になりますが、
横にリストボックスを並べて表示し、右側に表示された「メモ」に対して設定
この時、
1−1)ワークテーブルを使用する(フォーム:F1)
1−2)Dictionary を使用する(フォーム:F3)

2)複数選択を使ってみる
kEnt122_21  kEnt122_22
複数選択した「メモ」に対して設定(フォーム:F2)

私は並べた方が、処理対象はこれ・・・・イメージしやすいかな
選択した後、何をするかによるとは思います。


今回やってみて確認できたこと

CurrentProject.Connection.Execute "SQL文"
の記述だけでは ActiveX の参照設定は、いらないみたい
続きを読んでみようかな ---≫

2012/03/31

Category: サンプルかな

TB: 0  /  CM: 0

top △

再帰処理にはまる(その3) 


anグループ記号flg
1WXT
2WXR
3WXZ
4STJ
5XYM
6FGS
7FGX
8OPQ
9OPI
10RSA
11RSC
12RSJ
13RSM
14BCY
15EFJ
16EFP
17EFN
18EFB
19KLT
20JKA
21JKM
22JKI

というテーブル「TA」があったとして、
まず一回目、「記号」に "A" があるグループの「flg」を "×" にします。
二回目、「flg」が "×" になった「記号」を含むグループの「flg」を "×" にします。
三回目、二回目と同様に「flg」が "×" になった「記号」を含むグループの「flg」を "×" にします。

とした場合、どうしましょうか・・・・

サンプルファイルは 再帰処理にはまる(その1) にあります
再帰処理にはまる(その2) も読んでいただければと
続きを読んでみようかな ---≫

2012/03/12

Category: やってみる

TB: 0  /  CM: 0

top △

再帰処理にはまる(その2) 


vAry = Array(0, 1.1, 4.4, 3.3, 2.2) という配列があった時、
何組かの同じ配列を使って総当たりで、たし算しましょう。
その結果、重複する数値は排除して小さい順に表示しましょう。

例えば、
A = Array(0, 1.1, 4.4, 3.3, 2.2)
B = Array(0, 1.1, 4.4, 3.3, 2.2)
C = Array(0, 1.1, 4.4, 3.3, 2.2)
の3つを使って、
A(0)+B(0)+C(0)= や A(0)+B(0)+C(1)= や A(0)+B(0)+C(2)= ・・・・・
A(0)+B(1)+C(0)= や A(0)+B(1)+C(1)= や A(0)+B(1)+C(2)= ・・・・・
・・・・
A(4)+B(3)+C(0)= や A(4)+B(3)+C(1)= や A(4)+B(3)+C(2)= ・・・・・
A(4)+B(4)+C(0)= や A(4)+B(4)+C(1)= や A(4)+B(4)+C(2)= ・・・・・
の結果、重複を排除して小さい順に
 0
 1.1
 2.2
 3.3
 4.4
 5.5
 6.6
 7.7
 8.8
 9.9
 11
 12.1
 13.2


サンプルファイルは 再帰処理にはまる(その1) にあります
再帰処理にはまる(その3) も読んでいただければと
続きを読んでみようかな ---≫

2012/03/12

Category: やってみる

TB: 0  /  CM: 0

top △