Microsoft Access Club Access超初心者対象Forum Access初級者対象Forum Access初・中級者対象Forum Access VBA Tips Forum DAO、ADO、SQL Forum

     

リストへもどる

投稿記事の一括表示

タイトルVBAで作ったフォームのボタンを押した先で、チェックボックスなどの値を取得したい
記事No172190
投稿日: 2018/03/27(Tue) 08:34
投稿者ハッカ飴
解決済: ON
OS:win10
Access Version:2003
超々初心者のハッカ飴です。よろしくおねがいします。

今回のやりたいコト自体はタイトルの通りで、ごくごく初歩的なコトだと思うのですが…
いかんせん、疑問点が多すぎてなかなか進まないでいます。

ChkItem():
Form、CheckBox、CommandButtonをVBA内で配置して、
Buttonを押したらCheckBoxのValueを表示する(したい)。
とりあえず機能はしているのですが、
きっともっとスマートな方法があるに違いないと思い質問に至りました。

また作っている中で、疑問が浮かび、3点、コメントに書き込んであります。
こちらは、きっと難しい話になるだろうなという予感はあるので、
”ココを読め”、”コレでぐぐれ”、”正解はこう。理屈は略”
的な返答がいただければ十分と思っています。

以上、よろしくおねがいします。

Option Compare Database
Option Explicit

Private Sub ChkItem()
Dim Frm_main As Form, Str_main As String
Dim Chk_chkbox As CheckBox, Str_chkbox As String
Dim Btn_button As CommandButton, Str_button As String

Set Frm_main = CreateForm
Str_main = Frm_main.Name
Frm_main.Caption = "Frm_ChkItem_main"
'フォームにチェックボックスとボタンを配置
Set Chk_chkbox = CreateControl(Frm_main.Name, acCheckBox, , "", , 100, 100)
Str_chkbox = Chk_chkbox.Name
Set Btn_button = CreateControl(Frm_main.Name, acCommandButton, , "", , 400, 100)
Str_button = Btn_button.Name
Btn_button.Caption = "実行"

'※ 疑問点1 ※
Forms(Str_main)(Str_button).OnClick = "= Ev_Btn_OnClick(" & Forms(Str_main)(Str_chkbox).Name & ")"
'ボタンのクリックにプロシージャを設定してみた。
'なぜかstringのはずの.Nameじゃないとエラー。受け取り側はChkBox型。
'Forms(Str_main)(Str_chkbox) = Forms(Str_main)(Str_chkbox).Value になっている?
'.Nameであっているのか?たまたま動いているだけか?

DoCmd.Restore
DoCmd.OpenForm Frm_main.Name

'チェックボックスの初期値:true
Forms(Str_main)(Str_chkbox).Value = True
Debug.Print Forms(Str_main)(Str_chkbox).Value & ":初期値"



'※ 疑問点2 ※
Call call_me1(Forms(Str_main)) '方法1:フォーム自体?を渡す
Call call_me2(Forms(Str_main).Name) '方法2:.Nameを渡す
'callで呼び出すと、想定通りに動作する。

'しかし、イベントプロシージャとして設定すると…
'方法1:Forms(Str_main)(Str_button).OnClick = "= Ev_ChkItem_OnClick(" & Forms(Str_main) & ")" 'call_me1(Frm_main As Form)
'方法2:Forms(Str_main)(Str_button).OnClick = "= Ev_ChkItem_OnClick(" & Forms(Str_main).Name & ")" 'callme_2(Frm_main As String)
'イベント プロパティに指定した式 クリック時 でエラーが発生しました:
'このオブジェクトには、オートメーション オブジェクト 'フォーム[数字]’は含まれません。

'というエラーが、方法1,2とも、「ボタン押したとき」にでる。
'フォームはForms(Str_main) = Form(Str_main).Name になっている?
'正しくは別のプロパティで引き渡すものなのか、
'それともイベント発生時はフォームを受け渡せないものなのか。(CheckBoxも同様の問題?)

'※ 疑問点3 ※
'DBのrsやcnはNothingにするのに同様にSetしているフォームとかはしなくていいんだろうか?
End Sub
Public Function Ev_Btn_OnClick(Chk_chkbox As CheckBox)
'※ ココが本当にやりたいコト ※
'subやfunctionで、他でopenされたフォーム内のコントロールを参照したい
'一応この形で参照、変更が可能なのは確認できた
'そもそもがこの方法自体がナンセンスではないかと思っており、
'もっとスマートな(というか、当たり前の)方法があるのではない

