Microsoft Access 掲示板

views
4 フォロー
6,283 件中 4,601 から 4,640 までを表示しています。
6
どんぐり 2020/10/12 (月) 17:49:24 f1ed8@f8526 >> 5

なるほど!解決しそうです!
混乱して要らぬ情報まで書いていたようです。
ありがとうございました!

5
hiroton 2020/10/12 (月) 16:35:20 9d757@f966d

基本的には「契約満期日」順に並べたいが、「契約中」でないものは下に回したくない、という状況です。

考え方自体は「[契約状況]<>"契約中"」という並べ替え用の式(フィールド)を作って「最新契約満期日」よりも前に指定してあげればいいです

並べ替えの設定はフォームの並べ替えプロパティでやっているのかな?
ならばそのまま次の形で

[契約状況]<>"契約中", 最新契約満期日
4

契約リストフォームは帳票です。

帳票フォームの詳細セクションにサブフォームは配置できないはずですが。
言葉での説明が難しいなら、現状のフォームのスクリーンショットを提示できませんか。

あと、「契約フォーム」の並び順についてで、クエリで並び順を設定しているなら、そのフォームのレコードソースのクエリのSQL文を提示してください。

3
どんぐり 2020/10/12 (月) 15:58:51 0029a@1c915 >> 2

>「契約リストフォーム」の中で「契約フォーム」のレコードが並んでおり

契約リストフォームは帳票です。

2
どんぐり 2020/10/12 (月) 14:57:36 0029a@1c915

わかりづらくてごめんなさい。
「契約リストフォーム」の中で「契約フォーム」のレコードが並んでおり
「契約フォーム」の中に「サブ契約フォーム」が並んでいます。
今回悩んでいるのは「契約リストフォーム」の中の「契約フォーム」の並び順です。
現状の並び替えは「最新契約満期日」のみとしており、特にSQLは利用していません。

1

「契約リストフォーム」というのは、契約フォームの中のサブフォームということですか。

そのサブフォームのレコードを並び替えたいということですか。

現状、並べ替えはレコードソースのクエリに設定していますか。
もし、そうなら、そのクエリをSQLビューにして表示されるSQL文をコピーして貼り付けてもらえますか。

2
どんぐり 2020/10/09 (金) 14:08:08 0029a@1c915 >> 1

うまくいきました。ありがとうございます。

8
ニンジャ 2020/10/09 (金) 14:01:47 0029a@1c915

やはりそこでしたか…助かりました。ありがとうございました。

7
hiroton 2020/10/09 (金) 13:49:18 414c4@f966d

とりあえず

区分NO(短いテキスト)で検索したい。

ならSQLでも文字列が指定されている必要があります

区分NO = " & Me.txt区分NO & ")"

区分NO = '" & Me.txt区分NO & "')"

6
ニンジャ 2020/10/09 (金) 13:28:49 0029a@1c915 >> 5

ちなみに「btn物件」を配置しているフォームは、また全然別のフォームです。

5
ニンジャ 2020/10/09 (金) 13:26:16 0029a@1c915 >> 4

すみません、間違って投稿してしまいました…
下記のコードを作りましたがうまく作動しません。

Private Sub btn物件_Click()
    If Not IsNull([txt物件ID]) Then
    DoCmd.OpenForm "F_物件管理", acNormal, "", "物件管理ID In (SELECT 物件管理ID FROM Q_サブ物件 WHERE 区分NO = " & Me.txt区分NO & ")", , acDialog
    Else
    DoCmd.OpenForm "F_物件管理", acNormal, , , acFormAdd
    End If

メインフォームのレコードソースのテーブル名(orクエリ名)Q_物件管理
それの主キーと主なフィールド名、 物件管理ID(主キー)、オーナー情報など
サブフォームのレコードソースのテーブル名(prクエリ名) Q_サブ物件
それの主キーと主なフィールド名 物件ID(主キー)、区分NO、住所など
また、サブフォームコントロールのリンク親フィールド、リンク子フィールドの設定 物件管理ID
区分NO(短いテキスト)で検索したい。

何が間違っているのか、教えていただけると助かります。

4
ニンジャ 2020/10/09 (金) 13:11:03 0029a@1c915

少し前の質問になりますが、うまくいかないため改めて質問です。

13

ちなみにもう1か所Mtxtboxのままになっている部分があるようです

あっ(汗)、修正しておきました。

12
シソンヌ 2020/10/09 (金) 10:59:31 0029a@1c915 >> 10

