Microsoft Access 掲示板

views
4 フォロー
5,840 件中 1 から 40 までを表示しています。
2
驚天動地!前任者失踪丸 2024/04/19 (金) 18:25:54 23e8e@44ebd >> 1

ありがとうございます!
思った通りに動かせるようになりました。

1

cmb_2の値集合ソースのクエリ(SQL)をcmb_1の値で絞り込んだものにします。

SELECT * FROM テーブル名 WHERE 種類=[cmb_1];

これだけだとcmb_1を変更してもリストが更新されないので、フォーカス取得時に再クエリします。

'cmb_2フォーカス取得時
Private Sub cmb_2_Enter()
    Me.cmb_2.Requery
End Sub
1

このフィールドで7ケタ以上の数値がはいると指数表示となってしまうのですが、どうにか指数表示させない方法がないでしょうか?

フィールドの書式設定を「固定」にすれば指数表示にはなりません。

フィールドサイズを倍精度浮動小数点型に変更しようとしてみたのですが、メモリ不足ですとエラーになり変更できませんでした。

倍精度浮動小数点型に変更するだけで、メモリ不足とは考えにくいですね。何か他に問題がありそうです。とりあえず下記の作業を上から順に不具合が解消するまで実行してみてください。

テーブルを新規に作成しなおす。
「最適化と修復」を実行する。
新規データベースファイルを作成して、そこに現状のデータベース内のオブジェクトをすべてインポートする。

ちなみに、小数点以下桁数が2桁までいいのなら、通貨型の方がいいですね。浮動小数点数は演算誤差が発生しますが、通貨型なら誤差が発生しません。
数値型でフィールドサイズを「十進型」にしてもいいですが、あまり一般的ではありません。

このテーブルをAccessからエクスポートして利用するのですが、指数表示でエクスポートされ、他のアプリケーションで使えなくなってしまい困っています。

テキスト形式でエクスポートしているのでしょうか。
テーブルからクエリを作成して、クエリでFormat関数で書式を設定すればいいでしょう。

小数点以下桁数が2桁なら、

フィールド名: Format([テーブル名]![フィールド名],"0.00")
1

何をしたいのか不明瞭です。

まずは、下記を提示してください。

テーブルのサンプルデータ

上記データのクエリでの希望の出力結果

現状のクエリのSQL

4
驚天動地!前任者失踪丸 2024/04/11 (木) 14:20:37 23e8e@44ebd >> 3

あ、フィルターです。失礼致しました。

>=IIf([Forms]![F_納品書出力依頼]![txb_納期検索1]="","000000",[Forms]![F_納品書出力依頼]![txb_納期検索1]) And <=IIf([Forms]![F_納品書出力依頼]![txb_納期検索2]="","999999",[Forms]![F_納品書出力依頼]![txb_納期検索2])

提示頂いた抽出条件を参考に、こちらで想定通りにフィルターされるようになりました!
ありがとうございます。

3

レポートのレコードソースをフォームの非連結テキストボックスに入力した抽出条件(納期)によってソートしたいです。

ソートは並び替えという意味ですが、ご希望のことは抽出(フィルター)ということですよね。

短いテキスト型です。

抽出条件を下記のように設定すればいいでしょう。

>=IIf(Nz([Forms]![F_納品書出力依頼]![txb_納期検索1],"")="","000000",[Forms]![F_納品書出力依頼]![txb_納期検索1]) AND IIf(Nz([Forms]![F_納品書出力依頼]![txb_納期検索2],"")="","999999",[Forms]![F_納品書出力依頼]![txb_納期検索2])
2
驚天動地!前任者失踪丸 2024/04/11 (木) 12:50:37 23e8e@44ebd >> 1

短いテキスト型です。

1

納期(フィールド)のデータ型はなんですか?

4
やどかり 2024/04/10 (水) 20:35:02 ac752@85bbd

有難うございます。
単票フォームを作りたかったので、教えて頂いたサイトを参考に作成してみます。

3
驚天動地!前任者失踪丸 2024/04/10 (水) 18:24:55 23e8e@44ebd >> 2

いつも回答ありがとうございます。
Hatenaさんのサンプルと同じく左から右への印刷方向です。

