Microsoft Access 掲示板

6,622 件中 4,761 から 4,800 までを表示しています。
2
hatena 2020/11/07 (土) 10:45:35 修正

追加クエリでカレントレコードのメイン、サブ共にオートナンバーのID部分以外を追加する。
といった感じで可能でしょうか。

それで可能ですよ。

まずは、メインの方を追加してから、サブを追加という順番になります。
メインを追加した後で、オートナンバーのIDの最大値(=追加したレコードのID)を取得して、
サブの外部キーの値にします。

下記のような感じのコードになります。

    Dim sSQL As String
    
    sSQL = "INSERT INTO メイン (フィールド1, フィールド2, ・・ ) " & _
           "SELECT フィールド1, フィールド2, ・・  FROM メイン " & _
           "WHERE 主キーフィールド=" & Me.主キーフィールド
    CurrentDb.Execute sSQL, dbFailOnError
    
    
    Dim maxID As Long
    maxID = DMax("主キーフィールド", "メイン")
    
    sSQL = "INSERT INTO サブ (" & maxID & ", フィールド1, フィールド2, ・・ ) " & _
           "SELECT リンクフィールド, フィールド1, フィールド2, ・・  FROM サブ " & _
           "WHERE リンクフィールド=" & Me.主キーフィールド
    CurrentDb.Execute sSQL, dbFailOnError
4

ちなみになのですが、年月のみの表示(卒業年月など)のデータで
オプショングループを選択しない状態でも入力することもあるのですが、
入力されたデータの書式(西暦か和暦)通りの書式で
yyyy年m月かge年m月と表示することはできるのでしょうか?

その場限りでなく、レコード移動したりフォームを閉じてから開いても、入力時の書式を保存しておきたいということなら、
日付/時刻型のフィールドでは無理ですね。テキスト型にするか、別に西暦か和暦かを保存しておくフィールドが必要になります。

3
hiroton 2020/11/07 (土) 08:26:45 e2316@f966d

単票フォームですよね?

TextBox.Text property (Access)

入力中の文字列はTextプロパティで参照できるので1文字目が数字かそうでないかで書式を変更すればいいかな?

Private Sub 日付_AfterUpdate()
    With Me.日付
    If IsNumeric(Left(.Text, 1)) Then
        .Format = "yyyy年m月"
    Else
        .Format = "ge年m月"
    End If
    End With
End Sub
2
亞紀姐 2020/11/06 (金) 20:29:46 3a4ba@81907 >> 1

hirotonさま>
ありがとうございます。
自分で書いておいて、IFがあるのをすっかり見落としていました…
確かに今私が行いたい挙動にはいらない部分でした。

>&&99\年99\月99\日;0;_
ありがとうございます!

>実際にどんな入力をするんですか?
提出された履歴書を元に入力しますが、履歴書に書かれているデータが和暦だったり西暦だったりするので、どちらでも入力できるようにしたいと希望があったのです。

おかげさまでどちらでも入力できるようになりました。
ありがとうございます。

ちなみになのですが、年月のみの表示(卒業年月など)のデータで
オプショングループを選択しない状態でも入力することもあるのですが、
入力されたデータの書式(西暦か和暦)通りの書式で
yyyy年m月かge年m月と表示することはできるのでしょうか?
(現在は入力は上記のように自由に選べますが、入力後フォーカスが移動したら、入力がどのような書式だったとしても、表示は指定の書式の表示になります)

もしご教示いただけたら助かります。
よろしくお願いします。

1
ポンタ 2020/11/06 (金) 16:35:16 0029a@1c915

追加クエリで対応しようとトライしていましたが、不可能な気がしてきました。
メインとサブがある部分で引っかかってしまいます。
どのような方法があるかご教示いただけると助かります。

1
hiroton 2020/11/06 (金) 16:12:28 修正 f9f49@f966d

例えば西暦入力に切り替えようとします

        If Not IsNull(Me.雇保加入年月日) Then '//[雇保加入年月日]にデータがあれば下記を実行
            With Me.雇保加入年月日
                .InputMask = "9999\年99\月99\日;0;"
                .Format = "yyyy年m月d日"
            End With
        End If

新規入力(データがない状態)だと実行されないコードですがそこは大丈夫ですか?

生年月日だけは

        Case 1
            With Me.生年月日
                .InputMask = "9999\年99\月99\日;0;_"
                .Format = "yyyy年m月d日"
            End With
            If Not IsNull(Me.入社月日) Then