'(CheckBox.nameに連番をつけてあり、subやfunctionの中で、て配列のように管理する方法をとりたいと考えている
' しかし、疑問点2の問題で、Froms(Str_main)(Chk_box.Name)の方法が使えずにいる
' この形で、呼び出し元でForを使って回す回避策は思いついたが絶対スマートな方法じゃないですし…
Debug.Print "本当にやりたいコト(Frm_mainの)Check box のvalueを見たい " & Time()
Debug.Print Chk_chkbox.Value & ":引数方式でなんとなくできてる"
Chk_chkbox.Value = Not (Chk_chkbox.Value)
End Function
Private Function call_me1(Frm_main As Form)
Debug.Print "call_me1:疑問点2 " & Frm_main.Caption & " .Captionを表示。callならできる " & Time()
End Function
Private Function call_me2(Frm_main As String)
Debug.Print "call_me2:疑問点2 " & Forms(Frm_main).Caption & " .Captionを表示。callならできる " & Time()
End Function

タイトルRe: VBAで作ったフォームのボタンを押した先で、チェックボックスなどの値を取得したい
記事No172191
投稿日: 2018/03/27(Tue) 08:59
投稿者ハッカ飴
解決済: ON
参照先http://accessclub.jp/bbs3/wforum2.cgi?mode=allread&no=172176&page=0
もう一つ、疑問点ありました。

※ 疑問点4※
先日 http://accessclub.jp/bbs3/wforum2.cgi?mode=allread&no=172176&page=0
でhatenaさんに教えていただいた、

Forms(From_Name)(CheckBox_Name)

の、意味がいまいちわかっていません。(どんなキーワードで探したらいいのかすらわからない。)

Forms(From_Name)で、フォーム一覧から名前で紐づけて、
フォームのオブジェクトにアクセスできるのは理解できました。
CheckBox_Nameに、Formの要素?子?のコントロールの.Nameを入れることでアクセスできるのを、
お約束的に覚えましたが、()の意味…
Formsの引数ではなさそうだから、うしろの.に対して、なにか指示?をしているのか…
が、まったくわかっていません。

また、.Nameではなく、コントロール自体…
例えば Froms(From_Name).??CheckBox?? のような他のアクセス方法はないのかどうか。
あたりが疑問です。

こちらも、”ココを読め”、”コレでぐぐれ”、”お約束でいい”でも十分です。
改めて、併せてよろしくお願いします。

タイトルRe^2: VBAで作ったフォームのボタンを押した先で、チェックボックスなどの値を取得したい
記事No172193
投稿日: 2018/03/27(Tue) 10:54
投稿者hatena
解決済: ON
> Forms(From_Name)(CheckBox_Name)
>
> の、意味がいまいちわかっていません。(どんなキーワードで探したらいいのかすらわからない。)

Forms というのはわかりますよね。
現在のプロジェクト上で開いているフォームのコレクションです。

一つのフォームにアクセスするには、
Forms(0) というようにインデックスでアクセス、
Forms("フォーム名") というように名前でアクセス、
という方法があります。

ほかに、Forms!フォーム名 というアクセス方もあります。
事前に作成してあり、フォーム名が固定の場合はこれでいいのですが、
CreateFormで作成したものは、フォーム名が固定でないので、この方法は使えません。

つぎに、

Forms(From_Name)(CheckBox_Name)

は、実は、省略せずに記述すると下記になります。

Forms(From_Name).Controls(CheckBox_Name)

.Controls はフォーム上のコントロールのコレクションです。
既定のプロパティなので省略することができます。
引数にはインデックスか名前を指定します。
名前は固定なら、

Forms(From_Name)!チェックボックス名

というアクセスもできます。

> また、.Nameではなく、コントロール自体…
> 例えば Froms(From_Name).??CheckBox?? のような他のアクセス方法はないのかどうか。
> あたりが疑問です。

コントロール自体なら、

Dim chk As CheckBox

Set chk = Forms(From_Name)(CheckBox_Name)

と事前に変数に代入しておけば、それ以降は変数でコントロール自体に直接アクセスできます。
これは、既にお気づきですね。

下記のように名前を固定すれば、!でアクセスできます。

Set Chk_chkbox = CreateControl(Frm_main.Name, acCheckBox, , "", , 100, 100) '
Chk_chkbox.Name = "MyChkbox"
DoCmd.Restore
DoCmd.OpenForm Frm_main.Name
Forms(Str_main)!MyChkbox.Value = True
Debug.Print Forms(Str_main)!MyChkbox.Value

