
Accessユーザーフォームでコマンドボタンのcaptionについてですが
Aテーブルを基に表記式でフォームを作成し、コマンドボタンを配置します。
この際、コマンドボタンのcaptionをAテーブルのフィールド値を表示したいのですが
可能でしょうか?
フォームを開く際に
Private Sub フォーム_Load()
Me!コマンド1.Caption = Me![フィールド1]
End Sub
とイベントを発生させましたが、全てのボタンのCaptionがAテーブル1行目、
フィールド1の値で表示されてしまいます。
Dlookupを使用しても結果か同じでしたので、
フォームをLoadした時のMe![フィールド1]の値がAテーブル1行目の値であり
その値でCaptionが設定されていであろうことはなんとなくわかるのですが
何をどうすればいいか行き詰ってしまいました。
どんなやり方があるのかお教えください。
No.6ベストアンサー
- 回答日時:
#5です
たびたびすみません。
> 「クリック感」が欲しい・・・
ということの様ですので、
いっそのこと、コマンドボタンはなくしてテキストボックスだけにしてみますか。
(コマンドボタンは飾りだったので)
変更手順)
・コマンドボタンは、削除しておきます。
・テキストボックス「txt1」のプロパティで「立体表示」を「浮き出し」に設定します。
背景スタイルは「普通」、タブストップは「いいえ」
「txt1」のコントロールソースは [フィールド1] にしておきます。
・「txt1」をコピー&貼り付け後、名前を「txt2」とします。
「txt2」のラベル部分は要らないので削除しておきます。
「txt2」を「txt1」の上に重ね、「txt2」を最前面にしておきます。
・「txt2」のマウスボタンクリック時、
「txt1」のマウスボタン解放時、クリック時に処理を記述していきます。
Private Sub txt2_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Me.txt1.SpecialEffect = 2
Me.txt1.SetFocus
End Sub
Private Sub txt1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
Me.txt1.SpecialEffect = 1
End Sub
Private Sub txt1_Click()
Me.txdummy.SetFocus
DoCmd.OpenForm "起動フォーム名", , , "抽出条件"
End Sub
※ 上側のテキストボックス「txt2」のマウスボタンクリック時に
「txt1」の立体表示を「くぼみ」に変更し、フォーカスを移動します。
フォーカスを得た「txt1」は前面に出てきます。
マウスボタン解放時に立体表示を「浮き出し」に戻します。
その後にクリック時が発生するので、フォーカスをダミーに移動し、フォームを起動します。
フォーカスが他に移ったことにより、「txt2」がまた最前面に出てくることになります。
※※ ここで難点が1つ
テキストボックスの上で、マウスボタンをクリック/離すで、コマンドボタンの様な動きになりますが、
クリックしたまま、その領域を外れて離した時には、へこんだ表示のままとなってしまいます。
※※ なぜコントロールを重ねることをするのか。
コントロールソースが設定されていれば、表示内容は行(レコード)ごとに違くなるのですが、
見栄えに関するものを変更すると全体に影響があるようです。
なので、見栄えを変更した時に操作対象の行(レコード)以外も同じように変わっていることを隠すためにしています。
下に配置して隠していても、フォーカスを得ると前面に出てくることを利用しています。
上記の「txt1」「txt2」を重ねないで操作されるとわかると思います。
2007で動きを確認してみましたが・・・
何度も本当にありがとうございます。
こちらの環境はXP+Access2002or2003になります。
これを最初に書かなかったことでお手間を取らせまして申し訳ありません。
最終案は以下の通りです。
(30246kikuさんの案をほぼコピーですが・・・)
txt1だけ使用、txt2は使わない。
txt1は「浮き出し」
Private Sub txt1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Me.txt1.SpecialEffect = 2
Me.txt1.SetFocus
End Sub
Private Sub txt1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
明細フォームを開く処理
Me.txt1.SpecialEffect = 1 'ここに入れました。
end sub
使い勝手によっては明細フォームのload時に
forms![表形式フォーム]![txt1].SpecialEffect = 1
でもいいかなと。
結局、30246kikuさんの
>まず、コマンドボタンはレコードごとに制御することはできません。
この指摘が全てだと思います。表形式フォームである以上
クリックしたときに一覧フォームのtxt1ボタンが全て「くぼみ」状態になってしまうのは
仕方がないと思います。
考え方からソースアップまで、手取り足取り状態で、、、本当にありがとうございます。
ご本人目の前なら、正座して感謝したいぐらいです。
No.8
- 回答日時:
【つづき】
動作を見ての余談)
MouseUp の動作をヘルプで見ると、前述の様な動作は想定していないように見えます。
MouseDown 前に Enter / GotFocus イベントが発生しますが、例えば Enter 時に、
前面/背面の関係を変更すると MouseDown/MouseUp イベントは無くなるようです。
MouseDown 時に前面/背面の関係を変更すると
MouseUp イベントは前面の情報で発生する様ですが、領域を外れてボタンを離した場合には
MouseUp イベントは他のコントロール情報で発生する様です。
前面/背面を変更せずにクリックすると、MousuUp イベントはいくら領域を外れていても
そのテキストボックスの情報として上がるようです。
領域を外れているかは、パラメータで得られる X, Y で判別するしかないようです。
2000/2003では、前記では動きませんでした。
操作方法を変えてもいいのなら、以下の様な方法でも
操作)対象のところをダブルクリックする(遅いダブルクリックでも)
「txt2」の Enter時に、「txt1」を前面へ(1つ目のクリックで)
次に発生するクリック(MouseDown/Up で立体表示変更)で、やりたい処理を、
(MouseUp で領域内にあるか判別して)
「txt1」の MouseUp / Click 時には、「txt2」へフォーカス移動できない様です。
(2000/2003で確認)
なので、同じところをクリックする分には、1回のクリックでボタンの様な動きになります。
確認してみた内容は、以下です。
PPrivate Sub txt1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Me.txt1.SpecialEffect = 2
End Sub
Private Sub txt1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
Me.txt1.SpecialEffect = 1
If ((X < 0) Or (Y < 0)) Then Exit Sub
If ((X > Me.txt1.Width) Or (Y > Me.txt1.Height)) Then Exit Sub
MsgBox "txt1 Click : " & Me.txt1 ' ☆
End Sub
Private Sub txt2_Enter()
Me.txt1.SpecialEffect = 1
Me.txt1.SetFocus
End Sub
また、#5ではコマンドボタンの上にテキストボックスを重ねていました。
テキストボックスを小さめにして重ねた時には以下の様な方法もあると思いますが、
コマンドボタン部分をクリックされるとそれなりに動くのですが、
テキストボックスをクリックされた時には、もう一度クリックしないといけません。
Private Sub btn1_Click()
MsgBox "btn1 Click" ' ☆
End Sub
Private Sub btn1_Enter()
Me.btn1.Caption = Me.txt1
End Sub
Private Sub txt1_Enter()
Me.btn1.SetFocus
End Sub
同じ場所でやろうとすることが、無理があるのでしょうか。
ここは素直に、Caption は固定で隣にコマンドボタンを配置した方が楽なのかもしれません。
(私が知らないだけかもしれません)
※※※ 解決されましたら、その方法を記述していただけませんでしょうか。
私も勉強になります。
後日談になりますが・・・本日、最終案にてOKが出ました。
回答者の皆様に読んでいただければ幸いです。
最終案(おさらい)
表形式フォームにテキストボックスtxt1を配置
txt1の立体表示を「浮き出し」に設定
イベントの「マウスボタンクリック時」に
以下組み込み
Private Sub txt1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
'マウスボタンを「くぼみ」にする
Me.txt1.SpecialEffect = 2
Me.txt1.SetFocus
End Sub
イベントの「マウスボタンクリック解放時」に
以下組み込み
Private Sub txt1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
明細フォームを開く処理
Me.txt1.SpecialEffect = 1
end sub
表形式フォームのみでテキストボックスのコントロールをできたほうが
自己完結性が高く、メンテもしやすい。との理由から
明細フォームload時の処理は行わないことになりました。
今後カスタマイズされる可能性はありますが、この部分の基本インターフェースは
これでほぼ完成となりそうです。
皆様のご協力に心から感謝いたします。
ありがとうございました。
No.7
- 回答日時:
#6です(2回に分けての投稿になります)
#6の内容は、2007+Vistaで確認していたものになります。
(2000/2003では動かないようです)
コマンドボタンの動きに近付けてみました。(2007でのものになります)
「txt2」を「txt1」のうえに重ねるのは変わりませんが、以下変更しています。
「txt1」の立体表示は「くぼみ」、「txt2」の立体表示は「浮き出し」で設定しておきます。
背景スタイルは「普通」、タブストップは「いいえ」
コントロールソースはともに [フィールド1] にしておきます。
フォーカス移動用の「txdummy」は要りません。
マウスボタンの Down/Up は、「txt1」「txt2」以外で使っていないことが前提です。
Private Function funcMouseDown()
If (Not Me.NewRecord) Then
Me.txt1.SetFocus
End If
End Function
Private Function funcMouseUp(bFlg As Boolean)
If (Me.ActiveControl.Name = "txt1") Then
Me.txt2.SetFocus ' ★
End If
If (bFlg) Then
MsgBox "txt1 Clickとみなす : " & Me.txt1 ' ☆
End If
End Function
Private Sub Form_Load()
Dim ctl As Control
On Error Resume Next
For Each ctl In Me.Controls
ctl.OnMouseUp = "=funcMouseUp(False)"
Next
Me.OnMouseUp = "=funcMouseUp(False)"
Me.詳細.OnMouseUp = "=funcMouseUp(False)"
Me.txt1.OnMouseUp = "=funcMouseUp(True)"
Me.txt2.OnMouseDown = "=funcMouseDown()"
End Sub
テキストボックス上でマウスボタンを押し、他の場所で離すと表示は元に戻ります。
(テキストボックス上で押し/離すと ☆ でメッセージが出ます)
☆ のところで、フォームを起動するようにします。
ただ、この方法にも難点が1つ。
テキストボックス上でマウスボタンを押し、他の場所で離すと表示は元に戻ります。
が、また同じところを押し/離しても表示はへこんだままとなります。
この時には、MouseUp イベントが発生していないようです。
この状態でもう一度、押し/離すと正常な処理に戻ります。
これを解消するには、やはりフォーカス移動用にテキストボックス「txdummy」を作って
(タブストップは、いいえで)
★ 部分を、Me.txdummy.SetFocus に変更します。
ヘッダー/フッター部分があるのなら、
Me.詳細.OnMouseUp = "=funcMouseUp(False)"
と同様に、設定を追加します。
我流でやっていますので、本来はこうだ・・・っていうのがあるのかもしれません。
(たまたま動いているように見えると思っていたほうがよいと思います)
【つづく】
No.5
- 回答日時:
#2です
> ボタンをクリックするとボタンにフォーカスが移り、・・・
テキストボックスで、コマンドボタンを覆ってしまえば良いような。
文字の表示位置は、テキストボックスの上余白等を設定して調整します。
もしくは、コマンドボタンのクリック時に#2の記述を移し、GotFocus 部分を変更します。
Private Sub コマンドボタン_Click()
Me.txdummy.SetFocus
DoCmd.OpenForm "起動フォーム名", , , "抽出条件"
End Sub
Private Sub txt1_GotFocus()
Call コマンドボタン_Click
End Sub
No.3
- 回答日時:
今あるやり方でレコード移動時に行うと開いた時は、全明細が1件目の値のコマンドボタン名、移動させると2件目の値のコマンドボタン名。
ボタンだとフォームの一部です。他コントロールにしてデータとしての動きにしたいですね。影付きのラベルとか。また、
ボタン部分を詳細に設定していると思いますがボタンだけサブフォームにしても同じでしょうか?。。
1画面1詳細にしておいて細工してレコードは5件分表示とか。
考えてもいいのは思いつかないですね。
こういうのはチェックボックスにして選ばれたものだけ次画面の単票へ、としてます。
この回答への補足
ご回答ありがとうございます。
>1画面1詳細にしておいて細工してレコードは5件分表示とか。
これは考えました。
ただ欠点がひとつ、、、「全てのパソコンのディスプレイは同じサイズではない」
作った後に気が付いてお蔵入りしました(笑)
>こういうのはチェックボックスにして選ばれたものだけ次画面の単票へ、としてます。
ですよね。もしくは普通にボタンを「詳細表示」とかにすればいいのでしょうが
エンドユーザーのレベルにばらつきがあり、
「思ったデータが見られない」
「用語がわからない」
冗談抜きで「ここのクリックは右?左?」状態です。
「可能な限りボタンだけで操作(右クリックだけ)できるようにして欲しい」
という要望で、なるべくなら叶えてあげたいと・・・
心が折れそうですがもう少し足掻いてみます。
No.2
- 回答日時:
#1です。
雰囲気ですが、わかった様な気がします。
(が、DataNatureは知らないのであしからず、です)
構成的には、#1後半に書いた、現状で単に考えてみると・・・で、出来そうに思います。
追加で、フォーカス移動用のテキストボックス「txdummy」を
極小の大きさ、タブストップいいえで作成しておきます。
コマンドボタンの上に配置したテキストボックス名を「txt1」と仮定した場合、
(フォーカス取得後の例になりますが)
Private Sub txt1_GotFocus()
Me.txdummy.SetFocus
DoCmd.OpenForm "起動フォーム名", , , "抽出条件"
End Sub
フォーカスを移動しないと、上に配置したテキストボックスに居座るので、
txdummy へ移動してからフォームを起動します。
コマンドボタンは、ボタンとしての見栄えだけの存在となります。
この設定でそこそこ動きそうな気がしますが、未検証です。
この回答への補足
何度もありがとうございます。
試しましたがちょっとNGでした。イメージに近い動作ではありましたが・・・
ボタンをクリックするとボタンにフォーカスが移り、結果テキストボックスが
ボタンの後に隠れてました。
(私のスキルの問題かも知れませんが・・・)
お知恵出していただきありがとうございます。
やり方自体は考え付かなかった方法でしたので、感謝しております。
No.1
- 回答日時:
> 表記式でフォームを作成し、コマンドボタンを配置
ということの様ですので、
まず、コマンドボタンはレコードごとに制御することはできません。
(コマンドボタンは連結設定するコントロールソースを持ちません)
なので、詳細部分にコマンドボタンを配置しても、1つの設定=全部の設定 になります。
何をされたいかによっては、代替え案が浮かぶかもしれません。
その辺りを、詳しく教えていただけませんか。
また、以下はヒントになりませんか。
Accessの表形式のフォームについて
http://oshiete1.goo.ne.jp/qa5477045.html
現状で単に考えてみると、コマンドボタンの上にテキストボックスを重ねます。
コマンドボタンの Caption は、常に空白とします。
テキストボックスのコントロールソースに、[フィールド1] を設定しておきます。
テキストボックスの背景/枠は、透明に。
また、コマンドボタン/テキストボックスのタブストップは「いいえ」に。
テキストボックスの Enter / GotFocus どちらかで、
コマンドボタンクリック時の処理を行えば良さそうに思います。
細かなところの補足をお願いします。
でも、私で解決できるかは???
この回答への補足
ご回答ありがとうございます。
表記式->表形式 誤字読み取って頂き感謝します。
イメージは(分かりにくくて申し訳ないです)
Aテーブル
|フィールド1|フィールド2|フィールド3|
表形式フォーム
Bottun:フィールド1、Textbox:フィールド2、Textbox:フィールド3
Bottunを押すと該当レコードの単票形式フォームを表示、といった感じになります。
これならパソコンが不得意な方でもより直感的な操作が出来るかも・・・
といったところです。
DataNatureというソフトがあり、目標はこれに近いインターフェースを目指すことです。
>まず、コマンドボタンはレコードごとに制御することはできません。
その通りですよね。
なのでなんとかならんかなぁと・・・もう少し悩んでみます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) ユーザーフォーム「frm_基本❶」を立ち上げると新規で入力する行数を右下のNoとして表示しています。 1 2023/03/16 19:02
- Visual Basic(VBA) 検索のユーザーフォームの表示について 1 2023/03/27 23:31
- Access(アクセス) Accessテーブルの結合で別々のテーブルのフィールドを組み合わせて値を出す方法について 2 2022/07/20 19:43
- Access(アクセス) テキストボックスの値をテーブルに入力したい 2 2022/06/28 12:08
- Access(アクセス) アクセスの更新クエリでカレントレコードのみ更新したい 1 2022/06/02 23:32
- Visual Basic(VBA) ①ExcelVBAでカレンダーを作り、別のユザーフォームで日付を入力したいのですがエラーになります。 1 2023/02/17 18:39
- Access(アクセス) Access 登録ボタンからサブフォームの更新 1 2022/07/22 10:23
- その他(データベース) Accessフォームからパラメーターで表示したレコードを指定のExcelのセルへ転送する方法について 2 2022/08/22 18:04
- Access(アクセス) Accessテキストボックス内に2つのフィールドの値を比較して大きい方の値を表示させる方法 1 2022/09/09 10:50
- Access(アクセス) Accessでセレクタをダブルクリックで別フォームで詳細表示 3 2022/12/20 10:36
このQ&Aを見た人はこんなQ&Aも見ています
-
Accessのフォームにて、詳細行のボタンを行の内容により、表示/非表
その他(Microsoft Office)
-
Accessの表形式のフォームについて
Access(アクセス)
-
Microsoft Access 「Form」のボタンの標題を別テーブルから…
Access(アクセス)
-
-
4
MS Accessでフォームの「開く時」と「読込み時」のイベントの違い
Access(アクセス)
-
5
Access サブフォームでの選択行の取得
その他(データベース)
-
6
日付型のフィールドに空白を入れる方法を教えてください
その他(データベース)
-
7
Access2010 「演算子がありません」エラー
その他(データベース)
-
8
帳票フォームコマンドボタンを使用不可にしたい
その他(Microsoft Office)
-
9
VBA テキストボックスを選択状態にしたい
その他(プログラミング・Web制作)
-
10
レコード削除時に(サブ)フォームに表示される#Deleted"について"
Access(アクセス)
-
11
Accessのフォームのみ表示させたい
Access(アクセス)
-
12
Accessのレポート上のテキストボックス値を設定したい
その他(データベース)
-
13
access サブフォームにリストを表示させたいが一件しかレコードが表示されない
Access(アクセス)
-
14
Accessの更新後処理で特定の条件を満たしている場合、フォーカスを移動させない方法
PowerPoint(パワーポイント)
-
15
(ACCESS)条件に応じて、テキストボックスを表示・非表示設定
その他(データベース)
-
16
Accessのコマンドボタンの立体化について
Access(アクセス)
-
17
ACCESSでVBAから選択クエリの抽出条件を指定したい
Access(アクセス)
-
18
アクセスVBAのMe!と[ ]
Access(アクセス)
-
19
AccessVBAで作成したExcelファイルを削除する方法は?
Visual Basic(VBA)
-
20
アクセスのフォームのビューが表示されないのですが、
その他(データベース)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
コマンドボタンを押すたびに大...
-
Excel:コマンドボタンの移動
-
スクロールしてもボタンを常に...
-
コマンドボタンの画像も拡大表...
-
Excel VBA --- コマンドボタ...
-
チェックボックスで「いずれか1...
-
コマンドボタンがあるかどうか...
-
[ExcelVBA] コマンドボタンを押...
-
LATEXについて。
-
エクセルVBAでOptionButtonのオ...
-
Movie Writerのボタン表示
-
押したボタンの位置取得(共通の...
-
Wordでドラッグした文字列を括...
-
エクセルVBA
-
PPTのコマンドボタンがクリック...
-
VBA マクロのボタンの削除
-
EXCELでNo.を変えて印刷したい
-
Accessのコマンドボタンの立体...
-
ACCESS2003のコマンドボタンの...
-
オートフィルタで非表示セルの判定
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
コマンドボタンを押すたびに大...
-
Excel:コマンドボタンの移動
-
スクロールしてもボタンを常に...
-
押したボタンの位置取得(共通の...
-
PPTのコマンドボタンがクリック...
-
Accessのコマンドボタンの立体...
-
Excel VBA --- コマンドボタ...
-
コマンドボタンがあるかどうか...
-
エクセルVBAでOptionButtonのオ...
-
ShowAllDataのエラーを回避したい
-
チェックボックスで「いずれか1...
-
コマンドボタンで「終了ボタン...
-
エクセルVBA
-
EXCELでNo.を変えて印刷したい
-
エクセルでマクロを使わずに複...
-
Wordでドラッグした文字列を括...
-
Accessユーザーフォームでコマ...
-
エクセルでマクロボタンを動か...
-
エクセルのコマンドボタンの位...
-
エクセルVBA シート上にあるコ...
おすすめ情報