で、条件判定がないので常に切り替わります。それぞれのIfが何をしたいのか確認してみてください

1.和暦でも西暦でもどちらでも入力可能な定型入力型というのはあるのでしょうか?

TextBox.InputMask property (Access)

&&99\年99\月99\日;0;_

で、どちらでも入力できるはずですが実際にどんな入力をするんですか?

1
ポンタ 2020/11/06 (金) 16:01:42 0029a@1c915

プロパティの「印刷時の縮小」を「はい」にすると、空の場合詰めて印刷されます。
どうでしょうか。

10
トマト 2020/11/06 (金) 11:27:22 0029a@1c915 >> 8

なるほど!よくわかりました。便利なものができそうです。ありがとうございました!!

9
hiroton 2020/11/06 (金) 11:19:19 f9f49@f966d

同じ内容を入力したくないなら更新後処理規定値を変更するようにすればいいです

Private Sub 種類_AfterUpdate()
    Me!種類.DefaultValue = Me!種類
End Sub

さらに、登録済みデータ(Tデータとする)から種類を選択したいなら登録済みデータからリストを作ってしまえばいいです。フォームを開いた後に追加されたデータはリストに表示されないのでフォーカス取得時にリストを更新するようにします

値集合ソース:SELECT 種類 FROM Tデータ GROUP BY 種類 ORDER BY 種類;
値集合タイプ:テーブル/クエリ
入力チェック:いいえ

Private Sub 種類_AfterUpdate()
    Me!種類.DefaultValue = Me!種類
End Sub

Private Sub 種類_Enter()
    Me!種類.Requery
End Sub

登録済みデータのうち一部を表示したいとかだとやっぱり値リストやそれ用に別なテーブルを作る必要があります

8

上記の設定だけで編集は可能になりますが、リスト項目編集フォームの方で新規レコードへ移動、既定値をコンボボックスに入力した値に設定などをするようにすると使いやすいものにできますね。

7

③までで、あってますよ。
あと、「入力チェック」を「はい」、「値リストの編集の許可」を「はい」に設定しておけばOKです。
下記も参考にしてください。

■T'sWare Access Tips #471 ~コンボボックスから値集合ソース編集画面を表示する方法~

6
トマト 2020/11/06 (金) 10:39:36 0029a@1c915

ありがとうございます。
早速作ってみたのですが、理解しきれていないようです。
①新しくリスト項目のテーブルを作成
②①を基にフォームを作成
③利用したいコンボボックスを選択してプロパティ「リスト項目編集フォーム」から該当のフォームを選択。
④?
④からがわかりませんでした…(③までも間違っているでしょうか)

自宅にあったプロパティ辞典にも乗っておらず…
辞典をパラパラしながらふと思ったのですが、そもそも今回の質問についてですが
何のために行っているかというと、グループ名設定のためになります。
レポートにするときのグループ分けのため、レコード毎に同じグループを入力するのが面倒なので、コンボボックスを設置していました。
(サブに1個ずつと、メインからはチェックしたものに一括で入れるためのコンボボックス)

グループ名設定となると、他に良い方法があったりしますでしょうか…?

以上お手数をおかけいたします。宜しくお願いいたします。

7
hiroton 2020/11/06 (金) 10:35:54 f9f49@f966d

参考に挙げたものは基本的なところなのであとはExcel VBAの知識が必要になります

大まかな書式(罫線や塗りも含め)はテンプレートとしてExcelファイルを作っておき、VBAでシートのコピーや行、セルのコピーで書式を整形して、そうしたらデータを流し込む
こんな流れになると思います。書式の設定からVBAでやってもいいんですが、いずれにせよその部分はEXCEL VBAの知識で組み立てることになります。記述自体はACCESS VBAの上でもできますよ(諸注意あり)という具合ですね

というわけで、「書式の整形がうまくいきません」ならExcel(Excel VBA)の問題になるので情報の調べ方に気を使ってみてください

2
  • 抽出条件引数の位置がおかしい
  • "AND"の前に半角空白が必要
  • ""が余分

車庫IDが数値型の場合なら、

DoCmd.OpenReport "L書類", acViewPreview, ,"車庫ID=" & Me.ID & " AND 印刷=True"

車庫IDがテキスト型の場合なら、