うまくいきました。(ちなみにもう1か所Mtxtboxのままになっている部分があるようです)
大変勉強になりました。応用して、他でも色々作れそうです。ありがとうございました。

11

=[=Titlepath]([名前],"名前")

Titlepath は Titleph に修正済みとして、その前の全角の を半角の = に変更してください。
(前の私の回答も全角になってましたので修正しておきました。)

=Titleph([名前],"名前")

10

色々試してみたこととしては、「Mtxtboxをtxtboxに変える」

タイプミスでした。txtboxが正しいです。回答も修正ておきます。

テキストボックスのコントロールソースの設定は下記です。
[名前]の[]内はテキストボックスの名前、"名前"の部分はうっすらと表示させたいテキストです。

=Titleph([名前],"名前")
9
シソンヌ 2020/10/09 (金) 10:12:16 0029a@1c915 >> 7

コントロールソースが間違って「Titlepath」になっていたことに気づきました…「Titleph」に変更したところ、エラーが「#Type!」になりました。度々すみません。

8
シソンヌ 2020/10/09 (金) 09:58:49 0029a@1c915 >> 7

失礼しました。コントロールソースの自動変換後は下記になります。

=[=Titlepath]([名前],"名前")
7
シソンヌ 2020/10/09 (金) 09:57:48 0029a@1c915 >> 6

早速ありがとうございました。
上記VBAをコピーして、コントロールソースは「名前」の部分だけ変えて実装してみましたが
「#Name?」と表示されます。
色々試してみたこととしては、「Mtxtboxをtxtboxに変える」(宣言での変数と文中での変数が異なっていていいのかわからず??)「標準モジュールにおいたり、該当のフォームのモジュールにおいたり」です。
ちなみに、コントロールソースは自動で下記のように[]がついておりました。
==Titlepath

何か勘違いしておりますでしょうか?

6
hatena 2020/10/09 (金) 09:30:20 修正

汎用関数は、

Public Function Titleph(txtbox As control, placeHolder As String)

    If txtbox.Value <> "" Then
       Titleph = txtbox.Value
    Else
       Titleph = placeHolder 
    End If
    
End Function

テキストボックスのコントロールソースに、下記のように設定することになります。

=Titleph([名前],"名前")

5
シソンヌ 2020/10/09 (金) 08:35:39 0029a@1c915 >> 4

ちなみに下記のような形ではうまく行きませんでした
初心者で恐れ入ります。

Public Function Titleph(phTitle)

    If Me.phTitle <> "" Then
    phTitle
    End If
    
End Function
4
シソンヌ 2020/10/09 (金) 07:53:51 0029a@1c915

ありがとうございました。早速今日、実装予定です。
ところでこういったコントロールソースやクエリデザインで使う式なども
汎用関数を作って対応することはできますでしょうか?
もし使えるという場合、逆に使えない場所があれば教えてください。

1

前のスレッド、いま見直してみたら、ちょっと間違ってますね。
メインフォームの更新前処理で最新日を更新してますが、サブフォームで更新してもメインフォームの更新前処理は発生しないので、サブフォームの更新後処理でメインフォームの最新日を更新すべきですね。

メインフォームの更新前処理のイベントプロシージャを削除して、サブフォームの更新後処理に下記のコードを記述してください。

Private Sub Form_AfterUpdate()
    If Me.Parent!最新購入日 =  Me.最新購入日 Then
    Else
       Me.Parent!最新購入日 =  Me.最新購入日 
    End If
End Sub
2
nokonoko 2020/10/08 (木) 11:37:35 653a6@54883

よくわかりました。活用させていただきます。

1
    Me.sbfDisplayData.SetFocus
    DoCmd.GoToRecord , , acLast
    DoCmd.GoToRecord , , acPrevious, 5 '5つ戻る
    DoCmd.GoToRecord , , acLast

戻るレコード数はサブフォームに表示されている行数にしてください。

3

名前」テキストボックスを最前面へ移動して背景スタイルを「透明」

なるほど、それがシンプルでいいですね。


1文字でも入力したら~

単票フォームならいいですが、帳票フォームだとカレント行以外にも影響を与えるので、それを考慮すると難しい。条件付き書式で文字色を白(背景色と同じ)にすることになるかな。下記の応用で。

カレント行の背景色の変更 - hatena chips

2
hiroton 2020/10/07 (水) 17:19:32 31f4f@f966d >> 1

フォーカスのあるテキストボックスは背景スタイルの「透明」が無効になるので「名前」テキストボックスを最前面へ移動して背景スタイルを「透明」にしてあげればVBAはいらないかなと


