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

     

リストへもどる

投稿記事の一括表示

タイトルひらいているフォーム毎に行動を変えるVBA
記事No83158
投稿日: 2017/10/31(Tue) 15:47
投稿者いとう
解決済: ON
OS: Windows 8
Access Version: 2013

おしえていただけると助かります。


ダイアログで開いてるフォーム上のボタンにVBAを書いているところで悩んでいます。

あるフォームのコントロールに、ダイアログ上のフォームにあるコントロールの値を代入するだけの

シンプルなものですが。

ボタンを押したときに、ペースト先のフォームによって行動を変えたいのですが、

フォームを区別するために、書き方が分かりません。

一応、フォーム上には区別をするために番号をつけてみましたが・・・


なにかアドバイスを頂けると助かります。
よろしくお願いいたします。

タイトルRe: ひらいているフォーム毎に行動を変えるVBA
記事No83159
投稿日: 2017/10/31(Tue) 21:53
投稿者mayu
解決済: ON
> フォームを区別するために、書き方が分かりません。

汎用の関数やプロシージャの中で
コードを実行しているオブジェクトを判別したいのでしたら
Application.CodeContextObject

フォーカスを持っているフォームの名前を取得したいのでしたら
Application.Screen.ActiveForm

の Name プロパティを参照すればよろしいでしょう。


Sub sample()
  If (TypeOf Application.CodeContextObject Is Access.Form) Then
    MsgBox Prompt:="フォーカスを持つオブジェクト名は " & Screen.ActiveForm.Name _
       , Buttons:=vbInformation _
       , Title:="テスト"
    
    Select Case Screen.ActiveForm.Name
      Case "foo"
        Rem 処理A
      Case "bar"
        Rem 処理B
      Case Else
        Rem 処理C
    End Select
  End If
End Sub

タイトルRe^2: ひらいているフォーム毎に行動を変えるVBA
記事No83160
投稿日: 2017/11/01(Wed) 12:10
投稿者いとう
解決済: ON
> > フォームを区別するために、書き方が分かりません。

ありがとうございます!

教えていただいた、VBAを使ってみました。


フォーカスしているダイアログのフォームを参照するようになっているみたいですが、

希望としては、ダイアログの裏? で展開しているフォームを参照したいのです。


可能でしょうか?

タイトルRe^3: ひらいているフォーム毎に行動を変えるVBA
記事No83161
投稿日: 2017/11/01(Wed) 14:18
投稿者tkwan
解決済: ON
> ダイアログの裏? で展開しているフォームを参照したいのです。

 Dim frm As Form

 For Each frm In Application.Forms

   If frm.Name <> Screen.ActiveForm.Name Then
      MsgBox frm.Name
    End If

 Next

タイトル転記先フォームを特定する条件は?
記事No83162
投稿日: 2017/11/01(Wed) 14:29
投稿者mayu
解決済: ON
> 希望としては、ダイアログの裏? で展開しているフォームを参照したいのです。
> 可能でしょうか?

ダイアログで開いているフォームのコントロールから
モーダルになっていない 他フォームのコントロールに対しては
フォームが開かれている限り、値の参照・代入ともに可能です。

> ボタンを押したときに、ペースト先のフォームによって行動を変えたいのですが、
> フォームを区別するために、書き方が分かりません。

そのペースト先のフォームを特定する条件は何でしょうか。
一定の条件で決まるものなのか、不特定多数から絞り込むのか。

想像ですが、以下のどちらかのようなことがやりたいのでしょうか。

【 1 】
----------------------------------------------------------------------
ポップアップフォームは
他のフォームから Docmd.OpenForm メソッドで開かれるようになっているが
呼び出し元フォームの名前を知りたい。

【 2 】
----------------------------------------------------------------------
ポップアップフォーム以外に
どのようなフォームが開かれているかが知りたい。
( 特定の名前のフォームが開かれていた場合に何らかの処理を実施する )

タイトルRe: 転記先フォームを特定する条件は?
記事No83164
投稿日: 2017/11/02(Thu) 17:52
投稿者いとう
解決済: ON
大変ありがとうございます!


> 想像ですが、以下のどちらかのようなことがやりたいのでしょうか。
>
> 【 1 】
> ----------------------------------------------------------------------
> ポップアップフォームは
> 他のフォームから Docmd.OpenForm メソッドで開かれるようになっているが
> 呼び出し元フォームの名前を知りたい。
>
> 【 2 】
> ----------------------------------------------------------------------
> ポップアップフォーム以外に
> どのようなフォームが開かれているかが知りたい。
> ( 特定の名前のフォームが開かれていた場合に何らかの処理を実施する )