DoCmd.OpenReport "L書類", acViewPreview, ,"車庫ID='" & Me.ID & "' AND 印刷=True"
1
tokinaito 2020/11/06 (金) 09:57:50 10f3b@f6db2

DoCmd.OpenReport "L書類", acViewPreview, "車庫ID=" & Me.ID & "AND 印刷=True"""
すみません自己解決しました。印刷のところをコントロールソースにしたらうまくいきました。

5

テーブルなら、「リスト項目編集フォーム」に値集合ソースのテーブルをレコードソースとするフォームを設定すると、「値リストの編集」をクリックするそのフォームが表示されます。これだとVBAなしでできます。

ListItemsEditForm プロパティ (Access) | Microsoft Docs

hirotonさん紹介のNotInListイベントを使うとVBAが必要ですか、もっと使いやすいUIを構築できます。

ComboBox.NotInList event (Access)

6
ポンタ 2020/11/06 (金) 09:19:29 0029a@1c915 >> 5

色々と参照ページを教えていただき、ありがとうございます。1つずつ紐解いていけば必ず作成できるんですよね…
聞きなれないワード(バインディング)にビビっていますが、なんとか地道に作成していきたいと思います。ありがとうございました!

4
ポンタ 2020/11/05 (木) 21:57:12 0029a@1c915 >> 3

レポートの作成が落ち着いてきたため、Excelへの出力を考えています。
かなり難しそうですね…
無理かもしれませんが・・・イメージを教えてください。

①アクセスから該当のデータをクエリからエクセルにエクスポート(サブとメインあわせて2つ)
②エクセルから2つのデータを取り込み、任意の配置を行う。
④配置されたデータから判断して罫線を引く。色を塗る。

このようなVBAの流れになりますでしょうか。
アクセスでエクスポートして、続きはエクセルのVBAでしょうか。

以上よろしくお願いいたします。

9
ポンタ 2020/11/05 (木) 20:23:38 0029a@1c915 >> 6

ケアレスミスしてました…うまくいきました。

Private Sub グループフッター3_Format(Cancel As Integer, FormatCount As Integer)


If IsNull(Me.グループA) Or IsNull(Me.グループB) Then
Else
Cancel = (Me.グループA = Me.グループB)
End If
End Sub
8
ポンタ 2020/11/05 (木) 16:45:35 0029a@1c915 >> 6

こちらの方法で1回うまくいったと思っていたのですが、「nullの値が不正です」との警告が出て、固まるようになりました。なにか間違っているのでしょうか…

2
nankyoku 2020/11/05 (木) 14:51:14 0029a@1c915

ありがとうございました。
新たに立ち上げると、イントラへのログインが必要だったため、うまくいきませんでしたが勉強になりました。

4
hiroton 2020/11/05 (木) 10:25:32 b95b2@f966d

テーブルにするなら
ComboBox.NotInList event (Access)

テーブルにしないならサブフォームのフォーカス取得時/喪失時イベントで値集合ソースの比較をするとかかな?

7
hatena 2020/11/05 (木) 09:54:12 修正 >> 6

グループヘッダーに集計用テキストボックス=Sum()=Count()を置いた場合でもちゃんとグループ内の集計が取得できますので、formatイベントに関係なくグループ全体の集計をしているみたいですね。

ちなみに詳細セクションに集計関数を置くと全体の修正をするようです。一番目のレコードでも全体集計になります。

3
トマト 2020/11/05 (木) 09:13:09 0029a@1c915

先日教えていただいた、値リストの編集を便利に活用しております。
わがままな要望なのですが、この値リストをサブフォームとメインフォームで共有することはできますでしょうか。
テーブルにすれば可能だと思いますが、テーブルにした場合コンボボックスから直接編集はできますでしょうか…
難しそうであればメインに絞ろうとは思っているのですが、可能であれば教えていただけると助かります。

6
hiroton 2020/11/05 (木) 08:27:04 修正 b95b2@f966d >> 4

これすごいですねぇ。試してみたら確かにBグループのフッターのformatイベントでAグループのフッターの小計が取れました。Aグループのフッターのformatイベント入る前なのでどうかと思ってたんですが計算自体は終わってる上にちゃんと自分のグループの数値が取れるんですね

テストデータ

IDABn
1A1
2A10
3B1
4B10
5C100
6D1000
7D10000
8E1
9E10

レポートのグループ化の設定
グループ化:A、フッターにテキストボックス[A小計](=Sum([n]))
└グループ化:B、フッターにテキストボックス[B小計](=Sum([n]))