1文字でも入力したら~を実現しようと思ったらEnterでNullなら幅0、文字入力orExitで幅を戻すとかする感じですかねぇ。労力に見合った感じはしないですね

1

1文字でも入力したらというのは難しいですが、薄く表示させておいてフォーカスが来たら消えるという仕様なら下記の方法で可能です。

「名前」テキストボックスの上に重なるようにテキストボックスを配置して下記のように設定します。

プロパティ設定値
コントロールソース=IIf([名前]<>"","","名前")
背景スタイル透明
境界線スタイル透明
前景色灰色
タブストップいいえ
名前ph名前

フォーカス取得時のイベントプロシージャを下記のように記述します。

Private Sub ph名前_Enter()
    Me.名前.SetFocus
End Sub

以上です。

5
白絹 2020/10/07 (水) 12:23:44 89e3f@3f393

kitasue様
ご回答ありがとうございます。
上記内容で運用できそうです!

ありがとうございました。

2
シソンヌ 2020/10/07 (水) 10:06:55 0029a@1c915

ありがとうございました。フッターを使ったことがなかったので、参考になりました!カレンダーも別の場所で使用したいと思います。

1

「折りたたんで表示」というのがどのようなものなのかよく分からないですが、
ボタンをクリックすると高さが拡張して全体が表示されるというイメージでしょうか。
だとするほぼ不可能だと思います。

自分がするのは、備考フィールドだけフッターに配置して最初から高さを高くしておくことぐらいですね。
あとは別フォームに表示させるぐらいかな。

カレンダーダイアログ日付入力関数の改良版 - hatena chips
上記では帳票フォームの日付テキストボックスのすぐ下にカレンダーフォームを表示させるというテクニックを使ってますが、これを応用して、備考テキストボックスのすぐ下にテキストボックスをもつフォームを表示させるということはできると思います。
WinAPIを使ってますのでお手軽ではないですが。

4
kitasue 2020/10/06 (火) 13:27:09 d057a@e9d43

エラー出力ではなく、Null出力でよろしければ、先程のSQL文をクエリ「Q1」として登録して

SELECT
	テーブル名.ID,
	Max_A,
	Max_B
FROM
	テーブル名
LEFT JOIN
	Q1
ON
	テーブル名.ID = Q1.ID;

で、いかがでしょうか。

11
hiroton 2020/10/06 (火) 10:33:04 589a0@f966d >> 3

フィルタ用のテキストボックス、コンボボックスが空白の時の処理を考える必要があります
VBAの場合、

If Not IsNull(Me!txt社員コード) Then
    strFilter = " AND 社員コード='" & Me!txt社員コード & "'"
'Else
'//なにもしない
End If

この形で「そもそもフィルタリングしない」を選べますが、クエリデザインの場合「必ず何かしらの抽出条件を設定する」ことになるため任意のフィールドでフィルタリングするようなのはひと手間必要です

■コンボボックスが片方空っぽでも(魔法使いの開発工房さん)

または、Nullを許可しないフィールド限定になりますが

ex)
フィールド:社員コード
抽出条件:Nz([forms]![フォーム名]![txt社員コード],[社員コード])

というような方法もあります
そもそもNullを抽出したい場合にはIs Nullと指定する必要がある。なんかもVBAなら柔軟に処理できるメリットがありますね


慣れの問題なのでどちらが楽かとは一概に言えないですが、余計な処理をしない点でVBAのほうがより良いものです

3
kitasue 2020/10/06 (火) 09:20:54 d057a@e9d43

ごめんなさい。エラーは返さずオミットしてしまいますが、以下でどうでしょうか。
テーブル「tblSeq」を追加します。フィールドは、「SEQ」一つで内容は、

SEQ

1
2
3
の3レコードです、その上で、

SELECT
	ID,
	Max(Choose([tblA].[SEQ],[A1],[A2],[A3])) AS Max_A,
	Max(Choose([tblB].[SEQ],[B1],[B2],[B3])) AS Max_B
FROM
	テーブル名,
	tblSeq AS tblA,
	tblSeq AS tblB
WHERE
	Abs(Choose([tblA].[SEQ],[A1],[A2],[A3])-Choose([tblB].[SEQ],[B1],[B2],[B3]))<=100
GROUP BY
	ID;

のSQLで行内のAの最大値とBの最大値を出力します。

10
セロハン 2020/10/06 (火) 09:08:34 0029a@1c915 >> 9

