質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

Q&A

解決済

1回答

5728閲覧

Accessマクロで実行モードのフォームのイベントで、そのフォームの他コントロールを操作

JanTh1989

総合スコア87

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

0グッド

0クリップ

投稿2019/06/26 04:36

Accessマクロにて、複数テーブルで共通のレコード追加フォームの作成を試みています。
その動作の一環として、テーブル名を持つコンボボックスを用意し、選択テーブルの列情報に準拠して、入力欄(ラベル:テキストボックスの組合せ)をフォーム内に設けるようにしようと考えています。
※コンボボックスが空文字の場合は入力欄全削除。

例)
コンボボックス:"テーブルA"選択
テーブルAフィールド:ID、名前、性別、学校名
フォーム配置コントロール:
(Label)ID: textbox
(Label)名前: textbox
(Label)性別: textbox
(Label)学校名: textbox

コントロール配置に向けたコード

VBA

1Private Sub AddTableNameChange_Change() 2 Me.AddTableNameChange.SetFocus 3 4 Dim control As control 5 6 If "" = Me.AddTableNameChange.Text Then 7 For Each control In Me.Controls 8 If コンボボックス名 <> control.Name Then 9 DeleteControl Me.Name, control.Name 10 End If 11 Next 12 Exit Sub 13 End If 14 15 Dim dbs As Database 16 Dim td As TableDef 17 Dim myField As field 18 Dim AddLBControl, AddTBControl As control 19 Dim AddPosY As Integer 20 21 Set dbs = CurrentDb 22 Set td = dbs.TableDefs(Me.AddTableNameChange.Text) 23 24 AddPosY = 100 25 For Each myField In td.Fields 26 'コントロール名、ラベル値、各サイズ、位置については、配置できるようになってから調整予定。 27 Set AddLBControl = CreateControl(Me.Name, acLabel, , , "", 30, AddPosY, 50, 50) 28 Set addtbconstrol = CreateControl(Me.Name, acCommandButton, , , "", 30, AddPosY, 50, 50) 29 AddPosY = AddPosY + 30 30 Next 31 32End Sub

上記のコードを実行すると、
Set AddLBControl = CreateControl(Me.Name, acLabel, , , "", 30, AddPosY, 50, 50)
で「コントロールの作成と削除は、デザインビューまたはレイアウトビューで行います。」のエラーになります。

別のビューに開きなおせばいい、と考え、
DoCmd.OpenForm Me.Name, acDesign
を足してみたところ、「別のビューに切り替えることはできません。」のエラーになります。

質問

やりたいこととしては、フォーム内のコントロールイベント内で、そのフォーム内のコントロール操作になりますが、これは可能なのでしょうか。
可能でしたら、方法をご教授頂ければと思います。

開発環境

Microsoft Access 2010

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

アクティブなフォームのデザインビューへの変更は、
DoCmd.RunCommand acCmdDesignView
デザインビューからフォームビューへの変更は、
DoCmd.RunCommand acCmdFormView
で可能です。

しかし、サンプルを作成して実験してみましたか、自身のフォーム上のコントロールのイベントからでは、実行時エラーになりました。
そもそも、ユーザーが使用中にデザインビューにするのは危険だと思います。

事前にデザインビューに予想される最大数のラベルとテキストボックスを配置しておいて、
「可視」を「いいえ」にして保存します。
必用に応じて、Visible = True で表示させるようにするのが、安全だし高速です。

ラベルとテキストボックスの名前を
Lbl1, Lbl2, ・・・・・・
Txt1, Txt2, ・・・・・・
というようにつけておけば、下記のようにループでまわせます。

vba

1Dim i As Long 2For i = 1 to td.Fields.Count 3 With Me("lbl" & i) 4 .Visible = True 5 .Caption = td.Fields(i).Name 6 .Top = 30 * i + 70 7 End With 8 With Me("Txt" & i) 9 .Visible = True 10 .Top = 30 * i + 70 11 End With 12Next

Accessのフォームではこの方法が一般的です。Excelのユーザーフォームだと使用中にコントロールを追加するというのはよくあるようですが。

質問とは関係ないですか間違いの指摘

vba

