Microsoft Access 掲示板

メインフォームのチェックボックスの値をサブフォームに代入するソースコード

7 コメント
views
4 フォロー

マイクロソフト アクセス365でメインフォームに都道府県をチェックぼっくで並べ、サブフォームにも都道府県チェックボックスを47都道府県ごとに一覧表を並べ、メインフォームから入力できるフォームを作りたいと思っています。未熟者で思うようにいかず苦しんでおります。ステップ実行で流れを確認しているのですが、MyVariable1に進めないです。変数に値が入らないです。新規登録に進めません。ご指導いただければ幸いです。

モジュール

Option Compare Database
Option Explicit

'共通変数	標準モジュール	
Public MyVariable1 As Variant	
Public MyVariable2 As Variant
Public MyVariable3 As Variant
Public MyVariable4 As Variant
Public MyForms As Variant
Public MyFlag As Variant

Pulic Sub MyFunction()
'MyVariable=0		初期化
'MyVariable=1		新規登録の時の識別番号
'MyVariable=2		修正するときの識別番号
'MyVariable=3		削除するときの識別番号
'MyVariable=4		復元するときの識別番号


Dim a(3) As Variant
Select Case MyVariable1
	Case1
		a(1)="新規登録しますか?"
	Case2
		a(1)="修正しますか?"
	Case3
		a(1)="削除しますか?"
	Case4
		a(1)="復元しますか?"
End Select

'オペレータに処理内容をするかを問いかける
	a(2)=Msgbox("" & a(1) & "", vbYesNo)

'”いいえ”を押したら処理を抜ける
	if a(2)=vbNo Then

'パブリック半数に1を代入する
'Callプロシージャを抜けて元のプロシージャでキャンセルさせるため
	MyVariable2 = 0
	MyFlag = 0
	MsgBox ("処理を中断しました。")
	Exit Sub
	End If

'インプット
	a(2) = InputBox("パスワードを入力してください。パスワードは1234です。")

'キャンセルを押したら処理を抜ける
	if a(2) ="" Then
		MyVariable2 = 0
		MyFlag = 1
		Exit Sub
	Else
		MyVariable2 = "YES"
	End If
	End Sub



'メインフォーム
Option Compare Database
Option Base 1


'共通変数
	Dim MyVriable1 As Variant
	Dim MyVriable2 As Variant
	Dim MyVriable3 As Variant

Private Sub ComboBoxInIT()
On Error Resume Next
	Dim Ctlas As Control
	Dim strSQL As Control

	For Each strSQL In Me.Controls
	With strSQL
		If (.ControlType = acComboBox Or .ContorolType = acTextBox) And _
			.Name <> Me.ActiveControl.Name Then
			.Value = Null
		End If
	End With
	Next strSQL
End  Sub

Private Sub Call2()
	Select Case MyVariable1
	case1
'新規登録
	MsgBox("新規入力を許可します。")
	Me.Chk許可flg.Enabled = True
	Me.Cmb担当者.Enabled = True
	Me.Chk北海道.Enabled = True
	Me.Chk秋田.Enabled = True
'		↓
	Me.Chk鹿児島.Enabled = True
	Me.Chk沖縄.Enabled = True
	Me.Txt曜日.SetFocus
	Exit Sub
	
'編集
	Case2
	End Select
End Select
End Sub


Private Sub Cmd新規登録_Click()
On Error GoTo Skip新規登録
	MyForms = Forms!メインフォーム!サブフォーム!Chk許可flg

If Me.Chk許可flg = True Then
GoTo LstLine
End If

MyVariable1 = 1
Call MyFunction

If MyVariable2 = "YES" Then
Call Call2
Exit Sub
Else
Exit Sub
End If

'___________________________________________________________________

LastLine:
	Dim aa As Variant
	If Me.Cmb担当者.Value ="" Or IsNull(Me.Cmb担当者)
Then
	MsgBox("担当者名が空白です。")
	Me.Cmb担当者.SetFocus
	Exit Sub
	End If

'ADO接続開始
	Dim Cn As ADODB.Connection
	Dim Rs As ADODB.Recordset
	Dim strSQL As String
	Dim a As Variant

	Set Cn = CurrentProject.Connection
	Set Rs = New ADODB.Recordset
	Rs.Open "MST都道府県",Cn, adOpenKeyset, adLockOptimistic
	
	Dim b,c,d As Variant
	if me.txt曜日.value = "" Or IsNull(Me.Cmb担当者)
	Then
	a = MsgBox("曜日か担当者の項目が未入力です。", vbYesNo)
	If a = vbNo Then
	Me.Txt曜日.SetFocus
	Exit Sub
	End If
	End If

'登録
	Rs.AddNew
	Rs.Update
'ADO接続を切断
	Cn.Close
	Set Cn = Nothing

	Rs.Open strSQL,Cn, adOpenKeyset, adLockOptimistic
	FormsS("メインフォーム").Form("Subフォーム").Form.Requery

	Me.サブフォーム.Form.Filter = strSQL
	ME.サブフォーム.Form.fIlterOn = True
SKIP新規登録:
End Sub

職場で作っているソースコードを問題ない範囲でプリントアウトし、手作業で移しました。若干の不備等あるかもしれません。ご了承ください。
私がわからないことは なぜステップ実行で”新規実行”(変数に値 1 がはいらないのか?)ご指導ください。

rinrin
作成: 2024/02/10 (土) 09:47:06
最終更新: 2024/02/10 (土) 10:04:33
通報 ...
1

