テキストボックス幅を広げて対応する理由をご教示下さい。
正しい抽出条件はどのように記述すればよろしいでしょうか。
新規作成でも同様の現象が発生する場合、バグかAccessそのものがうまく動作していない場合もあります。 通常は「いきなり強制終了する」などの現象ですが・・・。
一度Accessをインストールし直すか、または修復してみてはどうでしょうか。 あればアップデーターをあてるのもいいかもしれません。
hatena様 ありがとうございます。 改善いたしました。
ありがとうございます。 新規にデータベースを作って、コンボボックスを配置したらフォームフィルタでパラメータクエリのようになりませんでした。しかし、そのフィールドの配置を中央揃えにしたら同様の問題が起きました。 よって、現在は初期の配置で使用しております。 原因はわかったものの、完全な解決とは至っておりません。
""をとってみましたが、見つかりません、パラメータや別名を確認してくださいというエラーが出ました。
式1: InStr(1,[T_出力].[住所1],"[T_置換用テーブル].[置換前]",0)
"で囲んだらそれは文字列です。つまり「[T_置換用テーブル].[置換前]」という文字列と比較していることになりますね。
"
試しに住所1だけにしてみたのですが、 式1: InStr(1,[T_出力].[住所1],"[T_置換用テーブル].[置換前]",0) 抽出条件:>0にしてみたのですが、1件も抽出されませんでした。 どのように書けばよいのでしょうか?
正に実現したい機能でした。教えてくださりありがとうございました。😄
テキストボックスを広げて対応するのが普通なのですか? レコードも文字長に合わせてテキストボックスを広げるといった方法はあまり聞きません。 レポートは最大サイズが決まっていますので、どこまでもテキストボックスを広げるわけにはいきません。 そして全ページのテキストボックスではみ出していないか調べる必要がありますし、レイアウト的にも不格好になります。
何か特別な理由があるならば、提示したほうが回答がつき易いですよ?
連結テキストボックスを更新しただけでは、レコードソースのテーブルに反映されません。 レコード保存を実行する必要があります。 レコード移動で実行されます。 レコード保存コマンドを実行すればレコード移動しなくても保存されます。
Docmd.RunCommand acCmdSaveRecord
しません。
デザイン編集後に閉じる時に変更を更新するかどうかのメッセージに対して”はい”とすると 実行時エラー3709、レコードに検索キーが見つかりませんでした となります。
新しいフォームを新規作成して再現して下さい。まず、レコードソースを設定しただけで、エラーが起きるのか否か?次にオブジェクトを配置してコードを設定すると、エラーが起きるのか否か?
その後、試しに 『DoCmd.Close acForm, Me.name』としたら閉じました。一体何だったのか・・・
文字数調整じゃなくて、テキストボックスの幅で調整しないの?
hatenaさん 有り難うございます。大変分かり易く、勉強になりました。データ形式は今後注意していきます。( 念押しも忘れずに)
#で囲めば日付型になると思ってました。
この辺はなかなか複雑なので、いろいろ試しているうちに理解できるようになるでしょう。 イミディエイトウィンドウで下記のように記述して、それぞれの行でEnterキーを押してみてください。
?TypeName(#2023/11/20#) ?TypeName("#" & "2023/11/20" & "#")
前者はDate、後者はStringになります。後者は最初の質問のコードの記述と同じことですね。
VBAの決まりとして、コード中で#で囲まれた部分はDate型とみなす、"で囲まれた部分は文字列とみなす、となってます。 "#" は " で囲まれている文字列です。 これは決まりなのでそうなっていると覚えておくしかないです。
一つ教えて頂きたいのですが変数でDate型にしたら IF式には#で囲まなくても自動的にそう認識されるのでしょうか?
Date型の変数に代入する場合、Date型以外の値、例えば文字列を代入する場合、日付と判断できるものはDate型に自動で変換してくれます。(「暗黙の型変換」といいます) 数値を代入すると日付シリアル値(記述日からの経過日数)と判断してDate型に変換します。
If文内の比較式で、型が違う値同士を比較すると、「暗黙の型変換」で型を揃えて比較しようとします。 ただ、「暗黙の型変換」がプログラマーの想定通りになるとは限らないので、できれば型を揃えて比較した方が確実です。
テキストボックスの書式に日付書式を設定していれば(例えば yyyy/mm/dd)、Date型の値が返りますが、 回答のコードは念のためにCDate関数でDate型に変換して、Date型の変数と比較しています。
If CDate(Me.[入力日付]) >= kaisi And CDate(Me.[入力日付]) <= owari Then
hatenaさん有り難うございました。そのコードで上手くいきました。データ形式は重要ですね。#で囲めば日付型になると思ってました。一つ教えて頂きたいのですが変数でDate型にしたら IF式には#で囲まなくても自動的にそう認識されるのでしょうか?(CDateが重要?) すずやんさんも有り難うございました。確かにそうですね、習慣づけます。
セキュリティが発動してVBA実行がブロックされているようですね。
「セキュリティの警告」バーの「コンテンツの有効化」ボタンをクリックしてください。
hatenaさま 記事をコピーさせていただき貼り付けを行いました。 画像をアップロードさせていただきました。 ご確認よろしくお願いいたします。
ブログのページにおいてあるファイルをダウンロードしたのではなく、記事の通りに作成していったということでしょうか。
表示されないということですが、具体的にどのような状況でしょうか。 その状態のスクリーンショットをアップロードしてもらえますか。
アップロードは投稿欄の下のツールバーの「画像アップロード」ボタンのクリックすると可能です。
すずやん様 hatena様 回答ありがとうございます。 動作環境はWin11になります。 Accessのバージョンは2021になります。 F_Calendarのダウンロードファイル名とはどこの部分でしょうか。知識不足で申し訳ありません。 hatena様がご提示いただいているスケジュール管理フォームになります。その1から順にその3までを手順通り行い問題なく動作もしていました。念のために最初から作り直しをしており3度同様の症状が出ました。その際に修正などは加えてはいませんが3度目には若干の表示項目を変更してみました。 モニタも4Kではなく普通のモニタになります このような回答でよろしかったでしょうか。初心者のためしっかりとした回答になっているかわかりませんがご確認よろしくお願いいたします。
そういうときってありますよね。 とりあえず条件判断を簡単にすればいいと思います。 あと、変数内に希望の値が入っているかを確認するのも重要です。
記載のあるコードの場合、「kaisi」「owari」「Me.[入力日付] 」に本当に自分の想定している値が入っているか、を「Debug.Print」で確認してみてはどうでしょうか。
またIF文の条件を「And」でつなぐとややこしくなるので、まずは分けて記載するのが良いと思います。 うまくいけば、最終的にまとめてみてはどうでしょうか。
データ型を意識するようにしましょう。 日付の比較をしたいのなら、日付/時刻型(Date)にすべきです。 "#" & Me.[tx初期日付] & "#"は文字列(String)です。
"#" & Me.[tx初期日付] & "#"
Dim kaisi As Date, owari As Date, kaeri As Integer kaisi = Me.[tx初期日付] owari = Me.[tx最終日付] If CDate(Me.[入力日付]) >= kaisi And CDate(Me.[入力日付]) <= owari Then Exit Sub Else kaeri = MsgBox("入力日付が今期の範囲外ですが、編集続けます?", vbYesNo) End If
ちなみに、VBAコード内に直接日付を入力する場合は、# で囲むことで日付/時刻型となりますが、 "#"を前後につけたら文字列です。"で囲まれたものは文字列ですので。
a = #2023/11/17# '日付/時刻型 b = "#" & "2023/11/17" & "#" '文字列
ラベルのままで行くなら、Caption を参照するようにしてください。
=[開始].[Caption] =[終了].[Caption]
テキストボックスにしておけば Caption は必要ないです。
テキストボックスの既定のプロパティ(省略したときに採用されるプロパティ)はValueですので、省略したら下記と同じ意味になります。
=[開始].[Value] =[終了].[Value]
ラベルには既定のプロパティがないので、参照するプロパティ(Caption)を省略できません。。
=DSum("金額","T_売上","売上日 Between #" & "2023/10/1" & "# And #" & "2023/10/31" & "#")
は想定した値がでてきます。
=[開始] =[終了]
はエラーになります。 現在はコントロールボックスの更新後処理としてラベルに日付が入力されるようにしています。 ラベルではなくテキストボックスを利用すべきでしょうか。
ACCESSの比較はそういう比較なんですよね
【Access】クエリで大文字/小文字、全角/半角、ひらがな/カタカナを区別して文字列比較したい(hatena chipsさん)
全角スペースから半角スペースへの置換は問題なく行われています。 抽出条件:Like "" & [T_置換用テーブル].[置換前] & "" です。 合計で7つフィールドを並べ、OR条件で同じ抽出条件を記述しています。
恐らく全角スペースと半角スペースが区別されず、抽出条件に引っかかってしまっています。 置換自体は問題なく行えるようになったので、「置換したのにまだレコードが残っていて気持ち悪い」くらいの問題です。
置換後も、スペースを含むレコードが抽出されてしまいます。これは仕方ないことなのでしょうか?
" "(半角スペース)に変換はできていますか。 また、「スペースを含むレコードが抽出されてしまいます」とは、どのような抽出条件を設定した時の話でしょうか。
型変換エラーは出なくなりました!ありがとうございます。
もう一点質問なのですが、T_置換用テーブルの中に、置換前" "(全角スペース)、置換後" "(半角スペース)があります。 置換後も、スペースを含むレコードが抽出されてしまいます。これは仕方ないことなのでしょうか?
下記のスケジュール管理フォームでしょうか。 下記のどのバージョンのフォームを利用してますか。 また、そのサンプルからどこか修正をしてますか。
カレンダー形式のスケジュール管理フォーム作成 その1 - hatena chips
カレンダー形式のスケジュール管理フォーム作成 その2 - hatena chips
カレンダー形式のスケジュール管理フォーム作成 その3 - hatena chips
カレンダー形式のスケジュール管理フォーム作成 その4 - hatena chips
可能です。 サブ用の方は、メインの新規IDが必要になりますので、そこはDMax関数で取得することになります。
Nz関数でNullを""に変換したらどうでしょう。
レコードの更新:Replace(Nz([T_出力].[住所1],""),[T_置換用テーブル].[置換前],[T_置換用テーブル].[置換後])
Nz 関数 - Microsoft サポート
「対象のラベル」とはどのように作ったものですか? 普通のテキストボックスを指定すれば特に問題なく動作すると思いますが
たとえば、正しく入力されたと想定して日付を直接記述して試してください
は想定した値が表示されますか?
また、
は、それぞれ入力しようとした値を表示しますか?
可能ならテキストボックス内で計算の方法をとりたいです。 売上の基準日が変わる可能性もあるため同じフォーム内の対象のラベル([開始][終了])から日付を持ってきて計算するようにしたいのですが以下だとエラーになります。
=DSum("金額","T_売上","売上日 Between #" & [開始] & "# And #" & [終了] & "#")
その後データを細かくみていくと日付を変換させているフィールドで一部エラーがでており、それで集計できない状態と思ってます。その分をまず処理して様子みてみます。
コメントありがとうございます。大元テーブルの金額部(2ヶ所あり)は通貨型になっております。エラーでるクエリBのその部分の合計フィールドの書式設定されてなかったので通貨型にしましたが、やはりオーバーフローとなります。 クエリBの基であるクエリAの件数は150程でそれをグループ化(金額は合計)しているだけなのですが・・・クエリBから金額フィールドを削除しても同じです。集計(Σ)を外すとエラーでません。何かグループ化に問題あり?・・・
「オーバーフロー」と表示される場合は、大概変数に想定外の値を入れてしまった場合に発生すると思います。
ざっくりな予想で申し訳ないですが、記載内容からすると、参照する金額に今までにない桁数の金額が入ってきたのではないでしょうか。 金額とのことなので、もしテーブルの値、変数の値に「int」を使われている場合、「money」に変えることで解決するかもしれません。
取り急ぎ以下の内容を記載されるのが解決への早道になると思います。
・動作環境 ・Accessの明確なバージョン ・F_Calendarのダウンロードファイル名
また一度、新規でプロジェクトを作成しF_Calendarのみを実装してみてはいかがでしょうか。それで動く場合は作成中のプロジェクトと比較して進められると思います。
余談ですが、F_Calendarはモニタ画面の広さを取得しているのですが、4Kなどのモニタで使用した場合うまく動かない場合があるようです。 ただ一度でも動いている場合は当てはまらないかもしれません。
Accessのテーブルやクエリのデータを貼り付ける場合は下記で、Markdown書式のテーブルに変換して貼り付けてください。
Markdown Tables generator
テキストボックス幅を広げて対応する理由をご教示下さい。
正しい抽出条件はどのように記述すればよろしいでしょうか。
新規作成でも同様の現象が発生する場合、バグかAccessそのものがうまく動作していない場合もあります。
通常は「いきなり強制終了する」などの現象ですが・・・。
一度Accessをインストールし直すか、または修復してみてはどうでしょうか。
あればアップデーターをあてるのもいいかもしれません。
hatena様
ありがとうございます。
改善いたしました。
ありがとうございます。
新規にデータベースを作って、コンボボックスを配置したらフォームフィルタでパラメータクエリのようになりませんでした。しかし、そのフィールドの配置を中央揃えにしたら同様の問題が起きました。
よって、現在は初期の配置で使用しております。
原因はわかったものの、完全な解決とは至っておりません。
""をとってみましたが、見つかりません、パラメータや別名を確認してくださいというエラーが出ました。
式1: InStr(1,[T_出力].[住所1],"[T_置換用テーブル].[置換前]",0)
"
で囲んだらそれは文字列です。つまり「[T_置換用テーブル].[置換前]」という文字列と比較していることになりますね。試しに住所1だけにしてみたのですが、
式1: InStr(1,[T_出力].[住所1],"[T_置換用テーブル].[置換前]",0)
抽出条件:>0にしてみたのですが、1件も抽出されませんでした。
どのように書けばよいのでしょうか?
正に実現したい機能でした。教えてくださりありがとうございました。😄
テキストボックスを広げて対応するのが普通なのですか?
レコードも文字長に合わせてテキストボックスを広げるといった方法はあまり聞きません。
レポートは最大サイズが決まっていますので、どこまでもテキストボックスを広げるわけにはいきません。
そして全ページのテキストボックスではみ出していないか調べる必要がありますし、レイアウト的にも不格好になります。
何か特別な理由があるならば、提示したほうが回答がつき易いですよ?
連結テキストボックスを更新しただけでは、レコードソースのテーブルに反映されません。
レコード保存を実行する必要があります。
レコード移動で実行されます。
レコード保存コマンドを実行すればレコード移動しなくても保存されます。
しません。
新しいフォームを新規作成して再現して下さい。まず、レコードソースを設定しただけで、エラーが起きるのか否か?次にオブジェクトを配置してコードを設定すると、エラーが起きるのか否か?
その後、試しに 『DoCmd.Close acForm, Me.name』としたら閉じました。一体何だったのか・・・
文字数調整じゃなくて、テキストボックスの幅で調整しないの?
hatenaさん 有り難うございます。大変分かり易く、勉強になりました。データ形式は今後注意していきます。(
念押しも忘れずに)
この辺はなかなか複雑なので、いろいろ試しているうちに理解できるようになるでしょう。
イミディエイトウィンドウで下記のように記述して、それぞれの行でEnterキーを押してみてください。
前者はDate、後者はStringになります。後者は最初の質問のコードの記述と同じことですね。
VBAの決まりとして、コード中で#で囲まれた部分はDate型とみなす、"で囲まれた部分は文字列とみなす、となってます。
"#" は " で囲まれている文字列です。
これは決まりなのでそうなっていると覚えておくしかないです。
Date型の変数に代入する場合、Date型以外の値、例えば文字列を代入する場合、日付と判断できるものはDate型に自動で変換してくれます。(「暗黙の型変換」といいます)
数値を代入すると日付シリアル値(記述日からの経過日数)と判断してDate型に変換します。
If文内の比較式で、型が違う値同士を比較すると、「暗黙の型変換」で型を揃えて比較しようとします。
ただ、「暗黙の型変換」がプログラマーの想定通りになるとは限らないので、できれば型を揃えて比較した方が確実です。
テキストボックスの書式に日付書式を設定していれば(例えば yyyy/mm/dd)、Date型の値が返りますが、
回答のコードは念のためにCDate関数でDate型に変換して、Date型の変数と比較しています。
hatenaさん有り難うございました。そのコードで上手くいきました。データ形式は重要ですね。#で囲めば日付型になると思ってました。一つ教えて頂きたいのですが変数でDate型にしたら IF式には#で囲まなくても自動的にそう認識されるのでしょうか?(CDateが重要?)
すずやんさんも有り難うございました。確かにそうですね、習慣づけます。
セキュリティが発動してVBA実行がブロックされているようですね。
「セキュリティの警告」バーの「コンテンツの有効化」ボタンをクリックしてください。
hatenaさま
記事をコピーさせていただき貼り付けを行いました。
画像をアップロードさせていただきました。
ご確認よろしくお願いいたします。
ブログのページにおいてあるファイルをダウンロードしたのではなく、記事の通りに作成していったということでしょうか。
表示されないということですが、具体的にどのような状況でしょうか。
その状態のスクリーンショットをアップロードしてもらえますか。
アップロードは投稿欄の下のツールバーの「画像アップロード」ボタンのクリックすると可能です。
すずやん様 hatena様
回答ありがとうございます。
動作環境はWin11になります。
Accessのバージョンは2021になります。
F_Calendarのダウンロードファイル名とはどこの部分でしょうか。知識不足で申し訳ありません。
hatena様がご提示いただいているスケジュール管理フォームになります。その1から順にその3までを手順通り行い問題なく動作もしていました。念のために最初から作り直しをしており3度同様の症状が出ました。その際に修正などは加えてはいませんが3度目には若干の表示項目を変更してみました。
モニタも4Kではなく普通のモニタになります
このような回答でよろしかったでしょうか。初心者のためしっかりとした回答になっているかわかりませんがご確認よろしくお願いいたします。
そういうときってありますよね。
とりあえず条件判断を簡単にすればいいと思います。
あと、変数内に希望の値が入っているかを確認するのも重要です。
記載のあるコードの場合、「kaisi」「owari」「Me.[入力日付] 」に本当に自分の想定している値が入っているか、を「Debug.Print」で確認してみてはどうでしょうか。
またIF文の条件を「And」でつなぐとややこしくなるので、まずは分けて記載するのが良いと思います。
うまくいけば、最終的にまとめてみてはどうでしょうか。
データ型を意識するようにしましょう。
日付の比較をしたいのなら、日付/時刻型(Date)にすべきです。
"#" & Me.[tx初期日付] & "#"
は文字列(String)です。ちなみに、VBAコード内に直接日付を入力する場合は、# で囲むことで日付/時刻型となりますが、
"#"を前後につけたら文字列です。"で囲まれたものは文字列ですので。
ラベルのままで行くなら、Caption を参照するようにしてください。
テキストボックスにしておけば Caption は必要ないです。
テキストボックスの既定のプロパティ(省略したときに採用されるプロパティ)はValueですので、省略したら下記と同じ意味になります。
ラベルには既定のプロパティがないので、参照するプロパティ(Caption)を省略できません。。
は想定した値がでてきます。
はエラーになります。
現在はコントロールボックスの更新後処理としてラベルに日付が入力されるようにしています。
ラベルではなくテキストボックスを利用すべきでしょうか。
ACCESSの比較はそういう比較なんですよね
【Access】クエリで大文字/小文字、全角/半角、ひらがな/カタカナを区別して文字列比較したい(hatena chipsさん)
全角スペースから半角スペースへの置換は問題なく行われています。
抽出条件:Like "" & [T_置換用テーブル].[置換前] & "" です。
合計で7つフィールドを並べ、OR条件で同じ抽出条件を記述しています。
恐らく全角スペースと半角スペースが区別されず、抽出条件に引っかかってしまっています。
置換自体は問題なく行えるようになったので、「置換したのにまだレコードが残っていて気持ち悪い」くらいの問題です。
" "(半角スペース)に変換はできていますか。
また、「スペースを含むレコードが抽出されてしまいます」とは、どのような抽出条件を設定した時の話でしょうか。
型変換エラーは出なくなりました!ありがとうございます。
もう一点質問なのですが、T_置換用テーブルの中に、置換前" "(全角スペース)、置換後" "(半角スペース)があります。
置換後も、スペースを含むレコードが抽出されてしまいます。これは仕方ないことなのでしょうか?
下記のスケジュール管理フォームでしょうか。
下記のどのバージョンのフォームを利用してますか。
また、そのサンプルからどこか修正をしてますか。
カレンダー形式のスケジュール管理フォーム作成 その1 - hatena chips
カレンダー形式のスケジュール管理フォーム作成 その2 - hatena chips
カレンダー形式のスケジュール管理フォーム作成 その3 - hatena chips
カレンダー形式のスケジュール管理フォーム作成 その4 - hatena chips
可能です。
サブ用の方は、メインの新規IDが必要になりますので、そこはDMax関数で取得することになります。
Nz関数でNullを""に変換したらどうでしょう。
Nz 関数 - Microsoft サポート
「対象のラベル」とはどのように作ったものですか?
普通のテキストボックスを指定すれば特に問題なく動作すると思いますが
たとえば、正しく入力されたと想定して日付を直接記述して試してください
は想定した値が表示されますか?
また、
は、それぞれ入力しようとした値を表示しますか?
可能ならテキストボックス内で計算の方法をとりたいです。
売上の基準日が変わる可能性もあるため同じフォーム内の対象のラベル([開始][終了])から日付を持ってきて計算するようにしたいのですが以下だとエラーになります。
その後データを細かくみていくと日付を変換させているフィールドで一部エラーがでており、それで集計できない状態と思ってます。その分をまず処理して様子みてみます。
コメントありがとうございます。大元テーブルの金額部(2ヶ所あり)は通貨型になっております。エラーでるクエリBのその部分の合計フィールドの書式設定されてなかったので通貨型にしましたが、やはりオーバーフローとなります。
クエリBの基であるクエリAの件数は150程でそれをグループ化(金額は合計)しているだけなのですが・・・クエリBから金額フィールドを削除しても同じです。集計(Σ)を外すとエラーでません。何かグループ化に問題あり?・・・
「オーバーフロー」と表示される場合は、大概変数に想定外の値を入れてしまった場合に発生すると思います。
ざっくりな予想で申し訳ないですが、記載内容からすると、参照する金額に今までにない桁数の金額が入ってきたのではないでしょうか。
金額とのことなので、もしテーブルの値、変数の値に「int」を使われている場合、「money」に変えることで解決するかもしれません。
取り急ぎ以下の内容を記載されるのが解決への早道になると思います。
・動作環境
・Accessの明確なバージョン
・F_Calendarのダウンロードファイル名
また一度、新規でプロジェクトを作成しF_Calendarのみを実装してみてはいかがでしょうか。それで動く場合は作成中のプロジェクトと比較して進められると思います。
余談ですが、F_Calendarはモニタ画面の広さを取得しているのですが、4Kなどのモニタで使用した場合うまく動かない場合があるようです。
ただ一度でも動いている場合は当てはまらないかもしれません。