おしえてくださいm__m

AccessにてWindowを最小化した後に現在開いているフォームを開くVBAを

作成しようとしていますがうまくいきません。

現在はWindowを最小化した後一つのフォームを開くVBAは下記の通り作成しました

DoCmd.RunCommand acCmdAppMinimize

DoCmd.OpenForm "メインフォーム", acNormal

しかしながら現在開いているすべてのフォームをAccess Windowを最小化した後に

開くVBAはどのように記載すればいいでしょうか

皆さまのお知恵をかしてくださいm__m

このQ&Aに関連する最新のQ&A

A 回答 (2件)

<回答>



抜粋>現在開いているフォームをポップアップで開く

フォームを開くではなく、現在開いているフォームに対し再度ポップアップで前面に
出したいということであれば、現在開いているフォームを順番にアクティブウィンド
化をしていき前面表示させます

以下、サンプルコード (スペル間違いがあるかも、その点は注意願います)

Dim intFrm As Integer
Dim strFrm As String

On Error Resume Next '*** エラー無効化
For intFrm = Forms.Count - 1 To 0 Step -1
strFrm = ""
strFrm = Forms(intFrm).Name
'-IF説明- strFrm <> "" : 万が一エラーが起きた場合 strFrm値は空白なので後続処理は動作せず、次のフォームに移るように
'-IF説明- strFrm <> Me.Name : 自分自身のフォームは何もしないようにする場合には必要
If strFrm <> "" And _
strFrm <> Me.Name Then

'--- 対応案1:アクティブ(再ポップアップ)化
DoCmd.SelectObject acForm, strFrm

'--- 対応案2:再表示
'DoCmd.Close acForm, strFrm
'DoCmd.OpenForm strFrm, acNormal, "", "", , acDialog

End If
Next

On Error GoTo 0 '*** エラー有効化


対応案2の再表示に関しては
フォームが開いているもの対し、再度開くというのは出来なかった気がします
そこから一旦クローズしてから開きなおす手法を取りますが、その場合、再表示のため
画面入力値が初期化されてしまう欠点があります
欠点回避には、また別の制御(作りこみ)が必要になってきます

以上でした
    • good
    • 0

<抜粋>


現在開いているすべてのフォームをAccess Windowを最小化した後に開くVBA

<前提>
既に開いているフォームをAccessWindow最小化後に開くという意味(やりたい事)を、以下の様に判断、意味合いが違った場合、回答自体間違いになる点はご理解ください。

<やりたい事>
AccessWindowを最小化しても、すでに開いているフォームはAccessWindowの外でも表示させたい

<回答1>
フォーム自体に持っている、フォームプロパティにある「ポップアップ=はい」にしておく事で、やりたい事の実現が可能です

VBAで行うのではなく、初めからフォーム設定(設定保存)しておくことで
いつでもAccessWindowを最小化されても開いているフォームは前面表示されます

<回答1における注意点>
他のアプリ(エクセルやワード、メモ帳など)が動作している場合、AccessWindowを
最小化した際にフォーカスが他のアプリに行ってしまう事があります。

ここら辺は以下の調整が必要です
きちんとフォームの順番を決めておき、フォームプロパティにある「作業ウィンド
ウ固定をはい」にしておく、または、最小化後にフォーカスをフォームに割り当てる

※フォームプロパティとはフォームオブジェクトプロパティの事ではなく、
フォームデザインで開いた先のフォーム全体のプロパティのことです
以前、初心者QAで説明に苦労した記憶を思い出してしまった。


<回答2>
フォーム自体には記憶させず(ポップアップ=いいえ状態)、VBAで行う方法もありますが、かなりの労力が必要で手間がかかるので概要だけ記載しておきます(回答1が一番ラクです)
VBAサンプルコードを作成するには丸1日かかってしまうので概要だけ記載

(1).AccessWindowを最小化が動作する前に、まず既に開いているフォームが何か解る仕組みを設けなければならない
(1A).各フォームが開く際(オープン時イベントなど)に、テーブル等にフォームオブジェクト名を保存
(1B).各フォームが閉じられた際(クローズ時イベントなど)に、(1A)で作成したレコードを削除
(2).AccessWindowを最小化が動作後、既に開いているフォームを一旦デザインで開きなおす(開きなおす手法は(1A)で作成したテーブルを読込み実施する)
(3).デザインで開きなおしたフォームに対しフォームプロパティにある「ポップアップ」を「はい」にする。
(4).デザインで開きなおしたフォームに対し実行を行う
(5).各フォームが閉じる前に(クローズ時イベントなど)に、(3)の設定を元に戻す
(5A).閉じる前にデザインで開きなおす
(5B).デザインで開きなおしたフォームに対しフォームプロパティにある「ポップアップ」を「いいえ」にする。
(5C).デザインで開きなおしたフォームを閉じる