提示のコードは実際のコードをコピーして貼り付けたものですか。
そのコードではステップ実行以前に、構文エラーで実行すらできないですが。
実際のコードを貼り付けてもらわないと回答のしようがありません。


なお、コードはMarkDown記法のコードブロック内にいれてください。
質問は、管理者権限で修正しておきました。

この掲示板の使い方の詳細は下記を参照してください。

Microsoft Access 掲示板 の使い方 Microsoft Access 掲示板 - zawazawa

2
rinrin 2024/02/10 (土) 12:10:55 b4dc9@c7f00

会社の決まりでUSBでソースコードの持ち出しは禁止です。会社ではステップ実行まで他とりつき、コンパイルエラー 実行時エラーの類は出ませんが、変数に値が入りません。

私としてもソースコードを外部に持ち出したいのですが、厳禁なもので。。。;;

なにはともあれ早急なご対応ありがとうございます
お礼もせずに失礼な子だとは思われたくないので 一言感謝言葉を伝えたくメール書かせていただきました
ありがとうございました

3
hatena 2024/02/10 (土) 14:50:37 修正

コンパイルエラーの部分は無視して、

ステップ実行で流れを確認しているのですが、MyVariable1に進めないです。変数に値が入らないです。

これについて共通変数についての理解をもう一度確認してください。

'共通変数   標準モジュール
Public MyVariable1 As Variant
Public MyVariable2 As Variant
Public MyVariable3 As Variant

メインフォーム

'共通変数
    Dim MyVriable1 As Variant
    Dim MyVriable2 As Variant
    Dim MyVriable3 As Variant

標準モジュールとメインフォームで同じ名前の変数を宣言していますが、
これによって格納されている値を共有できると勘違いしてませんか。
名前が同じでもこの変数は全く別物ですので値を共有しているわけではありません。

メインフォームで MyVriable1 に1を代入しても、メインフォーム内の変数 MyVriable1 に代入されるだけで、標準モジュールの MyVariable1 には何の変化もありません。

メインフォームの方の変数を削除してください。
そうすれば、標準モジュールの変数は Public で宣言しているので、メインフォームの方から参照可能になり、MyVariable1 に代入できるようになります。

Public宣言してない変数は、そのモジュール内でしか参照できません。

「VBA 変数 スコープ」をキーワードにWEB検索して解説ページで学習してください。


共通変数はいつでも、どこでも、だれでも使用できるので便利ではありますが、その分、コードが読みづらくなりますし、バグの原因になりやすいので、できれば避けたいです。

共通変数以外で、別モジュール間でデータをやりとりする方法は、
引数でデータを渡す、戻り値で結果を受け取る、という方法があります。
こちらの方法も学習して理解されることをお勧めします。

この方法の簡単なサンプルを提示しておきます。

'標準モジュール
Option Compare Database
Option Explicit

Public Function MyFunction(MyVariable1 As Variant) As Variant

    MsgBox MyVariable1 & "を受け取りました。"
    MyFunction = 2

End Function 

'フォームモジュール
Private Sub Cmd新規登録_Click()
   Dim 結果 As Variant

   結果 = MyFunction(1)

   MsgBox "結果は" & 結果 & "です"

End Sub

これで共通変数なしでデータのやり取りができます。
データがどのように移動しているか読みやすいし、知らない間に変数の中身が変更されというような不安もなくなります。

「VBA 引数 戻り値」などをキーワードにWEB検索して学習されることをお勧めします。

4
rinrin 2024/02/10 (土) 16:29:03 b4dc9@c7f00

行き違いになり申し訳ございません。未熟な私が端折ったソースコードを提示し、ご指導を受けることは 先生方に失礼に当たると思い、きちんと現状でのすべてのソースコードを書いたうえで、ご指導を仰ぐつもりでおりました。
hatenaさんのご指導感謝いたします。勉強に励みます。
改めて ソースコードを掲載させていただきます。

あらためてきちんと全てのソースコードを書き直して再投稿させていただきます。今現在の状況です。ステップ実行で流れを確認しているのですが、MyVariable1に進めないです。変数に値が入らないです。新規登録に進めません。ご指導いただければ幸いです。最終的にはメインフォームに各地域を並べ、サブフォームにも一覧表にチェックボックスを並べ、一覧で閲覧および回数が把握できるようなものを作りたいと思っております。
ご指導 何卒宜しくお願い致します。

マイクロソフト アクセス365でメインフォームに都道府県をチェックぼっくで並べ、サブフォームにも都道府県チェックボックスを47都道府県ごとに一覧表を並べ、メインフォームから入力できるフォームを作りたいと思っています。未熟者で思うようにいかず苦しんでおります。

5
rinrin 2024/02/10 (土) 17:37:14 b4dc9@c7f00

ごめんなさい
ソースコードが長すぎて掲載することができません

Functionコードのご指導ありがとうございます^^

6

変数に値が入らないです。新規登録に進めません。

これについては、前回の投稿でも回答してますが、
標準モジュールの変数と同名のフォームのモジュールの変数を削除すれば変数に値が入るようになります。
それで、ステップ実行で動作を確認するといいでしょう。

それがうまくできたら、Functionでデータを引き渡したり、結果を戻す方法にトライするといいでしょう。

7
rinrin 2024/02/13 (火) 20:19:11 b4dc9@c7f00

できました^^ あっさりできました^^
ほんとうにありがとうございました
これからもご指導何卒宜しくお願いします^^