提示して頂いた方法で希望通りのレイアウトになりました!
毎度ながら、テーブル構成・クエリ・フォーム・レポート、どんな質問に対しても精通していらっしゃって感服です、、、ありがとうございました。

2

サンプルを作成して確認してみたら、「左から右へ」に設定してあるときに、質問の症状が発生しました。

ご希望のことは、最後のグループフッターの後に、全体の集計を表示させたいということでしょうか。

レポートフッターでは無理のようですので、全体を一つのグループとするグループフッターを作成してそこに全体の集計を表示させるようにすればどうでしょう。

具体的な手順は、「グループ化と並べ替え」でグループを追加して、フィールドの選択で一番下の「式」をクリックします。
式ビルダーが開きますので、そこで =1 と固定値の式を設定します。これを一番上に移動して、「グループフッター付き」にします。そこに、レポートフッターにあった集計テキストボックスを移動させればいいでしょう。

1

ページ設定のレイアウトで列数を2に設定しているということですね。

「印刷方向」の設定は、
「左から右へ」か「上から下へ」かどちらになってますか。

また、現状のデータでは、1列に何行表示されていて、実際のレコード数は何件ですか。

3
hatena 2024/04/10 (水) 17:15:22 修正

訪問データを入力するフォームを作成する必要がありますが、
その場合、単票フォームでもいいですか。それとも帳票フォームがご希望ですか。

帳票フォームは少し難しいので、下記のサイトで単票フォームの場合の作成法を研究して、まずは単票フォームを作成してみてください。

ACCESS コンボボックスの絞り込みをする方法 - たすけてACCESS

それができてから、帳票フォームに取り組むのがいいと思います。

2
驚天動地!前任者失踪丸 2024/04/10 (水) 16:34:21 23e8e@44ebd >> 1

回答ありがとうございます、自己解決できました。
T_出力の各フィールドのNullをNzで""にしたらクエリを実行しても警告がでなくなりました。

2
やどかり 2024/04/10 (水) 16:02:16 ac752@85bbd

回答ありがとうございます。
テーブルのルックアップでは無理なんですね。
ルックアップ設定は以下になります。

顧客テーブルの企業ID
値集合ソース
    SELECT [T_企業マスタ].[企業ID], [T_企業マスタ].[企業名] FROM T_企業マスタ ORDER BY [企業名];
連結列
    1
列数
    2
列幅
    0cm;2.54cm

訪問テーブルの企業ID
値集合ソース
    SELECT [T_企業マスタ].[企業ID], [T_企業マスタ].[企業名] FROM T_企業マスタ ORDER BY [企業名];
連結列
    1
列数
    2
列幅
    0cm;4.604cm

1

テーブルのルックアップ機能では無理ですね。

テーブルからフォームを作成して、
VBAでコンボボックスのリストのデータを制御することになります。

どちらにしても、Accessでは入力作業は、テーブルでするものではなく、フォームでするのが基本です。
フォームならいろいろな制御ができるので、安全かつ高機能なUIを構築できます。

まずは、現状のテーブルのルックアップの下記の設定を教えてもらえますか。

値集合ソース
連結列
列数
列幅

12

「ウィザード」機能は、初心者にとっては、質問に答えていくだけで、それなりの結果を得られるので、便利なんですが、設定の意味を理解しなくてもできるので、スキルアップの障害になりかねないですね。
また、今回のように想定外のことが起こったり、一部修正しようとしたときに、何をしたらよいかわからないということになります。

ある程度スキルがあるのなら、とりあえず「ウィザード」でひな形をさっと作成して、あとはお好みで修正しながら仕上げるという使い方ができますけどね。

11
hiroton 2024/04/10 (水) 10:29:59 0799a@f966d >> 8

そんな機能あるんですねぇ。そして、運用を考えたら今回の問題が起こるような使い難い機能だと・・・

10

クエリの設定がお書きいただいた様に「日でグループ化: Format$…」となっていました。

最終的は表示場所の設定でOKなんですね。それぞれ指定をしていました。とても勉強になりました。
詳しく説明いただきありがとうございました。