結局、上記方法もポップアップをはいに設定し保存しなおしてから実行する手法です
閉じられたときに、元に戻して保存という意味合いになります

この場合、既に開いているフォームが再度開きなおすという事で、引数は初期化される形になる問題点もあります
引数も引き継ぐ場合、またさらにどこかに記憶させておく必要がでてしまいます(テーブルなど)


以上でした。

この回答への補足

どうもご丁寧に回答をありがとうございます

このような質問をしたのはフォームだけを表示して利用しているAccessが

タスクバーのAccessのアイコンを押すとAccessのWindowが開いてしまいAccessの見栄えが悪くなってしまうため

どうにかならないかということで質問させていただきました。

そこで考えたのがタスクバーを押しAccessのWindowが開かれた後

フォームの中のボタンクリック時にAccess Windowの最小化 → 現在開いているフォームをポップアップ

で開くVBAがないか模索中です (フォームはポップアップ「はい」にしております)

現在開いているフォームをすべて「閉じる」VBAが

Dim intFrm As Integer

For intFrm = Forms.Count - 1 To 0 Step -1
DoCmd.Close acForm, Forms(intFrm).Name
Next

という形であるため 逆に現在開いているフォームを「開く」VBA

がないか模索中です どうか、お知恵をかして下さいm__m

補足日時:2015/01/05 18:13
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

QACCESS VBAのOpenForm書き方

ACCESS VBAについて教えてください。

DoCmd.OpenFormのWhereConditionの部分の記述がわからないのです。
1つの条件の場合は問題なく表示できたのですが、複数条件にすると「抽出条件でデータ型が一致しません。」とエラーになってしまいます。
なぜでしょうか?

このように記述しています。
DoCmd.OpenForm "会員データ", , , "種別 = '" & Me![種別] & "' AND 会員番号 = '" & Me![会員番号] & "'"

種別、会員番号ともに数値データです。

Aベストアンサー

こちら(Access2010)では、抽出条件・・・のエラーになりました。
先の回答者さんも指摘されていますが
DoCmd.OpenForm "会員データ", , , "種別 = '" & Me![種別] & "' AND 会員番号 = '" & Me![会員番号] & "'"

種別、会員番号ともに『数値データ』です。
なので、シングルクォーテーションで括る必要は有りません。
DoCmd.OpenForm "会員データ", , , "種別 =" & Me![種別] & " AND 会員番号 =" & Me![会員番号]
です。
これでエラーになるのなら、
DoCmd.OpenForm "会員データ"
だけで試してみれば問題解決の糸口が掴めるかと。
なお、日付型の場合は、# で括ってください。

QVBA、最小値を取得し乱数を発生し最小値と比較する

17人の生徒がいる教室で、ランダムに生徒を当てて、当たった回数を記録し、平等に当てるというVBAを教えてください。

Aベストアンサー

こんばんは。

>17人の生徒がいる教室で、ランダムに生徒を当てて、当たった回数を記録し、平等に当てる
初心者で、VBAは習ったばかりでは、これが出来るのは、10人に1人がいいところではないでしょうか?
>当方VBAの勉強を始めたばかりでして、超初心者にわかりやすく説明していただけると非常に助かります。
勉強し始めたばかりで、いきなり、このようなものに手を出すのは、無理だと思います。
なるべく簡単なコードを書いてみましたが、私は、説明するのは苦手です。関数もいくつも入っていますから、なんとなくわかるかと思います。

丸々コードを出して云々という声もないわけではないのですが、こちらもあくまでも、人のためではなく、自分のための練習です。まあ、別の掲示板の何人かは、こちらが稼働チェック済みのコードを掲示しても、動かない、エラーが出ると言って、そのまま没にしてしまうくらいの人もいるのですから、これが分かれば、それで十分だと思います。これを参考にしようがしまいが、それは自由です。ただ、初心者であろうが、そうでなかろうが、マクロの数をこなすしか、上達の道はありません。数をこなしていくなかで、覚えていくもので、理屈では、覚えるものではありません。