どちらかと言いますと、「2」の方が近いです。

フォームを A B C D E とした場合。

フォームA に情報を入力し、フォームA上のボタンをクリックした場合に、

入力した値に応じて、 B または C または D のフォームが展開され、ダイアログで E が

開かれるようになっています。

その後、E 上に表示された情報をボタンを押すことで、 B などのフォームにペーストするという

形で作成しています。

 

タイトルRe^2: 転記先フォームを特定する条件は?
記事No83167
投稿日: 2017/11/02(Thu) 18:02
投稿者hatena
解決済: ON
> フォームA に情報を入力し、フォームA上のボタンをクリックした場合に、
>
> 入力した値に応じて、 B または C または D のフォームが展開され、ダイアログで E が
>
> 開かれるようになっています。

この部分の実際のコードを提示してもらえますか。

各フォームがダイアログモードなのかどうなのか、
どのようなタイミングで開かれるかによって、
対処法が異なってきますので。

また、各フォームの「ポップアップ」「作業ウィンドウ固定」の設定がどうなっているかも提示してください。

タイトルRe: ひらいているフォーム毎に行動を変えるVBA
記事No83163
投稿日: 2017/11/02(Thu) 13:33
投稿者hatena
解決済: ON
> ダイアログで開いてるフォーム上のボタンにVBAを書いているところで悩んでいます。
> 
> あるフォームのコントロールに、ダイアログ上のフォームにあるコントロールの値を代入するだけの
> 
> シンプルなものですが。
> 
> ボタンを押したときに、ペースト先のフォームによって行動を変えたいのですが、
> 
> フォームを区別するために、書き方が分かりません。

下記のような要件だと解釈しました。

任意のフォームから、ダイアログモードで特定のフォーム(F_ダイアログ とする)を開く。

DoCmd.OpenForm "F_ダイアログ", , , , , , , , , acDialog

「F_ダイアログ」のコマンドボタンをクリックしたときに、呼び出したフォームのコントロールに値
を代入する。

呼び出すフォームは複数ある。

私の場合は下記のようにしています。

「F_ダイアログ」のフォームの開くときに、ActiveForm を取得する。
このフォームが呼び出したフォームになります。

コマンドボタンのクリック時に、上記で取得したフォーム上のコントロールを参照して代入する。

Dim CallForm As Form

Private Sub Form_Open(Cancel As Integer)
    Set CallForm = Screen.ActiveForm
End Sub

Private Sub コマンド1_Click()
    CallForm!コントロール名 = Me.テキスト1
End Sub

もし、呼び出すフォームがサブフォームの場合があるなら、ActiveControl.Parent で
呼び出しフォームを取得すると、 メインでもサブでも対応できます。

Private Sub Form_Open(Cancel As Integer)
    Set CallForm = Screen.ActiveControl.Parent 
End Sub

下記も参考にされるといいでしょう。

入力ダイアログフォームの設計 - hatena chips
http://hatenachips.blog34.fc2.com/blog-entry-39.html

タイトルRe^2: ひらいているフォーム毎に行動を変えるVBA
記事No83166
投稿日: 2017/11/02(Thu) 17:59
投稿者いとう
解決済: ON
たいへん丁寧に教えていただき、ありがとうございます!

開くときに、フォームを変数にいれ、

そのコントロール名を参照する形なら、考えている形になると思われます!

一度、やってみます!

成功しましたら、こちらで報告します。

タイトルRe^2: ひらいているフォーム毎に行動を変えるVBA
記事No83168
投稿日: 2017/11/06(Mon) 16:10
投稿者いとう
解決済: ON
教えていただいたものとはちょっと違う形になりましたが、解決しました!


一つのモジュールの中に

各ボタンの動きを Pblic Function で作り、ボタンはクリック時にマクロのプロシージャの実行で動かす

ことにしました。


Dim A as String

OpenForm [フォーム名]

A = Screen.ActiveForm.name


として、

各ボタンのプロシージャでは、

Public Function ボタン1()

Dim Fn as string

Fn = A

Forms(Fn)![コントロール名] = (代入先)


として使うことで。考えていた通りの形を作ることができました。

mayuさんとhatenaさん、ありがとうございました!

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

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