1
hiroton 2024/04/10 (水) 10:16:28 0799a@f966d

ぱっと見ですが、

「T_住所1分割」の「住所1前半」「住所1後半」フィールドの値要求プロパティと空文字の許可プロパティはどうなっていますか?
これに対して、

IIf(InStr([住所1]," ")=0,[住所1],Left([住所1],InStr([住所1]," ")-1)) AS 住所1前半
IIf(InStr([住所1]," ")=0,"",Mid([住所1],InStr([住所1]," ")+1)) AS 住所1後半

これらの計算結果はどのような結果が取られますか?

各プロパティの設定によって、そのフィールドに「Nullは使えない」「空文字("")は使えない」のような制限がかかります。それらのフィールドに使えない値を入れようとすると問題の警告が表示されます

9
hiroton 2024/04/10 (水) 09:48:29 0799a@f966d

書式は最終的な表示の仕方を決めるものです。最終的な表示場所(今回の場合はレポート)で設定すれば十分です
ただ、同じデータをフォームで表示したい・レポートで表示したいなど複数用いることもあります。その場合、デフォルトの書式としてレコードソースの書式を用いるので、テーブルで書式を設定しておけば、基本的にその書式で表示する(後から変更もできる)という使い方もできます

既に指摘していますが、「書式をyyyy年mm月dd日として」いて、「『2024年3月1日』と表示されているのはおかしい」です。どこかで書式を使った何かが間違っています

画像から見える限りでは、一枚目の画像のクエリの最初のフィールド「入金日を日付でグルー」が怪しいです


ここまで記述してたら回答付いたので以下略

8

おそらくクエリをウィザードで作成したのですね。
そのときに、「日付をグループ化する単位を選択してください。」で「日」を選択したのでしょう。
そうすると、日付は下記のような演算フィールドになります。

開始日 を日でグループ化: Format$([Mtbl_所属歴].[開始日],'日付 (L)')

Format関数で標準の日付書式にしてますので、テーブルでの書式は無視されますね。
Format関数の返り値は文字列ですので、文字列としての並び順になりますのでそのような結果になります。

このフィールドの式を削除して、「開始日」にすれば日付順になるでしょう。


私としては、レポートの並び順は、レポートの方で「並べ替え」プロパティ、「グループ化と並べ替え」を設定してなければ、レコードソースの並び順になると認識してました。

優先度の高い順
「グループ化と並べ替え」
「並べ替え」プロパティ
レコードソースの並び順
(クエリの並び替え設定、テーブルのインデックス設定)

しかし、レポートの方で「並べ替え」なり、「グループ化と並べ替え」で並び順を指定した方が確実ですね。

7

新しくクエリを作り直してみたのですが、日付順に並びました。
色々と教えていただき、ありがとうございました。

6

画像1
画像1
テーブルのデザインです。 テーブルだと2024年03月01日となっています。

もともとはExcelデータをインポートしてテーブルにしていて、「入金日」を列に加えて
「日付」データを参照して入力をして使っています。
(「日付」を使いたいのですが、データ型を「日付/時刻型」にするとデータを消えてしまったので、
新たに列を作りました。)
書式の指定は必要ないのでしょうか。

5
hiroton 2024/04/10 (水) 09:12:19 0799a@f966d

「レポートでも」というよりは「レポートの指定のみ」が反映されます。レポート上で並び順を指定しなかった場合の並びは不定です

クエリ上での確認は、単にレポート上で並び順を指定した場合に、求めた並び順になるかどうかの確認です
画像を見る限りそうではないようですね

データが正しく日付型データで保存されているのであれば日付順に正しく並びます

データ型を「日付/時刻型」に設定し、書式をyyyy年mm月dd日としています。

型を指定しているだけで、正しいデータが保存されていないか、書式の設定の仕方が間違っています

特に「書式をyyyy年mm月dd日」と設定しているのにも関わらず「2024年3月1日」と表示されているのはおかしいですね。「mm」や「dd」としているので、0を詰めて2桁で表示(2024年03月01日)されていないとおかしいです
書式が適用できず、元のデータをそのまま表示しているのでしょう