'//
Sub RandomAverage()
 Dim i As Long
 Dim num As Long
 Dim num2 As Long
 '初期設定
 If Range("D18").Value = "" Then
  For i = 1 To 17
   Cells(i, 1).Value = i
  Next i
  Range("D18").Formula = "=COUNT(R[-17]C:R[-1]C)"
  Range("D19").Formula = "=SUM(R[-18]C:R[-2]C)/ROWS(R[-18]C:R[-2]C)"
 End If
 
 '17番目まで全部当てたら、更新する
 num = WorksheetFunction.CountA(Range("D1:D17"))
 num2 = WorksheetFunction.Count(Range("D1:D17"))
 If Range("D18").Value Mod 17 = 0 And num2 - num = 0 Then
  If Range("E1").Value <> "" Then
   MsgBox "全部当て終わりましたので、データを移します。"
  End If
  
  For i = 1 To 17
   Cells(i, 5).Value = Cells(i, 5).Value + Cells(i, 4).Value
   Cells(i, 4).ClearContents
   num = 0
  Next i
  
  Randomize
  For i = 1 To 17
   Cells(i, 2).Value = Rnd()
   Cells(i, 3).Formula = "=RANK(RC[-1],R1C2:R17C2,1)"
  Next i
 End If
 '次の番に'N'をつける
 For i = 1 To 17
  If Cells(i, 4).Value = "N" Then
   Cells(i, 4).Value = 1
  End If
  If Cells(i, 3).Value = num + 1 Then
   Cells(i, 4).Value = "N"
  End If
 Next i
 If num2 < 16 Then
  MsgBox "Nが、次の人です。" & vbCrLf & _
  "D19の値が正数になるように目指しましょう!"
 ElseIf num = 17 Then
  MsgBox "次は、更新します。"
 End If
End Sub
'///

こんばんは。

>17人の生徒がいる教室で、ランダムに生徒を当てて、当たった回数を記録し、平等に当てる
初心者で、VBAは習ったばかりでは、これが出来るのは、10人に1人がいいところではないでしょうか?
>当方VBAの勉強を始めたばかりでして、超初心者にわかりやすく説明していただけると非常に助かります。
勉強し始めたばかりで、いきなり、このようなものに手を出すのは、無理だと思います。
なるべく簡単なコードを書いてみましたが、私は、説明するのは苦手です。関数もいくつも入っていますから、なんとな...続きを読む

Q【Objective-c】rubyの__send__みたいな使い方がしたい。

Objective-cで、rubyの__send__みたいな使い方がしたいです。

例えば以下のようなインターフェィスのクラスがあるとします。
@interface Hoge : NSObject {
}
- (NSString*)retA;
- (NSString*)retB;
@end

ある条件によって、このクラスのメソッドの呼び別けたいです。
そこで以下のように書いたのですが、コンパイルが通りませんでした。
Hoge* hoge = [[Hoge alloc] init];
NSLog(@"%@",[hoge sw ? retA : retB]);

rubyだとこんな感じです。
hoge.__send__(sw ? "retA" : "retB")

ご指導のほど、宜しくお願いいたします。

Aベストアンサー

objc_msgSend()や-performSelector:とかありますけど、なんかそこに踏み入るのはまだ早いような。

[hoge ret: sw]
みたいな、分かりやすくて確実な書き方を覚えてゆくほうが良いのでは。

Qフォームから他のフォームの内容を更新する方法(ACCESS VBA)

フォームAからフォームBを開き、フォームBでDBの更新を行います。フォームBを閉じたら、更新した内容をフォームA(Spread)に反映させようとしています。

フォームBでデータを再取得し、その内容をフォームAのSpreadに内容を書き込ませようとしましたが書き込めません。フォームBから書き込むことはできないのでしょうか?

また、フォームBを閉じたときに、フォームAにあるコマンドボタンを押すことはできないでしょうか?
押すことができれば更新することができるのですが・・・。

どなたか良い方法をご存知でしたら教えてください。

Aベストアンサー

フォームBを開く際に

Set フォームB.変えたいデータの一時変数 = フォームA.変えたいデータのフォームオブジェクト


フォームBを閉じる際に

フォームB.変えたいデータの一時変数.value = "変えた内容"

でどうでしょう?

QACC2003 DoCmd.OpenQuery 0件非表示

よろしくお願いします。
ACCESSで

DoCmd.OpenQuery ""

にて、クエリーを開きたいのですが、
このとき、0件は開かない、なんて
コトできるでしょうか?

acReadOnly を付けても、クエリー自体は開いて
しまうのですが
 

Aベストアンサー

質問が理解できません。

DoCmd.OpenQuery ""

はエラーになるのでは?

Private Sub コマンド4_Click()
On Error Resume Next
  DoCmd.OpenQuery ""
End Sub

と、エラーを回避したいのでしょうか?


人気Q&Aランキング

おすすめ情報