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

     

リストへもどる

投稿記事の一括表示

タイトルフォームの動的作成時のVB編集窓表示
記事No42838
投稿日: 2017/11/10(Fri) 14:54
投稿者みつめ
解決済: ON
OS:Wincows10Pro 64bit
Access Version:2010(14.0.7188.5002 32ビット)

ネット検索で色々調べてみたのですが、使い方を説明している
ページは沢山ありますが、実行した時の挙動について書いて
あるところがないので、ご存知の方がいないかと思い質問
させていただきます。

VBAからフォームを作成してコマンドボタンを配置し、
そのボタンにイベントを登録する時、VBのエディタ画面が
開いてしまいますが、それを見せなくする方法はあるでしょうか。

サンプルのソースコードは、InsertLinesのヘルプに有る
例文でも確認できます。

> lngReturn = mdl.CreateEventProc("Click", ctl.Name)
の次に

> Application.VBE.MainWindow.Visible = False

を挿入して見えなくすることはできますが、一瞬窓が開いたのが
見えてしまうため、できることならば開いたのが見えない方法が
無いものかと考えています。

タイトルRe: フォームの動的作成時のVB編集窓表示
記事No42839
投稿日: 2017/11/10(Fri) 16:07
投稿者ナバ
解決済: ON
こんにちは。

> VBAからフォームを作成してコマンドボタンを配置し、
以前から、フォーム(やその他のオブジェクト)の動的作成は
Accessファイルの破損につながるといわれています。

別の手法を検討されることをお勧めします。

タイトルRe^2: フォームの動的作成時のVB編集窓表示
記事No42840
投稿日: 2017/11/10(Fri) 17:23
投稿者みつめ
解決済: ON
> こんにちは。
>
> > VBAからフォームを作成してコマンドボタンを配置し、
> 以前から、フォーム(やその他のオブジェクト)の動的作成は
> Accessファイルの破損につながるといわれています。
>
> 別の手法を検討されることをお勧めします。

お返事及び、情報ありがとうございます。
オブジェクトの動的作成には、そんな話もあるのですね。
ご指摘のファイルの破損が起きる可能性があることは念頭に置いて
最悪の事態にはならないように、気をつけます。

コマンドボタンを使わない、メッセージを表示するだけの
独自ルーチン(自動的に閉じるメッセージボックスのような
ものが欲しかった。)で動的なフォーム作成を使用していますが、
幸い今のところ実害がないのと、データ本体を別において操作部の
DBが破損しても本体への影響が少ないような構造にしているので、
もう少しこの方法とお付き合いしていこうと思います。

タイトルRe^3: フォームの動的作成時のVB編集窓表示
記事No42841
投稿日: 2017/11/11(Sat) 01:33
投稿者mayu
解決済: ON
> VBAからフォームを作成してコマンドボタンを配置し、
> そのボタンにイベントを登録する時、VBのエディタ画面が
> 開いてしまいますが、それを見せなくする方法

SaveAsText, LoadFromText コマンドの使用も検討した上で
> 操作部のDBが破損しても本体への影響が少ないような構造にしている
ということでしたら、自己責任でどうぞ。


Option Compare Database
Option Explicit

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
  (ByVal lpClassName As String _
  , ByVal lpWindowName As String) As Long

Private Declare Function LockWindowUpdate Lib "user32" _
  (ByVal hwndLock As Long) As Long

Sub sample()
  Dim frm        As Access.Form
  Dim btn        As Access.CommandButton
  Dim lngRet     As Long
  Dim lngVBEHwnd As Long
  
  On Error GoTo Error_Handling
  
  Set frm = Application.CreateForm
  Set btn = Application.CreateControl(frm.Name, acCommandButton, , , , 1000, 1000)
  btn.Caption = "Click Me"
  
  Application.VBE.MainWindow.Visible = False
  lngVBEHwnd = FindWindow("wndclass_desked_gsk", Application.VBE.MainWindow.Caption)
  
  If (lngVBEHwnd) Then
    lngRet = LockWindowUpdate(lngVBEHwnd)
  End If
  
  lngRet = frm.Module.CreateEventProc("Click", btn.Name)
  Application.VBE.MainWindow.Visible = False
  frm.Module.InsertLines lngRet + 1, vbTab & "MsgBox ""hogehoge"""
  
Exit_Sample:
  Set btn = Nothing
  Exit Sub

Error_Handling:
  MsgBox Err.Number & " :" & Err.Description
  Resume Exit_Sample
End Sub

タイトルRe^4: フォームの動的作成時のVB編集窓表示
記事No42842
投稿日: 2017/11/13(Mon) 09:53
投稿者みつめ
解決済: ON
mayuさん

お返事ありがとうございます。
土日でお休みだったので、返信が遅くなってすみません。

提示頂いたコード試してみましたが、やはり下記のコードを実行した直後に
VBE窓が開いてしまいました。
>   lngRet = frm.Module.CreateEventProc("Click", btn.Name)