大元のテーブルのフィールドは「日付/時刻型」になっていますか?また、そのフィールドの書式を変更する(書式なしにする)と、きちんと望んだ日付のデータが保存されていますか?

4

画像1
画像2

クエリでの指定とその結果になります。
レポートで並び替えたい場合は、レポートでも日付のところで昇順の指定をしないといけないという事でしょうか。

3
hiroton 2024/04/10 (水) 08:42:28 0799a@f966d

そのクエリを直接表示した場合は指定の並び順になっていますか?
また、レポートでの並びは、レポート上で並び順の指定が必要です

レポートの既定の並べ替え順序を定義する

2

ご回答ありがとうございます。
データ型を「日付/時刻型」に設定し、書式をyyyy年mm月dd日としています。
日付フィールドでの並び替えはクエリで「昇順」に設定していますが、1日から並びませんでした。
設定方法など間違っているでしょうか。 宜しくお願いいたします。

1

日付フィールドのデータ型は日付/時刻型になってますか。
日付フィールドで並び替えを設定していますか。

4
驚天動地!前任者失踪丸 2024/04/09 (火) 10:06:42 23e8e@44ebd >> 3

原因究明は地道にやるしかないのですね・・・

Recalc、Refresh等を追記したところ、正常に表示されるようになりました!
ありがとうございます。

3

これが何かしらCurrentRecordの値取得に影響を及ぼしている可能性はありますか?

私の作成したサンプルにそのコードを追加しても、問題なく動作します。

問題のフォームと同じテーブルをレコードソースとするシンプルなフォームを作成して、
質問のテキストボックスとコマンドボタンを配置して、症状がでるか確認してみてください。

そこから、問題のフォームと同じになるように一つずつプロパティ設定やコードを追加していって、その都度、動作確認して、症状が発生する直前に変更、追加したものが、原因ということになります。

面倒ですが、原因追及するにはそのぐらいしかないでしょう。

ちなみに、前回の回答で提案した方法は2つとも効果がありませんでしたか。

2
驚天動地!前任者失踪丸 2024/04/08 (月) 13:47:30 23e8e@44ebd >> 1

回答ありがとうございます。
私も簡素なサンプルを作成してみましたが、正常に値を表示できました。

フォームのレコード移動時イベントで、新規レコードなら次レコードボタン(+いくつかのテキストボックス 下記コードでは省略)を使用不可にするコードを書いています。


Private Sub Form_Current()

    If Me.NewRecord = True Then '新規レコードの場合はテキストボックスを操作不可にする

        [btn_次レコード].Enabled = False

    Else

        [btn_次レコード].Enabled = True

    End If

End Sub

これが何かしらCurrentRecordの値取得に影響を及ぼしている可能性はありますか?

1

当方でシンプルなサンプルを作成して確認してましたが、症状は確認できませんでした。
コマンドボタンで移動するごとに正しいレコード番号か表示されます。

コントロールの再計算のタイミングがずれている感じですね。
下記のように移動後に再計算させるとで改善されないですか。

    DoCmd.GoToRecord , , acNext
    Me.Recalc
    Me!txb_何件中何件目.Requery

あるいは、コントロールソースは空欄にしておいて、レコード移動時で代入するとか。

Private Sub Form_Current()
    If Me.NewRecord Then
        Me.txb_何件中何件目.Value = Me.CurrentRecord & "/" & Me.Recordset.RecordCount + 1
    Else
        Me.txb_何件中何件目.Value = Me.CurrentRecord & "/" & Me.Recordset.RecordCount
    End If
End Sub
2

画像の解像度が低いので詳細が読み取れないので推測ですが、ご希望のことは下記のようなことでしょうか。

画像の左は集計クエリで縦に並んでいる。
それをクロス集計クエリで画像の右のように横に展開するようにする。
年月フィールドが毎年変わるので、それをレポートにする場合、作り直しになるのを、なんとかしたい。

だとしたら、下記のリンク先が参考になると思います。フォームになってますが、レポートでもそのまま応用できます。

列名が変化するクロス集計クエリと連結するフォーム - hatena chips

1