テストコード

Private Sub Aグループフッター_Format(Cancel As Integer, FormatCount As Integer)
    Debug.Print "AFooter", Me!A小計
End Sub

Private Sub Bグループフッター_Format(Cancel As Integer, FormatCount As Integer)
    Debug.Print Me!ID, Me!A小計, Me!B小計
End Sub

出力結果

 1             11            11 
AFooter        11 
 3             11111         11 
 5             11111         100 
 6             11111         11000 
AFooter        11111 
 8             11            11 
AFooter        11 

※未出力のフッターの集計がきちんととれてる(Me!A小計)
※レコードの参照はグループの最後のレコードっぽい(並び順指定してなかったらIDはなぜか降順に・・・)

2
nokonoko 2020/11/04 (水) 17:01:20 653a6@54883

回答ありがとうございました。
教えていただいた方法で、無事デバッグできました。(FROMの直前にスペースがありませんでした)

1

サブフォームの場合は、下記の書式で参照できます。

[Forms]![メインフォーム名]![サブフォームコントロール名].[Form]![コントロール名]

サブフォームコントロール名は下記を参照してください。

サブフォームとサブフォームコントロールの違いとは? - hatena chips

5
ポンタ 2020/11/04 (水) 15:46:28 0029a@1c915

おっしゃるとおり、「Bレベルグループの数を事前に数えておく」ところでひっかかってしまい、後回しにしていました。
いずれも教えていただき助かりました。
hiroton様、hatena様、ありがとうございました!

4
hatena 2020/11/04 (水) 14:47:46 修正

簡単に実現できる方法を思いつきました。

各グループの小計はグループフッターセクションで表示しているとします。
それぞれのグループの小計を表示しているテキストボックス名を、
A小計、B小計 とします。

Bグループのフッターセクションのフォーマット時に下記のように記述します。

Private Sub グループフッター3_Format(Cancel As Integer, FormatCount As Integer)
    Cancel = (Me.A小計 = Me.B小計)
End Sub

要は、Aグループ内のBグループ数が1件ならA小計とB小計は同じになります。同じものを表示するのは無駄だということですよね。
同じなら、Cancel を True にしてそのセクションの出力をキャンセルしてます。

グループ内で集計テキストボックスを参照するとそのグループ内での集計値が取得できますので上記のコードでうまくいきます。

もし、マイナスの集計があり、たまたまA小計とB小計が同じになる可能性かあるなら、=Count(*) で件数を表示させるテキストボックスを配置しておいてそれを比較するようにすればいいでしょう。

3
hiroton 2020/11/04 (水) 14:05:23 73b0a@f966d >> 2

グループのカウントはそんな感じですね。SQLの知識的なのは人に寄りけりってことでとりあえず回答に含めない感じでした

別案としては[page]使って事前にformat走らせて自前でカウントするなんてのも考えたんですが、レポートの印刷の都合考える必要ないんでクエリで事前に計算させとくのが楽だろうなとも

2

①枠線がきれいにいかない

枠線に関しては、私は使ってないので分かりません。
枠線が実装される前から、直線コントロールかLineメソッドで罫線は引いていたので、ずっとその方法を使ってます。
境界線で罫線を引くと横罫線の太さが違ったりしたことがあったので上記の方法をとってます。

私もhirotonさんの回答の方法にすると思いますが、Bレベルグループの数を事前に数えておくというのがちょっと難しいですね。

Aグループ、Bグループでグループ化した集計クエリ、あるいは固有の値をはいにしたクエリを作成。
そのクエリからさらにAグループでグループ化、Bグループをカウントする集計クエリを作成。
このクエリをレポートのレコードソースのクエリに追加して、Aグループのキーフィールドで結合することになりますね。

1
hiroton 2020/11/04 (水) 12:34:29 73b0a@f966d

②グループが2重にあり、小計を出しています。

Bレベルグループの数を事前に数えておいてAレベルグループのヘッダーで表示の切り替えをすればよさげ

Private Sub Aグループヘッダー_Format(Cancel As Integer, FormatCount As Integer)
    Me.Bグループフッター.Visible = Me!グループカウント <> 1
End Sub
7

承知しました。
コメント対応していただき、ありがとうございました。

6

グループコード担当者マスタの主キーはIDです。
T_TOKUの主キーは鍵マークが無いです。