タイトルRe: VBAで作ったフォームのボタンを押した先で、チェックボックスなどの値を取得したい
記事No172194
投稿日: 2018/03/27(Tue) 12:22
投稿者hatena
解決済: ON
> '※ 疑問点1 ※
> Forms(Str_main)(Str_button).OnClick = "= Ev_Btn_OnClick(" & Forms(Str_main)(Str_chkbox).Name & ")"
> 'ボタンのクリックにプロシージャを設定してみた。
> 'なぜかstringのはずの.Nameじゃないとエラー。受け取り側はChkBox型。
> 'Forms(Str_main)(Str_chkbox) = Forms(Str_main)(Str_chkbox).Value になっている?
> '.Nameであっているのか?たまたま動いているだけか?

OnClickプロパティは文字列型のプロパティです。
デザインビューでコントロールを引数とする Function を設定するときは、

=Function_Name([コントロール名])

と設定します。これで自分のフォーム上のコントロールオブジェクトを参照します。

=Function_Name(コントロール名) と [] を省略した場合、Accessが [] を自動補完します。

VBAで設定するなら、文字列として、下記のように設定します。

Forms(Str_main)(Str_button).OnClick = "=Function_Name([コントロール名])"

Forms(Str_main)(Str_button).OnClick = "=Function_Name(コントロール名)"
と[]を省略することもできますが、裏で [] が自動補完されてます。

つまり文字列型のプロパティである OnClick には、コントロール名を文字列として設定するが、
関数の引数がオブジェクトとして定義されていたらオブジェクトとして解釈するし、
文字列として定義されていたら、文字列として解釈するということです。

Forms(Str_main)(Str_button).OnClick = "= Ev_Btn_OnClick(" & Forms(Str_main)(Str_chkbox).Name & ")"

で、Forms(Str_main)(Str_chkbox).Name は "チェック0" になっているので、結局、

Forms(Str_main)(Str_button).OnClick = "= Ev_Btn_OnClick(チェック0)"

と設定しているとことになります。

> '※ 疑問点2 ※
> Call call_me1(Forms(Str_main)) '方法1:フォーム自体?を渡す
> Call call_me2(Forms(Str_main).Name) '方法2:.Nameを渡す
> 'callで呼び出すと、想定通りに動作する。

このコードはその認識であってます。

プロパティとVBAではオブジェクトの参照方法がことなるということ。
また、イベントのプロパティは文字列であるということ。
上記の点から、プロパティに設定する式と、VBAのコード自体を比較することがナンセンス
だということは理解できますよね。

> '方法1:Forms(Str_main)(Str_button).OnClick = "= Ev_ChkItem_OnClick(" & Forms(Str_main) & ")" 'call_me1(Frm_main As Form)
> '方法2:Forms(Str_main)(Str_button).OnClick = "= Ev_ChkItem_OnClick(" & Forms(Str_main).Name & ")" 'callme_2(Frm_main As String)

は、

Debug.Print "= Ev_ChkItem_OnClick(" & Forms(Str_main) & ")"
Debug.Print "= Ev_ChkItem_OnClick(" & Forms(Str_main).Name & ")"

としてみて、どのような文字列が生成されるのか、あるいはエラーがでるのか、確認してみてください。

>'※ ココが本当にやりたいコト ※
>'subやfunctionで、他でopenされたフォーム内のコントロールを参照したい
>'一応この形で参照、変更が可能なのは確認できた
>'そもそもがこの方法自体がナンセンスではないかと思っており、
>'もっとスマートな(というか、当たり前の)方法があるのではない

何をやりたいのか、イメージが掴めません。

そもそも、運用時に、CreateForm や CreateControl で動的にオブジェクトを
生成するということはAccessでは通常はしません。
開発時にウィザード的なツールとして CreateForm や CreateControl を使うことはありますが。

大量のチェックボックスが必要な場合、
連結フォームなら、詳細セクションに一つ配置しておけば、
帳票フォームでレコード数分のチェックボックスが表示される。

非連結フォームの場合は、想定される最大数のチェックボックスを配置しておいて、
Visibleで表示/非表示を切り替えるという設計にします。

何をしたいのか、したいことを具体的に提示されたら、
より適切な方法をアドバイスできると思います。

タイトルRe^2: VBAで作ったフォームのボタンを押した先で、チェックボックスなどの値を取得したい
記事No172197
投稿日: 2018/03/28(Wed) 08:13
投稿者ハッカ飴
解決済: ON
まず一番に知りたいのは、

  □ [ボタン]