詳しく教えていただき、ありがとうございます!
じっくり確認させていただき、不明点があった場合は改めて質問させていただきます。
③の質問については、hatena様のVBAで作成できますよね…大変失礼いたしました。VBAで実行可能なことは承知の上で、1個質問です。
クエリデザインで作成することは可能でしょうか?不可能であれば諦めがつくので教えていただけると幸いです。可能だとすると、コンボボックスに工夫が必要になりますでしょうか。だとすると、VBAのほうが楽でしょうか。
※帳票スタイルのリストに対して、フィールドごとにコンボボックスがあり、複数の絞り込み条件を重ねる際、クエリデザインで設計できるか?という質問です。わかりづらくてスミマセン

2

kitasue様、
御返事ありがとうございます。一例で入力したため、数値を良く確認しておりませんでした。
100以下にならない場合はエラーを返してほしいなと…
エクセルでやれと言われそうですが何卒宜しくお願い致します。

1
kitasue 2020/10/05 (月) 16:30:13 d057a@e9d43

ID=3では、差が100以下にならないのでは。

9
hiroton 2020/10/04 (日) 22:57:03 4e4b1@358c8 >> 3

イメージしてるものに齟齬があるような気がしないでもないですが

①「="ラベル名"&IIf([フィルタ用]<>"","▼","▽")」なのですが、

hatenaさんのブログのサンプルを例にとるならば
="社員コード"&IIf([txt社員コード]<>"","▼","▽")

="フリガナ"&IIf([txtフリガナ]<>"","▼","▽")
みたいな感じです。フィルタをかけているフィールド(列)は「▽」が「▼」になって区別できるという仕組みです

②「フォーカス取得時にフィルタ用にSetFocus」という意図は

フォーカス取得時EnterですねGotFocusでもほぼ変わらないのでどちらでもいいですが

③絞り込みは重ねていくことはできますでしょうか。

ちょっと質問の内容が理解できていません。フィルタの仕組み自体はhatenaさんのブログにあるような、フィールド(列)毎にフィルタ用のテキストボックス(またはコンボボックス)を用意するというだけのものです


この方法の問題点
フォーカスのあるコントロールは最前面に表示されるという仕様を使っているので期間指定(min、maxでテキストボックスを2つ用意したい)みたいなのはどうしたもんかとなります


▽(▼)について
上で軽く触れましたが、フィルタの内容を入力するテキストボックス(コンボボックス)は基本的にフィールド(列)のラベルに隠れた状態になるのでフィルタを適用しているフィールド(列)がどこなのかぱっと見でわかるようにするためのものです。この部分だけ独立させるとサイズやフォントを変えたり右端に寄せたりしてもう少しExcelっぽくできそうな気もします
条件付き書式を使ってみるという手もあるかもしれません


VBAの実装について
フィールド(列)のラベルとして使うコントロールを例えば「列ラベル_txt社員コード」のようにしたとすると

Private Sub 列ラベル_txt社員コード_Enter()
    Me.txt社員コード.SetFocus
End Sub

のようになりますが、コントロール数分記述するのは手間だしVBAコードが見づらくなります。フィルタの内容を入力するコントロールを例えばすべて「フィルタ_○○」のように統一して

Private Function setFocusFilterControl()
    Me(Replace(Me.ActiveControl.Name,"列ラベル_","フィルタ_")).SetFocus
End Sub

のような関数を作るとフォーカス取得時イベントに[イベントプロシージャ]を指定してコードを記述する代わりに=setFocusFilterControl()を設定するだけで済むのでいろいろはかどります

8
セロハン 2020/10/03 (土) 23:27:54 0029a@1c915 >> 3

2種類、検索をヘッダーに作りたいページがあり、1つはhatena様に教えていただいた方法、もう1つはコンボボックスが多いのでhiroton様に教えていただいた方法を使わせていただくことにしました!
そこで質問です。
①「="ラベル名"&IIf([フィルタ用]<>"","▼","▽")」なのですが、
フィルタ用の部分は何を指定するイメージでしょうか。
わからず…スミマセン。

②「フォーカス取得時にフィルタ用にSetFocus」という意図は
下記ですよね。

'''Private Sub txt検索_GotFocus()
    Me.cbo検索.SetFocus
End Sub
'''

③絞り込みは重ねていくことはできますでしょうか。

色々聞いてスミマセン。宜しくお願いいたします。

3

Accessではたいていのことはクエリのデザインビューでできますが、サブクエリとかユニオンクエリなどを使えるようになるにはSQLの理解は必要ですね。