1 Dim AddLBControl, AddTBControl As control 2 '上記の AddLBControl は型指定してないことになり、Variant型になります。 3 '面倒でも下記のように変数一つずつ型指定してください。 4 Dim AddLBControl As control, AddTBControl As control 5

投稿2019/06/26 08:01

編集2019/06/26 08:12
hatena19

総合スコア33715

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

JanTh1989

2019/06/26 10:28

ご回答ありがとうございます。 アクティブフォームのビュー切り替え可はできるがお勧めせず(危険)、承知しました。 MAXで作っておいて、あとは調整がVBAで一般的なんですね。 ご指摘についても承知しました。
JanTh1989

2019/06/26 10:29

ちなみに、VB的観点から各テーブル向けオブジェクト配置のPanelを作って、PanelのVisibleで、とかも考えていたんですが、Accessフォームで見てみると四角形というものしか見つかりませんでした。 VBAだとあくまで入力欄別で表示切り替えが一般的になりますか? (質問内容と違う、とかありましたらすみません。)
hatena19

2019/06/26 12:02

Accessの場合は、連結フォームでの設計が一般的ですので、VBAでコントロールを操作することはほとんどないです。 また、テーブルの正規化が出来ていれば、テーブルからウィザードでフォーム、レポートを作成して、それをもとに入出力をします。 「各テーブル向けオブジェクト配置のPanel」→サブフォームはご存知でしょうか。それが目的に合致しませんか。 「複数テーブルで共通のレコード追加フォームの作成」というのが具体的にどのようなものか想像かつきませんが、テーブルの設計が間違っているような気がします。具体的にはどのようなテーブルがあるのでしょうか。
JanTh1989

2019/06/27 02:10

サブフォームは存じあげませんでした。 「Access サブフォーム 切り替え」などで検索をかけてみると、思ってたような動きができそうでした。 レコード追加でSQL文を作ったりすることも考慮に入れつつ、オブジェクトの管理方法については検討してみます。 <「複数テーブルで共通のレコード追加フォームの作成」の具体的な内容> テーブル(仮) ・メインテーブル  列:ID(数値)(主キー),Name(テキスト),Man(テキスト),Age(数値) ・サブテーブル  列:ID(数値)(主キー),FinalEducation(テキスト),SchoolName(テキスト) ・状態テーブル  列:ID(数値)(主キー),StatusNo(数値) ・状態マスタ  列:StatusNo(数値)(主キー),Status(テキスト) みたいな感じです。 上3つのテーブルについては、主キーを軸にした3つ一括追加と、個々のテーブルに追加も可。 最後のテーブルは個々の追加オンリーです。
hatena19

2019/06/27 07:47

上の3つのテーブルは、すべて ID フィールドでリンクしているということでしょうか。 だとしたら、すべて一対一の関係のテーブルということになりますが、データベースでは一対一の関係のデータを一つのテーブルにまとめるというのが原則です。そうすれば、「複数テーブルで共通のレコード追加」という処理は不要になります。 クエリまたはフォームで必要なフィールドのみ表示させる設計にすればいいでしょう。 参考リンク 一対一関係のテーブル設計 - hatena chips https://hatenachips.blog.fc2.com/blog-entry-29.html VBでの開発経験がありその経験からの発想のように思いますが、まずは、Accessの基本の機能を理解されてから設計に取り組んだ方が結局近道になると思います。 それとテーブル設計の基本「正規化」についての理解も必須です。 連結フォームで作成していけば、VBAなしで大抵のことはできます。それでは不足する部分をVBAで補完するという設計が一般的です。 Accessの非連結フォームでVBAでゴリゴリ書いていくぐらいなら、VBでAccessテーブルにリンクする設計にした方が融通がきくと思います。
JanTh1989

2019/06/28 01:40

仰る通り、VB思考が強く、Accessの知識が乏しいため、考えがAccess向け、DB管理向けではないと思います。 クエリやフォームの扱いもよく分かっていないところがあります。 回答内容や参考リンクなどの情報を基に、進め方について再検討してみます。 ありがとうございました。
hatena19

2019/06/28 02:25

Accessおよびデータベースについて基本から学習する場合のおすすめのリンクは下記です。 もう一度学ぶMS-Access https://www.accessdbstudy.net/ 特に「正規化」「リレーションシップ」の項目の解説は秀逸です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問