(ブレークポイント入れると、そのためにVBE窓が開いてしまうため、
Exit Subを順番に挿入して確かめました。)

LockWindowUpdateにて描画が止められているので、文字等が表示されない
窓でした。

直後の窓を見えなくする行で消してはいますが、一瞬画面がフラッシュ
するように見えてしまうので、それが気になっています。

とは言え、私自身もネットで調べて有効な方法が見つからず、
こちらで知恵をお借りしても、すぐに回答が得られないと言うことは、
諦めざるを得ない思いが大きくなってきました。

> btn.OnClick = "=hoge"

として、外部コマンドを呼び出す時はVBE窓が開かないので、
この方法で考えてみることにします。

お返事いただい皆さん、ありがとうございました。

タイトルRe^3: フォームの動的作成時のVB編集窓表示
記事No42843
投稿日: 2017/11/13(Mon) 10:26
投稿者hatena
解決済: ON
> > > VBAからフォームを作成してコマンドボタンを配置し、
> > 以前から、フォーム(やその他のオブジェクト)の動的作成は
> > Accessファイルの破損につながるといわれています。
> > 
> > 別の手法を検討されることをお勧めします。

私も同意見です。
別の方法を調査、検討されたうえでの結論でしょうか。


ナバさんの回答の補足になりますが、
動的にフォームを作成するということは、
ユーザーが下記の操作をすることと同等です。
1.フォームの新規作成
2.デザインビューで編集(ラベルを配置する等)
4.VBAエディターでコードを記述
3.保存
4.フォームを開いて実行する
5.フォームを閉じる
6.フォームを削除する

重い処理になります。
ファイル内にゴミがたまりファイルサイズの肥大化も招きます。
当然、破損の危険性も高いです。
 
> コマンドボタンを使わない、メッセージを表示するだけの
> 独自ルーチン(自動的に閉じるメッセージボックスのような
> ものが欲しかった。)で動的なフォーム作成を使用していますが、

そのような要件なら、動的にフォームを生成する必要性はないと思います。

提示の要件なら、一例をあげると、下記の方法で可能です。

事前にフォームを作成して、ラベルを配置します。
フォーム名 frmMsg
ラベル名 lblMag

「ポップアップ」「作業ウィンドウ固定」は「はい」に設定。


標準モジュール

Public Sub ShowMsg(Msg As String, Optional Interval As Long)
    Const fn = "frmMsg"
    DoCmd.OpenForm fn
    With Forms(fn)
        !lblMsg.Caption = Msg
        .OnTimer = "=CloseMsg()"
        .TimerInterval = Interval
    End With
End Sub

Public Function CloseMsg()
    DoCmd.Close acForm, "frmMsg"
End Function


メッセージ表示して10秒後に閉じる

ShowMsg "メッセージ", 10000

第2引数を省略すると5秒後に閉じる

ShowMsg "メッセージ"

第2引数を0にすると自動で閉じない

ShowMsg "メッセージ", 0

タイトルRe^4: フォームの動的作成時のVB編集窓表示
記事No42844
投稿日: 2017/11/13(Mon) 14:03
投稿者みつめ
解決済: ON
hatenaさん

お返事ありがとうございます。

このスレッドを立てた元々の疑問は、VBAからフォームを構築
してコマンドボタンにイベントを登録した時に、VBE画面が
表示されない方法が無いかと言うものでした。

予め専用のフォームを用意すると上記の問題も発生することは
ないので、しばらくその方法を使っていたのですが、何度も使い
まわすうちに、いちいちフォームとそれを処理するVBAコードを
コピーしてくるのが手間に感じて、VBAコードをコピーするだけで
実現できないかと考えたのが始まりでした。

もちろん、リスク等を勘案して実用的でないと判断したら別の方法を
採用するつもりですので、頂いたご意見は参考にさせていただきます。

タイトルRe^5: フォームの動的作成時のVB編集窓表示
記事No42845
投稿日: 2017/11/13(Mon) 14:53
投稿者hatena
解決済: ON
> 予め専用のフォームを用意すると上記の問題も発生することは
> ないので、しばらくその方法を使っていたのですが、何度も使い
> まわすうちに、いちいちフォームとそれを処理するVBAコードを
> コピーしてくるのが手間に感じて、VBAコードをコピーするだけで
> 実現できないかと考えたのが始まりでした。

フォームはコピーする必要はないと思いますが。

コード部分は、標準モジュールにFunctionとして定義して、
それとイベントを関連付ければいいだけですよね。
そのへんはみつめさんも理解されていると思いますが、
下記のように関連付けできます。

btn.OnClick = "=hoge()"

ただ、プロパティに関数を関連付ける方法だと、イベントの引数が利用できないですが、
それをしたい場合は、クラスモジュールにすれば可能です。


CreateForm や CreateEventProc 等は開発時用のツールやメンテナンス用に使うことはあっても、
運用時に常時使うべきものではないと考えます。

実際、これらを使うことで使いまわしが楽になるというようなメリットはないと思います。

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

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