毎月のデータは勤怠システムからCSV出力して、リンクテーブルと更新クエリ、クロス集計で左の画像まで出来たのですが、ここからレポートを作成する時に今あるデータでレポートのレイアウトを作成し、翌月には新しいフィールドが追加されるので、またレポートのレイアウトという感じになってしまいます。

このような大雑把な説明では、回答しづらいです。

まず、勤怠システムから出力されるCSVのフォーマットを説明してください。
数行のサンプルを提示してもらえるとなおいいです。氏名などの情報はマスキングしておいてください。

それをアクセスのテーブルに取り込むことになると思いますが、現状のテーブルのフィールド構成を提示してください。

「翌月には新しいフィールドが追加されるので、」とのことですが、データベースではこのような設計にはしないので、テーブル設計から変更する必要があると思われます。

やりたいこととしては、最初に右の表を作成しておき、条件が一致(月が一致したら)したその月の時間が入力されるというような処理がしたいです。

「その月の時間が入力される」とは具体的にどのようなことでしょうか。
条件はどこから取得するのかとか、どのようなデータをどこに入力するのかとか、あいまいすぎてイメージが湧きません。

まずは、CSVデータと、現状のテーブル設計の説明をお願いします。

1
驚天動地!前任者失踪丸 2024/04/05 (金) 11:48:26 23e8e@44ebd

すみません、自己解決できました。

Like "* *" And Not Like "*[A-Z]*"

ですね。

7
はづき 2024/04/04 (木) 20:21:04 7475b@267c5

SQLで大分改善はしました。が、ちょっと待ち時間がストレスに感じるくらいです。

hatenaさまにいただいた、DAOでループ処理する方法でゆきたいと思います。
コードを一見して動きは理解できました。

rs.MovePreviousで1レコード前に戻るというのもできるのですね。

考えつきもしませんでした、勉強になりました。

9
hiroton 2024/04/04 (木) 19:26:39 c3230@f966d

何かを参照する場合は、「コードの実行場所」と「コードの実行場所から見た操作したい相手の場所」を常に意識することが大事です。

すべて無視して、ACCESS本体から見た「Forms!~」という記述も可能ですが、hatenaさん指摘のように、「コードの実行場所自身=>Me」や、「サブフォームからみた親フォーム=>Me.Parent」、「親フォームから見たサブフォーム=>Me![サブフォーム名].Form」等の参照方法を覚えるとコードが簡素に記述できます

また、参照に用いる場合の[]使い方も覚えましょう。これは、基本的に「名前」を指定するときに用いる記号です。ACCESS本体が持つ機能(キーワード)に使うことはできません

たとえば、「天候」を保存するために用意したフィールド「suitei_tenko」を指定する場合に、[suitei_tenko]等記述します。「フォームに読み込んだそれを参照する」なら

Debug.Print Me![suitei_tenko]

のようになります

通常「Me」とは、コードを実行したオブジェクトを参照するキーワードで何かの名前ではありません。[Me]と記述した場合、「Me」と名前を付けた何か(フィールドとか、テキストボックスとか)を参照する記述となります。そのような「何か」が無ければ参照先が見つからないというエラーが発生します

また、[]は省略可能な記述で、ACCESS上(フォームやレポート等)で記述すると自動で付加されますが、VBAで記述する場合は、なるべく省略したほうがコードがすっきりします
「省略できない場合」もあるので、より深い知識が必要になったら調べてみると良いでしょう

8
hiroton 2024/04/04 (木) 18:49:44 c3230@f966d

あぁ、コードがめちゃくちゃでしたね。ごめんなさい
hatenaさんが正しいコード例を提示してくださっているのでそちらを参考にしてください

クエリを使うか、レコードセットを操作するかについては、フォームに読み込んだレコードを操作するのであれば、圧倒的にDAOによるレコードセットの操作のほうが楽だと思います

開いたフォームがすでにレコードセットを開いているので、よくあるレコードセットを扱うための魔法の言葉が不要で、Withステートメントの活用により余計な変数も不要になるので


フォームのレコードセットを操作する方法はいくつかあります。(hirotonの回答がめちゃくちゃなのも、これらを適当に組み合わせてしまっているからです)

DoCmdによるフォームの操作