2つのテーブルを結合する場合は、結合するフィールドの片方は主キー(あるいは重複なしインデックス)である必要があります。そうしないと更新できないクエリになったり、データに重複が出たりします。

「T_TOKUの主キーは鍵マークが無い」というのはデータベースの設計としては致命的な欠陥です。
テーブル設計から見直す必要があります。

提示されているフィールド名から推測するに少なくとも、
顧客マスター
グループマスター
担当者マスター
に相当するテーブルが必要になります。
あるいはそのように分割する必要があります。

このような掲示板でのやり取りで解決できる案件ではないように思います。

5

何年か前に作成し、現在は修正できる人がいません。
グループコード担当者マスタの主キーはIDです。
 T_TOKUの主キーは鍵マークが無いです。
フィールド名は
得意先CD、得意先名、担当者CD、担当者営業所CD、旧得意先CD
です。

4

ひょっとして自分で作成したものではなく、前任者が製作したものの改修作業をしているのでしょうか。
前任者に聞くのが一番早いのですが、連絡がとれないとうい状況なんでしょうか。

グループコード担当者マスタというテーブルを作成しました。

そのテーブルの主キーフィールドはなんでしょうか。

また、SQLをみると T_TOKU というテーブルがあるようですが、そのテーブル内のフィールド名と主キー設定を教えてください。

3

教えてください。
グループコード担当者マスタというテーブルを作成しました。
フィールドは
ID、グループNo、グループ名、代表営業所CD、得意先CD、得意先名、営業所名、担当者CD、担当者名を作りました。

現在利用中のクエリを見てみると、下記SQL文が記載されています。この意味と、
このSQL文に営業所名、担当者CD、担当者名を追加記述するにはどうやって書いたらいいか教えてください。
T_TOKUというテーブルのフィールドには担当者CD、T_TOKU2というテーブルのフィールドにTANCD、TANM(担当者名)があります。

SELECT
 T_TOKU.得意先CD, T_TOKU.得意先名, T_TOKU.担当営業所CD AS 営業所CD,
 IIf(IsNull([グループコード担当者マスタ]![グループNo]),[T_TOKU]![得意先CD],[グループコード担当者マスタ]![グループNo]) AS [グループCD/得意先CD],
 IIf(IsNull([グループコード担当者マスタ]![グループNo]),[T_TOKU]![得意先名],[グループコード担当者マスタ]![グループ名]) AS [グループ名/得意先名],
 T_TOKU.旧得意先CD
FROM
 T_TOKU LEFT JOIN [グループコード担当者マスタ] ON T_TOKU.得意先CD = [グループコード担当者マスタ].得意先CD
ORDER BY T_TOKU.得意先CD;

9
どんぐり 2020/11/03 (火) 23:14:01 f1ed8@73413

スミマセン。いじってたらまた正常に動くようになりました…
何回も繰り返しているので、またおかしくなるかもしれないのですが、とりあえず今日のところは解決しました😰
失礼しました…

8
どんぐり 2020/11/03 (火) 22:09:58 0029a@1c915

解決が難しい問題だとは思うのですが、ここ2ヶ月ほど悩まされており質問いたします。
上記教えていただいた「案件管理どんぐり」を参考に2つフォームを作って運用しているのですが
時々謎のエラー、「引数が無効です」に悩まされます。
色々いじってるとエラーが出なくなったり、同じ状況なのにまた出たりと
完全に謎のエラーです。2か月程ずっと色々試してきましたが、気まぐれなエラーです。

そして、「引数が無効です」と出ても結局選択値が反映されるので、まぁなんとか問題ない感じもするのですが
そのエラーのせいで、メインフォームのIDを引っ張ってこれず、また別のエラーになります。
手動でメインフォームのIDを記入すれば良いのですが、一般ユーザーにそれを求めるわけにもいかず
邪道ですっきりしないのですが、
①引数が無効ですのエラーを表示させない(on error なんとかで対応…?)
②コンボボックスを選択したら自動でメインフォームのIDを引っ張ってくる(コンボボックスの更新後処理で対応…?)
という処理をしようかと考えています・・・
でも気が重く・・・何か解決方法は思い当たりませんでしょうか。
解決方法に結び付く、確認方法などあれば何卒ご教示ください。

ちなみに「引数が無効です」エラーのことは何回も検索し、
xmlでテーブルをエクスポートしてインポートするなどは試しました。
バージョンは2016です。

なにとぞ、宜しくお願いいたします。