(□:チェックボックス
こんなフォームがあり、ボタンを押したら、button_OnClickに飛ぶ。として、
このとき、Function button_OnClick()の中から、引数などを使わなくても、
チェックボックスの.valueやformの情報を見ることが出来ないのだろうか。
今回引数としてCheckBoxオブジェクトを渡し成功したが、
もっとスマートな方法があるのではないか。

といった感じの疑問です。

一般的には
予めフォームは作っておき、固定名をつける。
そうすることで、subやFunctionからは、特になにか引数などを渡さなくても、
固定名でアクセスすればよい。
といった理解で良いのでしょうか。


実際に作っているものは、
「各事業所にある、資材ごとに、過不足の状況をチェックボックスで入力しDBで管理する。」
です

T_資材マスター  key=SziId(重複なし(レコードの増減あり
T_事業所マスター Key=JgsId(重複なし(レコードの増減あり
T_過不足一覧   SziId、JgsId、過剰フラグ、不足フラグ
(※事業所、資材ともに増減があるため、ずらっとカラムを並べるより、
( この形式が好ましいと考えた。

画面イメージ

[事業所名(コンボボックス)]

過剰     不足
□ [資材名] □
□ [資材名] □
 ・
 ・
 ・
[閉じるボタン]

(□←チェックボックス
(デフォルトである三角でレコード操作できる機能があるのは見て取れたが、
 「扱いづらそうだ」の一言でコンボボックス(プルダウンメニュー)にしました。


コンボボックスに表示されている名前のJgsIdに一致する行をT_過不足一覧から抽出し、
各チェックボックスの状況を、反映し表示する
Function 表示更新(Form,ComboBoxともにコントロール渡し)をCall。Callなら成功。

ココまでは良いのですが、
ComboBox.OnChange時の中で、Function 表示更新(From,ConboBox)を呼び出したい。
そのためには、Form及び不定個数のチェックボックスの.valueがほしいが、
うまく、Formの情報を渡せないでいる。
(教えていただいた、Forms(From_Name).Controls(CheckBox_Name)
 により、Formの情報があればCheckBoxの情報を渡す必要はない事は理解)

こんな状態です。


他、教えていただいて理解したこと
◯Forms(From_Name)(CheckBox_Name)の件
>Forms(From_Name).Controls(CheckBox_Name)
なるほど!かなりスッキリしました。

◯イベントプロシージャ設定の件
>OnClickプロパティは文字列型のプロパティです。
Forms(Str_main) & "文字列" この式自体が出来ない事に気づきました。
方法1がコンパイル通ったと思っていたのは勘違いでした。。

◯文字列成形部分
(混ざるのでイベントプロシージャ名をを少々変えました)
Public Function Ev_ChkItem_OnClick1(Frm_main As Form)
= Ev_ChkItem_OnClick1(フォーム1.Name)
= Ev_ChkItem_OnClick1(フォーム1)
= Ev_ChkItem_OnClick1([フォーム1])
Public Function Ev_ChkItem_OnClick2(Frm_main_name As String)
= Ev_ChkItem_OnClick2(フォーム1.Name)
= Ev_ChkItem_OnClick2(フォーム1)
= Ev_ChkItem_OnClick2([フォーム1])
(何故か(自動判断?)、型が合わない的なエラーはませんでした。)
この6パターン全てで、実行しフォームは開くが、ボタン押したときに、
'イベント プロパティに指定した式 クリック時 でエラーが発生しました:
'このオブジェクトには、オートメーション オブジェクト 'フォーム[数字]’は含まれません。
と、でました。
イベントプロシージャ内の最初のDebug.Printが出力されません。
単に関数名が間違っていないかを確認するため、
イミディエイトウィンドウからコピペもしてみましたがダメでした。

また、一応、なにかのコントロールを渡せれば、.Parentを使ってフォームへアクセスできそうだ。
というのは見つけられたのですが、やっぱりスッキリしませんので…

◯連結フォームの件
調べてみます!


>そもそも、運用時に、CreateForm や CreateControl で動的にオブジェクトを
>生成するということはAccessでは通常はしません。

ガーンorz
参考にしたモジュール(?)いくつかが、VBA内で作っていたので…
画面一つだけでしたし。気軽に考えていました。
確かにフォーム作成を説明したページのほとんどはデザインビュー?ツールを使ったものでしたorz
そのモジュールだけで完結させるための例のためだったのでしょうかorz

だいぶ、いろいろ理解できてきたような気がします。
いろいろなページを見て回っているのですが、小技やTips、あるいは突っ込んだ内容が多く、
ごくごく一般的な考え方、進め方がわからないままでいます。


大変助かっています。本当にありがとうございます。
もしお時間の空きがあれば、引き続きご指導ください。
よろしくおねがいします。

タイトルRe^3: VBAで作ったフォームのボタンを押した先で、チェックボックスなどの値を取得したい
記事No172198
投稿日: 2018/03/28(Wed) 11:05
投稿者hatena
解決済: ON
非常に研究熱心かつ探究心旺盛で感心させられます。
回答者としてもこういう方とやりとりするのは、
楽しいし自分自身の勉強にもなります。

質問が多岐に渡っているので、とりあえず一つずつ回答していきます。
(私自身もこれにかかりっきりになるわけにもいかなので)

> こんなフォームがあり、ボタンを押したら、button_OnClickに飛ぶ。として、
> このとき、Function button_OnClick()の中から、引数などを使わなくても、
> チェックボックスの.valueやformの情報を見ることが出来ないのだろうか。
> 今回引数としてCheckBoxオブジェクトを渡し成功したが、
> もっとスマートな方法があるのではないか。

「クリック時」プロパティに
=button_OnClick()
と設定した時の話ですね。

Function button_OnClick() が、フォームモジュールに記述してあるとき、
自分自身のフォームは Me で参照できます。
自分自身を参照する場合は、
クリック時なら、自分自身にフォーカスがあるので、
Me.ActiveControl
で参照できます。
自分自身にフォーカスがなくても発生する場合は、
引数で渡すしかないですね。

標準モジュールに記述してあるときは、
自分自身のフォームは CodeContextObject で参照できます。
自分自身はクリック時なら CodeContextObject.ActiveControl
以下同様。

複数コントロールのイベントを共通化して、
自分自身にフォーカスがなくても、自分自身を引数無しで、
参照することは、クラスモジュールを使えば可能です。
ただ、これを説明しているときりがなくなるのて、
とりあえず、現状の疑問点が解決できてから、
ご自身で調べて学習してみてください。

> 一般的には
> 予めフォームは作っておき、固定名をつける。
> そうすることで、subやFunctionからは、特になにか引数などを渡さなくても、
> 固定名でアクセスすればよい。
> といった理解で良いのでしょうか。

そうなりますね。名前は、chk1, chk2 ・・・ というように番号を付加して、
Me("chk" & i) というような感じでアクセスします。
自分時点は、ActiveControl で間に合います。

まとめて操作するときは、下記が参考になるでしょう。
<a href="https://hatenachips.blog.fc2.com/blog-entry-23.html">コントロールをグループ化して操作する - hatena chips</a>

ただ、Accessの場合は、このようなことが必要になる機会はあまりありません。

> 画面イメージ
>
> [事業所名(コンボボックス)]
>
> 過剰     不足
> □ [資材名] □
> □ [資材名] □
> ・
> ・
> ・
> [閉じるボタン]

非連結のフォームに非連結コントロールをレコード件数分ならべて
操作しようということだと思いますが、
CreateControlするにしても、事前がコントロールを配置しておいて可視を切り替えるにしても、非常に長大なコードが必要になりますね。

テーブルまたはクエリをレコードソースとする帳票フォームにすれば、
フォームヘッダーにコンボボックス、
詳細セクションに1レコード分の連結コントロール
フォームフッターに[閉じるボタン]を配置するだけですみます。

コードは[事業所名(コンボボックス)]の更新後処理でフィルターをかける
コードを書くだけですみます。

メインフォーム/サブフォーム形式にすればそれさえも必要ないです。

ただ、連結だと、更新が即テーブルに反映されます。
複数レコードの更新をして、「更新」ボタンを押したとのに初めて、
テーブルに反映させたいという要請もよくあります。

そういう場合は、元テーブルと同じ構成の作業テーブルを作成しておいて、
それと連結させる方法をとります。

元テーブルから作業テーブルへデータ読み込み、更新後、元テーブルへ書き込み、
という処理が必要になりますが、非連結でコントロールを多数配置する方法に比べても、
はるかに少ないコードで実現できます。


> ◯連結フォームの件
> 調べてみます!

> いろいろなページを見て回っているのですが、小技やTips、あるいは突っ込んだ内容が多く、
> ごくごく一般的な考え方、進め方がわからないままでいます。

連結フォームというものが理解できいないなら、
入門書を購入して(あるいは入門サイト)、基本から体系的に学習してください。
基本の機能(テーブル、クエリ、フォーム、レポート)とウィザードだけで
ある程度のところまではノンコーディングでできてしまいます。
Accessの機能を最大限活用してそれで不足している部分をVBAで補うという
設計にするのが基本です。

タイトルRe^4: VBAで作ったフォームのボタンを押した先で、チェックボックスなどの値を取得したい
記事No172200
投稿日: 2018/03/28(Wed) 16:28
投稿者ハッカ飴
解決済: ON
> 非常に研究熱心かつ探究心旺盛で感心させられます。

 そう言っていただけると大変うれしいです。
謎のお約束のままなんとなく出来ちゃったでモヤモヤするより、
理解してスッキリしたいタイプでして。

◯フォームの参照方法の件【済】
 了解です!後日、動きを確認します。

◯複数のコントロールの件【済】
ActiveControl  orz
 イベントプロシージャの引数にiを渡してやればどこから呼ばれたかわかる!
と、得意になってましたorz
クラスについては、もう少し余裕が出来たら勉強してみたいと思います。

◯連結フォームの件【済】
 連結フォーム自体は理解できました。
また、ウィザードで表形式を選ぶ事で、求めていた形があっさり出来上がりました。
あとは、フォームのプロパティのフィルターに、事業所ID=ComboBox.Column(1)的な事が書ければ…
までたどり着きましたが…

> コードは[事業所名(コンボボックス)]の更新後処理でフィルターをかける
> コードを書くだけですみます。

 デザインビューでは出来ないようですね…早速Meを使って…実現できました!
 Accessわかっていれば、10分で作れるレベルの事でしたorz

 メイン/サブフォームについて「こうすればできるよ」と手順を書いている人は多く、
特に利点については書かれておらず…見た目だけ?と思ってスルーしていました。
そのような利点があるなら、ちょっと調べて、効果ありそうなら取り込んでみようと思います。


> Accessの機能を最大限活用してそれで不足している部分をVBAで補うという
> 設計にするのが基本です。

 了解しました!ありがとうございます!
Accessナメてました。
ただのデータベースで、操作しやすくするためには、VBAで作りこむ必要があると思い込んでいました。
ですが、大抵の事はやってくれそうですね…恐るべしAccess!

タイトルRe^5: VBAで作ったフォームのボタンを押した先で、チェックボックスなどの値を取得したい
記事No172202
投稿日: 2018/03/28(Wed) 17:03
投稿者hatena
解決済: ON
>  デザインビューでは出来ないようですね…早速Meを使って…実現できました!
>  Accessわかっていれば、10分で作れるレベルの事でしたorz
>
>  メイン/サブフォームについて「こうすればできるよ」と手順を書いている人は多く、
> 特に利点については書かれておらず…見た目だけ?と思ってスルーしていました。
> そのような利点があるなら、ちょっと調べて、効果ありそうなら取り込んでみようと思います。

今回だと、
メインフォームは非連結で、
コンボボックスの価集合ソースをT_事業所マスターにします。
サブフォームは、T_資材マスターとT_過不足一覧を結合したクエリをレコードソースにします。

サブフォームのリンク親フィールドにコンボボックス名、
リンク子フィールドに「JgsId」を設定すれば、
コンボボックスで選択した事業のデータがサブフォームに表示されます。

さらに、新規データを入力する場合、メインのJgsIdを既定値として自動で
入力もしてくれます。

まあ、帳票フォームで、同じことをコードで記述してもたいしたコード量ではないですが。


> Accessナメてました。
> ただのデータベースで、操作しやすくするためには、VBAで作りこむ必要があると思い込んでいました。
> ですが、大抵の事はやってくれそうですね…恐るべしAccess!

Excelや他のプログラミング言語の経験がある人が、たまに陥る状況ですね。

下記のリンク先で非連結フォームやクラスモジュールの使用サンプルを公開していますが、
かなり特殊な用途だということが理解できると思います。

カレンダー形式のスケジュール管理フォーム作成 その1 - hatena chips
https://hatenachips.blog.fc2.com/blog-entry-186.html

カレンダー形式という特殊なレイアウトを実現するために非連結フォームを使用してます。

ドラッグできるラベルのクラス化 - hatena chips
https://hatenachips.blog.fc2.com/blog-entry-160.html?cat-16

ドラッグという標準の機能にない機能を実現するために使用してます。

とりあえずAccessの基本機能、特に クエリ、フォーム、レポート についてしっかり理解することですね。

タイトルRe^6: VBAで作ったフォームのボタンを押した先で、チェックボックスなどの値を取得したい
記事No172210
投稿日: 2018/03/29(Thu) 17:06
投稿者ハッカ飴
解決済: ON
> 今回だと、

 まさしくそのとおりの手順で実現出来ました。ありがとうございます!

> サブフォームのリンク親フィールドにコンボボックス名、
> リンク子フィールドに「JgsId」を設定すれば、
> コンボボックスで選択した事業のデータがサブフォームに表示されます。
>
> さらに、新規データを入力する場合、メインのJgsIdを既定値として自動で
> 入力もしてくれます。

 ちょうどリンク子フィールドってなんだろ?思っていました。
メイン/サブフォーム、すごい便利ですね。
あちこちで紹介されている意味をここでやっと理解できました。


> とりあえずAccessの基本機能、特に クエリ、フォーム、レポート についてしっかり理解することですね。

 つくづくそう思いました。
改めて、(求めてる事とちがうっとすっ飛ばした)説明ページ等をちゃんとした目線で読み直さないと。と。

> ドラッグできるラベルのクラス化 - hatena chips

資材名や事業所の表示順序入れ替え機能も作るつもりでしたので、
ここでクラスについても学んで見ようと思います。

 目が覚めた感じです。いろいろとありがとうございます!

タイトルRe^7: VBAで作ったフォームのボタンを押した先で、チェックボックスなどの値を取得したい
記事No172211
投稿日: 2018/03/29(Thu) 17:25
投稿者hatena
解決済: ON
> > ドラッグできるラベルのクラス化 - hatena chips
>
> 資材名や事業所の表示順序入れ替え機能も作るつもりでしたので、
> ここでクラスについても学んで見ようと思います。

ちょっと違うかも。

テーブルデータの表示順を変更したいということなら、
下記の方が近いですね。

帳票サブフォームで行番号フィールドの連番を維持する - hatena chips
https://hatenachips.blog.fc2.com/blog-entry-58.html

ドラッグできるラベルは、例えば、
オフィスのディスク配置、担当者配置とか、
マップ上にアイテムを配置する時とか、
の用途を想定しています。

タイトルRe^3: VBAで作ったフォームのボタンを押した先で、チェックボックスなどの値を取得したい
記事No172199
投稿日: 2018/03/28(Wed) 11:46
投稿者hatena
解決済: ON
> ◯文字列成形部分
> (混ざるのでイベントプロシージャ名をを少々変えました)
> Public Function Ev_ChkItem_OnClick1(Frm_main As Form)
> = Ev_ChkItem_OnClick1(フォーム1.Name)
> = Ev_ChkItem_OnClick1(フォーム1)
> = Ev_ChkItem_OnClick1([フォーム1])
> Public Function Ev_ChkItem_OnClick2(Frm_main_name As String)
> = Ev_ChkItem_OnClick2(フォーム1.Name)
> = Ev_ChkItem_OnClick2(フォーム1)
> = Ev_ChkItem_OnClick2([フォーム1])
> (何故か(自動判断?)、型が合わない的なエラーはませんでした。)
> この6パターン全てで、実行しフォームは開くが、ボタン押したときに、
> 'イベント プロパティに指定した式 クリック時 でエラーが発生しました:
> 'このオブジェクトには、オートメーション オブジェクト 'フォーム[数字]’は含まれません。
> と、でました。

Public Function Ev_ChkItem_OnClick1(Frm_main As Form)
Public Function Ev_ChkItem_OnClick2(Frm_main_name As String)
この2つの関数をどこに記述しているのか(フォームモジュール OR 標準モジュール)
また、この関数の中身も提示してください。

タイトルRe^4: VBAで作ったフォームのボタンを押した先で、チェックボックスなどの値を取得したい
記事No172201
投稿日: 2018/03/28(Wed) 16:35
投稿者ハッカ飴
解決済: ON
> > ◯文字列成形部分
> > (混ざるのでイベントプロシージャ名をを少々変えました)
> > Public Function Ev_ChkItem_OnClick1(Frm_main As Form)
> > = Ev_ChkItem_OnClick1(フォーム1.Name)
> > = Ev_ChkItem_OnClick1(フォーム1)
> > = Ev_ChkItem_OnClick1([フォーム1])
> > Public Function Ev_ChkItem_OnClick2(Frm_main_name As String)
> > = Ev_ChkItem_OnClick2(フォーム1.Name)
> > = Ev_ChkItem_OnClick2(フォーム1)
> > = Ev_ChkItem_OnClick2([フォーム1])
> > (何故か(自動判断?)、型が合わない的なエラーはませんでした。)
> > この6パターン全てで、実行しフォームは開くが、ボタン押したときに、
> > 'イベント プロパティに指定した式 クリック時 でエラーが発生しました:
> > 'このオブジェクトには、オートメーション オブジェクト 'フォーム[数字]’は含まれません。
> > と、でました。
>
> Public Function Ev_ChkItem_OnClick1(Frm_main As Form)
> Public Function Ev_ChkItem_OnClick2(Frm_main_name As String)
> この2つの関数をどこに記述しているのか(フォームモジュール OR 標準モジュール)

呼び出し元の、
Private Sub ChkItem()
と同じファイル?モジュール?で、標準モジュールにあります。

> また、この関数の中身も提示してください。

Public Function Ev_ChkItem_OnClick1(Frm_main As Form)
' Debug.Print frm_man.Name & " at Ev_ChkItem_OnClick1 " & Time()
End Function
Public Function Ev_ChkItem_OnClick2(Frm_main_name As String)
' Debug.Print Frm_main_name & " at Ev_ChkItem_OnClick2 " & Time()
End Function

事実上空っぽ(コメントアウト)です…

通常、行われない(しないで済む)であろう記述なのは理解できましたが…何故できないのか…
状況が一気に好転し、後日ゆっくり検証もできますので、今、解決できなくても十分ですので…。

タイトルRe^5: VBAで作ったフォームのボタンを押した先で、チェックボックスなどの値を取得したい
記事No172203
投稿日: 2018/03/28(Wed) 17:07
投稿者hatena
解決済: ON
> 通常、行われない(しないで済む)であろう記述なのは理解できましたが…何故できないのか…
> 状況が一気に好転し、後日ゆっくり検証もできますので、今、解決できなくても十分ですので…。

デザインビューでプロパティに設定する式と、VBAのコードはまた別物ですので、
その辺は、とりあえず、基本機能を理解して、プロパティに式を設定する場合をいろいろ経験してから、
もう一度戻って、見直してみると、いろいろ分かってくると思います。

タイトルRe^6: VBAで作ったフォームのボタンを押した先で、チェックボックスなどの値を取得したい
記事No172208
投稿日: 2018/03/29(Thu) 16:37
投稿者ハッカ飴
解決済: ON
> デザインビューでプロパティに設定する式と、VBAのコードはまた別物ですので、

 そのようですね。
ComboBoxの初期値が空っぽだったので、デザインビューで、
ComboBox.ListIndexに値を入れたかったのですが、項目になさそうで、
Form_Loadで入れました。
しかも先に.SetFocusが必要で、先に作ったものが動いたのはたまたまでした。
From_Loadだからなのか、先のはDoCmd.OpenForm後だったからなのか、
.RowSource等入れた並びだったからなのか。(後日、自分で実験します。)
確認して置きたいことがどんどん出てきます。

ここで一旦、解決マーク入れます。
本当にありがとうございました。

タイトルRe^7: VBAで作ったフォームのボタンを押した先で、チェックボックスなどの値を取得したい
記事No172209
投稿日: 2018/03/29(Thu) 16:57
投稿者hatena
解決済: ON
> ComboBoxの初期値が空っぽだったので、デザインビューで、
> ComboBox.ListIndexに値を入れたかったのですが、項目になさそうで、
> Form_Loadで入れました。
> しかも先に.SetFocusが必要で、先に作ったものが動いたのはたまたまでした。
> From_Loadだからなのか、先のはDoCmd.OpenForm後だったからなのか、
> .RowSource等入れた並びだったからなのか。(後日、自分で実験します。)
> 確認して置きたいことがどんどん出てきます。

ListIndex をVBAで設定する場合は、アクティブである必用があるという仕様です。
この辺の癖はいろいろ試しつつ習熟していくしかないですね。

デザインビューで既定値プロパティに設定するときは、下記の式で可能です。

リストの先頭データを選択する場合、
=[コンボ1].[ItemData](0)

リストの最後のデータを選択する場合、
=[コンボ1].[ItemData]([コンボ1].[ListCount]-1)


コンボボックスのリストの先頭データ(or最終データ)を既定値とする - hatena chips
https://hatenachips.blog.fc2.com/blog-entry-224.html

タイトルRe^8: VBAで作ったフォームのボタンを押した先で、チェックボックスなどの値を取得したい
記事No172213
投稿日: 2018/03/30(Fri) 09:57
投稿者ハッカ飴
解決済: ON
レス、まとめてしまいますね。
Re:No.172211 & No.172209

> 帳票サブフォームで行番号フィールドの連番を維持する - hatena chips

 こちらは私がイメージしていた方法に近いです。
資材は数が多いので、何番目に移動〜といったインターフェイスもつける予定です。


>ドラッグできるラベルのクラス化 - hatena chips
>https://hatenachips.blog.fc2.com/blog-entry-160.html?cat-16

 拝見しました。
コード自体は難しくは無いんですね。
ボタン開放時に、Y値を仲間と比べてスナップすれば…
と、思いましたが、仲間の指定や判断がまだ私にはできそうにないですorz
もうちょっと理解深めてから挑戦します。

> デザインビューで既定値プロパティに設定するときは、下記の式で可能です。

 なるほど既定値…ListIndex的な日本語探していて思いっきり見落としてました。
まさしく視野が狭い。ありがとうございます。2行減りました(笑)
そしてたった今、VBEに英語のプロパティ名が出ている事に気づきました。
ほんとに視野が狭い(笑)

- 以下のフォームから自分の投稿記事を修正・削除することができます -
処理 記事No パスワード

ページの先頭へ 前ページへ戻る