If Me.CurrentRecord < 1 Then Exit Sub
DoCmd.GoToRecord , , acLast
Do Until Me.CurrentRecord = 1
    Me!suitei_tenko = Me!コンボ351
    DoCmd.GoToRecord , , acPrevious
Loop
Me!suitei_tenko = Me!コンボ351

ACCESSの機能を使ってフォームを見たまま操作する例です。見たまま、レコードを移動させながら操作するので、suitei_tenkoもMeからの参照で現在のカレントレコードのフィールドの値を修正します
レコードセットの操作と異なり、レコードが無い場合の操作を行うとエラーが発生するので、それようの対策が必要です
「マクロ」で作る場合の理論をそのままVBAでコードにするとこんな感じでしょう

Me.Recordsetを操作

With Me.Recordset
    .MoveFirst
    Do Until .EOF
        .Edit
        !suitei_tenko = Me!コンボ351
        .Update
        .MoveNext
    Loop
End With
With Me.Recordset
    .MoveFirst
    Do Until .EOF
        Me!suitei_tenko = Me!コンボ351
        .MoveNext
    Loop
End With

表示しているフォームそのもののレコードを扱います。レコードセットのレコードを移動させると、フォーム上のレコードも移動するので、レコードの移動だけレコードセットを操作して、レコードの編集はフォーム上のコントロールを操作するとかいう訳の分からないコードを組むこともできます。(コードが短くなるだけで大したメリットはない)

Me.RecordsetCloneを操作

With Me.RecordsetClone
    .MoveFirst
    Do Until .EOF
        .Edit
        !suitei_tenko = Me!コンボ351
        .Update
        .MoveNext
    Loop
End With

フォームに読み込まれているレコードセットを直接操作します。ただし、表示中のレコードは移動しません。Meによる参照と、レコードセットからの参照で、参照しているレコードを別々に持つことになります

Me.Recordset.Cloneを操作
(コードは省略)
全く同じレコードセットを新しく生成します
新規でレコードセットが生成されるので、常にレコードセットの先頭にカーソルがある状態のレコードセットになります。(DoCmd.GoToRecordMoveFirstのような、全件を操作するための準備がいらない)
新規でレコードセットを生成しているので、閉じる処理(Close)が必要
フォームとは関係ないレコードセットを操作するので、フォームに反映させる処理(recalc/refresh/requery)が必要

6

履歴データなので基本的には消せないのですが、
ワークテーブルを使って削除するか、もしくはフラグを立てて読み飛ばすかということを
したいなと。いずれにしても更新を想定しています。

データベースなので履歴データは基本は削除しない運用が望ましいですね。
ワークテーブルを使うのなら、上記の集計クエリを含むクエリを追加クエリにして追加すればすみます。

フラグフィールドを追加してそれを更新するなら、EXISTSサブクエリを使用した更新クエリにすることになりますが、
自分がするなら、前回の質問でも回答しましたが、VBAでレコードセットを回して更新する方法をとります。

Public Sub SetFlag()
    Dim rs As DAO.Recordset
    Dim strSQL As String
    Dim pre社員No
 
    CurrentDb.Execute "UPDATE Mtbl_所属歴 SET flg削除 = False WHERE flg削除 = =True;"
    
    strSQL = "SELECT * FROM Mtbl_所属歴 ORDER BY 社員No, 開始日, 終了日;" 
    Set rs = CurrentDb.OpenRecordset(strSQL, dbOpenDynaset, dbFailOnError) 
    Do Until rs.EOF
        If pre社員No <> rs!社員No Then
            pre社員No = rs!社員No
            rs.Edit
            rs!flg削除 = True
            rs.Update
            rs.MovePrevious
            rs.Edit
            rs!flg削除 = True
            rs.Update
            rs.MoveNext
        ElseIf 特定の名称が含まれる Then
            rs.Edit
            rs!flg削除 = True
            rs.Update
        End If 
        rs.MoveNext
    Loop 
    rs.Close
    Set rs = Nothing
 
    MsgBox "完了"
End Sub

SQLでいくか、VBAでいくかは、得意不得意があると思いますので、好みでいいと思います。