ありがとうございます!! その形で進めようと思います。 まだ、更新クエリ、追加クエリをささっと作成できる技量がないので、勉強しながらやってみようと思います。 追加のアドバイスもありがとうございます。 また、行き詰まったらお邪魔するかもしれませんが頑張ってみます。
上の回答の追記の方法でどうでしょう。
更新クエリは、インポートしたテーブルとT_商品リストを「商品番号」で結合したクエリにするといいでしょう。
あるいは、下記のようにしてもいいでしょう。
エクセルのテーブルをAccessにインポートする。 更新クエリでインポートしたテーブルの「商品番号」を「商品ID」に変換する。 このテーブルを追加クエリで「T_在庫管理表」に追加する。
「Q_在庫管理表」に取り込むという考え方ではなく「T_在庫管理表」にデータを取り込むという考え方にすべきでしょう。
ご教示ありがとうございます。関係性をよく理解しておらず、おっしゃる通り商品リストを更新してしまったりでうまくいっていませんでした。
いったん、エクセルに落とし込むなら、エクセルの方で「商品番号」を「商品ID」に変換するのが簡単そうですが、それではだめでしょうか。
その場合は、Accessの商品リストをエクセルにエクスポートしてから利用するということであっていますか? 日々大量の商品をAccessのT_商品リストに登録していく事になるのでちょっと不安があるのですが、、、。
ご希望の処理の流れは下記になると思います。
バーコードスキャナアプリで「商品番号」を読み込む。CSVファイルとして保存される。 ↓ エクセルファイルにテーブルとして読み込む。 ↓ これをAccessのテーブルに取り込む。
「Q_在庫管理表」に取り込むという考え方ではなく「T_在庫管理表」にデータを取り込むという考え方にすべきでしょう。 「Q_在庫管理表」にコピペしたとしても、データが最終的に追加されるのは「T_在庫管理表」ですので。 「Q_在庫管理表」には「T_商品」などのマスターテーブルのフィールドも表示されていますが、これらのフィールドは更新してはだめなので。
「T_在庫管理表」には「商品番号」や「商品名」などのフィールドはないはずですので、外部キーである「商品ID」を入力する必要があります。
早速のお返事ありがとうございます。
Q_在庫管理表
SELECT T_在庫管理表.取扱日, T_在庫管理表.入庫ID, T_在庫管理表.勘定科目, T_勘定科目.勘定科目, T_在庫管理表.仕入先ID, T_仕入先.仕入先名, T_在庫管理表.商品名ID, T_商品リスト.商品名, T_メーカー名.[メーカー名], T_商品リスト.[メーカー名], T_商品リスト.品番, T_在庫管理表.単価, T_在庫管理表.入個数, T_在庫管理表.出庫数, T_在庫管理表.合計金額, T_在庫管理表.受注ID, T_受注.顧客ID, T_顧客情報.[お名前], T_在庫管理表.備考 FROM T_顧客情報 INNER JOIN ((T_メーカー名 INNER JOIN (T_商品リスト INNER JOIN (T_仕入先 RIGHT JOIN (T_勘定科目 INNER JOIN T_在庫管理表 ON T_勘定科目.勘定科目ID = T_在庫管理表.勘定科目) ON T_仕入先.仕入先ID = T_在庫管理表.仕入先ID) ON T_商品リスト.商品名ID = T_在庫管理表.商品名ID) ON T_メーカー名.[メーカー名ID] = T_商品リスト.[メーカー名]) INNER JOIN T_受注 ON T_在庫管理表.受注ID = T_受注.受注ID) ON T_顧客情報.顧客ID = T_受注.顧客ID ORDER BY T_在庫管理表.取扱日, T_在庫管理表.入庫ID;
現実にはこのようになっています。 見ようみまね作成しているので無駄な部分やおかしな所があるかもしれませんが、、。
F_在庫管理表フォームも作成してあり、通常はそちらから手作業で入力していたのですが、バーコードスキャナアプリのデータで入力できないかと思考錯誤している段階で、
複数の【品番】をアプリで読み取りcsv形式でパソコンに保存 ↓ Q_在庫管理表と同じ形のEXCELのテーブルに落とし込み ↓ Q_在庫管理表に追加でコピペ
これでできないだろうかと思っての質問でした。
データをエクセルに格納するなら、エクセルで直接読み取ればいいと思いますが。
ごめんなさいどのようにすればいいのかわからないです。
よろしくお願いいたします。
Q_在庫管理表 のSQLを提示してもらえますか。
バーコードスキャナアプリで【商品番号】を読み取り、EXCElかcsv形式で一括で登録したいと考えている途中です。
EXCEL と Access の連携はどのように考えているのでしょうか。 データをエクセルに格納するなら、エクセルで直接読み取ればいいと思いますが。
「直接」は難しいと思います ただ、左の数字は
'現在先頭に表示されているレコード番号を取得 topRecNum = curRecNum - (Int(curTop / Me.Section("詳細").Height) - headerHeight)
で取得可能。右の数字はレコード総数なので
スクロールバーに表示される文字列 = "レコード: " & topRecNum & " / " & Me.Recordset.RecordCount
とすれば同じ内容になると思いますが、これではまずいですか?
hiroton 様 大変申し訳ございません。上記の方法を不完全な状態で試しておりました。 (curTop = Me.CurrentSectionTop が抜けていました)
ちゃんとした方法で行ったところ、うまくいきました。
ちなみにスクロールバーの値はやはり取得するのは難しいものでしょうか…?
お世話になっております。上述のExitイベントで未入力に加えて、入力規則にのっとっているか判別(桁数のチェック)を行えるようにしました。 正しく動いているんですが、不正な状態のままレコードを削除したく、困っています。 フォーム上に削除ボタンを作り、 DoCmd.RunCommand acCmdDeleteRecord で削除していますが、不正な入力状態のまま削除ボタンを押すと、先に上述のEXITイベントが発動して、削除ボタンを受け付けてくれません。
回避方法を模索しているんですが、どうしてよいかわかりません。特定のイベントの時だけこのEXITイベントをキャンセルする、というようなテクニックはないでしょうか?
hiroton 様 度々のご返信ありがとうございます。 ただ申し訳ございません、求めているものとは少し違っておりました。
上記の方法で試したところ、たしかにレコードは同じ位置になるのですが、表示位置が一番上にきてしまいます。
スクロールバーの値さえ取得すれば、GoToPageを使用して実行後も同じスクロールバーの位置(画像でいうと6が一番上の位置)にできるのではないかと思い、悩んでおります。
うまく伝えられず申し訳ございません。よろしくお願い致します。
このプロパティで調べて(Web検索して)みてください 【Access】帳票フォームでRequeryを行ってもレコードの表示位置が変わらないようにする(ほそぼそプログラミング日記さん)
hiroton様 ご返信ありがとうございます。 CurrentSectionTop は試しましたが、うまくいきませんでした…
スクロールバーを一番上にして、レコードを1に合わせた状態で値を取得すると450 スクロールバーを一番上にして、レコードを13に合わせた状態で値を取得すると5130 となります。
希望は、どのレコードにいてもスクロールバーが同じ位置なら、同じ値が欲しいのです。 (画像で言うとスクロールバーが一番上なので「1」の値が欲しい)
お手数をおかけしますが、よろしくお願い致します。
スクロールバーの「位置」を知ることができるプロパティがあります Form.CurrentSectionTop プロパティ (Access) このプロパティで調べてみてください
回答ありがとうございます。 実際に利用しています。
コードをコピペしてデバッグ→コンパイルをしたらエラーになりました それは実際に使っているコードですか?
#エラーになるフィールドに設定してある式に問題があるのでしょうね。 その式を提示するとか、もう少し情報を提供ください。
一例として、下記のような感じでご希望のことは実現できますね。
オプショングループ内に12個のオプションボタンを配置して、オプションボタンのオプション値をそれぞれ 1~12 に設定。 クエリの月の抽出条件にオプショングループ名を設定。これをサブフォームのレコードソースに設定。 オプショングループの更新後処理でサブフォームを再クエリする。
https://teratail.com/questions/nq21aq7i1dpihk https://support.microsoft.com/ja-jp/office/フォームまたはレポートのグラフを作成する-1a463106-65d0-4dbb-9d66-4ecb737ea7f7
とりあえず、基本的なことから Accessフォームでフィルターを使って特定のレコードのみ表示する方法(工場エンジニアのAccessスキルさん) レコードの抽出(基礎編)(cbcnet.さん)
もう少し実用的に 複数条件の抽出フォームの設計 その1(hatena chipsさん)
見た目が変わらない(データだけが変わる)ならタブコントロールの必要性は薄いです。むしろタブの数だけサブフォームを用意する必要があるので余計に手間 (見た目だけどうしてもタブを使いたいということならタブの中にはコントロールを配置しないという方法もありますが)
ひとまずリンクを参考にベースとなるフォームを作成しましょう そのうえで、もっと具体的な内容を添えて質問しましょう
タブコントロールの各ページにサブフォームを配置しているということでしょうか。
現状、どこまでできているのでしょうか。現在の状況を詳しく提示してもらえれば、そこからの改善点をアドバイスできると思います。
サブフォームのレコードソースのテーブルのフィールド構成も提示してください。 また、メインフォームは非連結フォームですか。
コンボボックスの名前は「サイトID」で間違いないですか。
自動で[]が付くのは自動補完機能なので問題ないです。コンボボックス名に間違いがなければ、
=サイトID.Column(1) と設定すれば、 =[サイトID].Column と補完してくれます。
沢山のお返事ありがとうございます。 情報が私にとっては難解で、なかなかお返事が 出来なくてすみません。
今日、ちょっと分かったところが あったので、動きました。
hatenaさんの =サイトID.Column(1) =サイトID.Column(2)
をちょっと試してみたところ、 「#Name?」と表示されました。 後入力した値が自動的に改変され 「=[サイトID].Column」
となりました。 宜しく御指南していただけましたら幸いです。
りんごさんもありがとうございます。
いつもありがとうございます。できました! 丁寧にご説明頂き助かります!
まず、前回の回答の訂正から。 前回の回答でテキストボックスと書いていましたが、ラベルの間違いです。ラベルと置き換えて読んでください。
さて、本題です。 一つのラベル内のテキストの色(前景色)を部分的に変えることはできません。 行毎に変えたいなら、行数分のラベルに分割することになりますね。
hatena様
ご指導ありがとうございます。ヒントを頂き、色付けできました。Withよく理解できました。 初心者で申し訳ございませんでした。
しかし、この方法ですと予定の案件がすべて色が変わってしまいました。考えてみれば当たり前でした。 これを一案件毎に条件毎に色を変えるのはむつかしいでしょうか?
調べて勉強しようとは思いますが、何かとっかかりのヒントを頂ければ幸いです。
なるほど、やはりそうですよね。。。Accessを勉強し始めた頃、将来データ量が増えすぎることを恐れて、カテゴリのちがうDBをそれぞれに分けて作ってしまったんですが、それがそもそもの間違いだったんですね。 統合するとシステム全体を見直さないといけないので、時間がかかりますがコツコツやってみます。
いつも本当に勉強になります。ありがとうございます!
テーブルでのプロパティ設定のみですので、VBAでコード書くよりよほどハードルは低いと思いますので、とりあえずチャレンジしてみてください。
まったく同じフィールドを持っているテーブルを分けるのはデータベース的にはNGな設計になります。一つのテーブルにまとめるべきです。
例えば、A-1とA-2が全く同じフィールドなら、一つのテーブルにして、2つを識別するフィールドを追加します。 A-1とA-2の主キーが重複するなら、識別フィールドと現状の主キーの複合主キーにします。 B-1、B-2、B-3、B-4に関しても同様に一つのテーブルにまとめます。
そうすれば、クエリは一つですみます。あとは、それぞれの識別フィールドに抽出条件を設定すれば希望のデータを取り出せます。 レポートなら開くときにOpenReportメソッドの引数で抽出条件を設定することができます。
ありがとうございます。 まだまだ勉強中の私にはハードルが高そうすが、チャレンジしてみます。 いつもありがとうございます。本当に勉強になります。
>> 3 凄いです。正直、使い道がないプロパティと思っていました。
よく見たら、ラベルでしたね。ラベルの中身をカラフルに、色やフォントを変える文字列関数ってありましたっけ、誰かフォローして下さい。 視認性に拘るなら、略のラベルと氏名のラベルを同じように用意して最初から作りましょう。 視認性よりも可読性・保守性が大事だと思います。明日、明後日、来週、来月、来年、5年、10年後に見たときに、パッと理解・説明出来ないなら無意味ですよ。
Exitイベントでの入力チェックは完全ではありません。 例えば、先頭のテキストボックスから順に移動しながら入力してくれればいいですが、マウスで別のテキストボックスをクリックして、そのテキストボックスをとばした場合はチェックができません。 分割フォームでもフォーカス移動関係は複雑になるので、うまくいかないこともあるでしょう。
入力チェックを確実にするならやはりテーブルの方で設定するのがいいと思います。 エラーメッセージを希望のものにしたいなら、 テーブルやフィールドの「入力規則」プロパティと「エラーメッセージ」プロパティを使って入力チェックするといいでしょう。
入力必須にしたいフィールドがテキスト型なら、 そのフィールドプロパティを下記のように設定します。
以上でテーブルレベルで入力必須にできます。
ForeColorというのは「前景色」プロパティです。「前景色」プロパティはテキストボックスのプロパティです。
rs!略 & rs!氏名 は、レコードセットの「略」フィールド、「氏名」フィールドに入っているデータです。 Me(rs!略 & rs!氏名) としたら、そのデータと同じ名前のテキストボックスを探すことになりますが、そのような名前のテキストボックスはないですよね。
rs!略 & rs!氏名
Me(rs!略 & rs!氏名)
まずは、それぞれのコードの意味を理解するように努力してください。最初は難しいと思いますが、それをしないとスキルアップはしません。
とりあえず、 With Me("T" & rs!日付 - FirstDay) の部分でテキストボックスを指定しています。
With Me("T" & rs!日付 - FirstDay)
Withの意味も調べてみてください。
With
ちら見回答であれですが、上手く出来ないなら、2つに分ければいいんじゃない。略の前景色は、ほにゃらら、氏名の前景色は、ほにゃらら、みたいに。
文字色がレコードに保存されているならリッチテキスト形式を使うと楽ができるかもしれません
標準モジュールに次の関数を追加する(※)
'R+G*256+B*256*256の値をカラーコード表記に変換する Function getColorCode_D2H(decimalValue As Long) Dim HexString As String HexString = Right("000000" & Hex(decimalValue), 6) '並び順がBGRなので順番を変えてカラーコード表記にする getColorCode_D2H = "#" & Right(HexString, 2) & Mid(HexString, 3, 2) & Left(HexString, 2) End Function
新たにテキストボックスを設置する
コントロールソース: ="<font color=""" & getColorCode_D2H([文字色]) & """>" & [項目] & "</font>" 文字書式:リッチ テキスト形式
このテキストボックスは編集できないので、編集が必要なら元のテキストボックスにぴったり重ね合わせて(前面配置にする)フォーカス取得時にMe!項目.setFocusとかしてあげる必要があります
Me!項目.setFocus
(※)単純な計算なので関数を使わず直接コントロールソースで計算させることもできます
="<font color=""#" & Right(Hex([文字色]+256),2) & Mid(Hex([文字色]+16777216),4,2) & Mid(Hex([文字色]+16777216),2,2) & """>" & [項目] & "</font>"
当方、Access2016で同じエラー解決しました。 条件付き書式のスペースを消すとエラーが出なくなりませんか。 NG: "[文字色] = " & Rs!文字色 OK: "[文字色]=" & Rs!文字色 これは以下2点において、Access2016のバグと言っていいと思います。 ・条件付き書式の解析の問題 ・エラー内容とメッセージが違う問題
ありがとうございます。できました。 もうひとつご相談です。対象のフォームが分割フォームで作成されているのですが、新規レコードのフィールドAに入力しないまま、データシートビューで別のレコードをクリックすると、フォーカスは教えて頂いたVBAでそこから移動しないのですが、単票フォームはクリックしたレコードに移ってしまいます。それも抑止する方法はないでしょうか?
何度もすみません。
hatena様 お手数をおかけいたします。 If rs!略.Value = "関" Then はデバッグできましたが、 Me(rs!略 & rs!氏名).ForeColor がエラーになりました。 Meを外したり、rs!略だけにしても同じです。
色を変えたいのは表示させている 時間と略と氏名の一行、一行を略の選択によって色を変えたいです。
ランダムな日付を昇順に並び替えてデータベースに登録したい
日付の登録が済んだら、次は日付別の何かを登録するんじゃないかと予想します。 最終的に、このデータベースを使ってどんな事がやりたいのでしょう。 それ次第で回答が変わるかもしれません。
Accessのテーブルやクエリのデータを貼り付ける場合は下記で、Markdown書式のテーブルに変換して貼り付けてください。
Markdown Tables generator
ありがとうございます!!
その形で進めようと思います。
まだ、更新クエリ、追加クエリをささっと作成できる技量がないので、勉強しながらやってみようと思います。
追加のアドバイスもありがとうございます。
また、行き詰まったらお邪魔するかもしれませんが頑張ってみます。
上の回答の追記の方法でどうでしょう。
更新クエリは、インポートしたテーブルとT_商品リストを「商品番号」で結合したクエリにするといいでしょう。
あるいは、下記のようにしてもいいでしょう。
エクセルのテーブルをAccessにインポートする。
更新クエリでインポートしたテーブルの「商品番号」を「商品ID」に変換する。
このテーブルを追加クエリで「T_在庫管理表」に追加する。
ご教示ありがとうございます。関係性をよく理解しておらず、おっしゃる通り商品リストを更新してしまったりでうまくいっていませんでした。
その場合は、Accessの商品リストをエクセルにエクスポートしてから利用するということであっていますか?
日々大量の商品をAccessのT_商品リストに登録していく事になるのでちょっと不安があるのですが、、、。
ご希望の処理の流れは下記になると思います。
バーコードスキャナアプリで「商品番号」を読み込む。CSVファイルとして保存される。
↓
エクセルファイルにテーブルとして読み込む。
↓
これをAccessのテーブルに取り込む。
「Q_在庫管理表」に取り込むという考え方ではなく「T_在庫管理表」にデータを取り込むという考え方にすべきでしょう。
「Q_在庫管理表」にコピペしたとしても、データが最終的に追加されるのは「T_在庫管理表」ですので。
「Q_在庫管理表」には「T_商品」などのマスターテーブルのフィールドも表示されていますが、これらのフィールドは更新してはだめなので。
「T_在庫管理表」には「商品番号」や「商品名」などのフィールドはないはずですので、外部キーである「商品ID」を入力する必要があります。
いったん、エクセルに落とし込むなら、エクセルの方で「商品番号」を「商品ID」に変換するのが簡単そうですが、それではだめでしょうか。
早速のお返事ありがとうございます。
Q_在庫管理表
現実にはこのようになっています。
見ようみまね作成しているので無駄な部分やおかしな所があるかもしれませんが、、。
F_在庫管理表フォームも作成してあり、通常はそちらから手作業で入力していたのですが、バーコードスキャナアプリのデータで入力できないかと思考錯誤している段階で、
複数の【品番】をアプリで読み取りcsv形式でパソコンに保存
↓
Q_在庫管理表と同じ形のEXCELのテーブルに落とし込み
↓
Q_在庫管理表に追加でコピペ
これでできないだろうかと思っての質問でした。
ごめんなさいどのようにすればいいのかわからないです。
よろしくお願いいたします。
Q_在庫管理表 のSQLを提示してもらえますか。
EXCEL と Access の連携はどのように考えているのでしょうか。
データをエクセルに格納するなら、エクセルで直接読み取ればいいと思いますが。
「直接」は難しいと思います
ただ、左の数字は
で取得可能。右の数字はレコード総数なので
とすれば同じ内容になると思いますが、これではまずいですか?
hiroton 様
大変申し訳ございません。上記の方法を不完全な状態で試しておりました。
(curTop = Me.CurrentSectionTop が抜けていました)
ちゃんとした方法で行ったところ、うまくいきました。
ちなみにスクロールバーの値はやはり取得するのは難しいものでしょうか…?
お世話になっております。上述のExitイベントで未入力に加えて、入力規則にのっとっているか判別(桁数のチェック)を行えるようにしました。
正しく動いているんですが、不正な状態のままレコードを削除したく、困っています。
フォーム上に削除ボタンを作り、 DoCmd.RunCommand acCmdDeleteRecord で削除していますが、不正な入力状態のまま削除ボタンを押すと、先に上述のEXITイベントが発動して、削除ボタンを受け付けてくれません。
回避方法を模索しているんですが、どうしてよいかわかりません。特定のイベントの時だけこのEXITイベントをキャンセルする、というようなテクニックはないでしょうか?
hiroton 様
度々のご返信ありがとうございます。
ただ申し訳ございません、求めているものとは少し違っておりました。
上記の方法で試したところ、たしかにレコードは同じ位置になるのですが、表示位置が一番上にきてしまいます。
スクロールバーの値さえ取得すれば、GoToPageを使用して実行後も同じスクロールバーの位置(画像でいうと6が一番上の位置)にできるのではないかと思い、悩んでおります。
うまく伝えられず申し訳ございません。よろしくお願い致します。


このプロパティで調べて(Web検索して)みてください
【Access】帳票フォームでRequeryを行ってもレコードの表示位置が変わらないようにする(ほそぼそプログラミング日記さん)
hiroton様
ご返信ありがとうございます。
CurrentSectionTop は試しましたが、うまくいきませんでした…
スクロールバーを一番上にして、レコードを1に合わせた状態で値を取得すると450
スクロールバーを一番上にして、レコードを13に合わせた状態で値を取得すると5130
となります。
希望は、どのレコードにいてもスクロールバーが同じ位置なら、同じ値が欲しいのです。
(画像で言うとスクロールバーが一番上なので「1」の値が欲しい)
お手数をおかけしますが、よろしくお願い致します。

スクロールバーの「位置」を知ることができるプロパティがあります
Form.CurrentSectionTop プロパティ (Access)
このプロパティで調べてみてください
回答ありがとうございます。
実際に利用しています。
コードをコピペしてデバッグ→コンパイルをしたらエラーになりました
それは実際に使っているコードですか?
#エラーになるフィールドに設定してある式に問題があるのでしょうね。
その式を提示するとか、もう少し情報を提供ください。
一例として、下記のような感じでご希望のことは実現できますね。
オプショングループ内に12個のオプションボタンを配置して、オプションボタンのオプション値をそれぞれ 1~12 に設定。
クエリの月の抽出条件にオプショングループ名を設定。これをサブフォームのレコードソースに設定。
オプショングループの更新後処理でサブフォームを再クエリする。
https://teratail.com/questions/nq21aq7i1dpihk
https://support.microsoft.com/ja-jp/office/フォームまたはレポートのグラフを作成する-1a463106-65d0-4dbb-9d66-4ecb737ea7f7
とりあえず、基本的なことから
Accessフォームでフィルターを使って特定のレコードのみ表示する方法(工場エンジニアのAccessスキルさん)
レコードの抽出(基礎編)(cbcnet.さん)
もう少し実用的に
複数条件の抽出フォームの設計 その1(hatena chipsさん)
見た目が変わらない(データだけが変わる)ならタブコントロールの必要性は薄いです。むしろタブの数だけサブフォームを用意する必要があるので余計に手間
(見た目だけどうしてもタブを使いたいということならタブの中にはコントロールを配置しないという方法もありますが)
ひとまずリンクを参考にベースとなるフォームを作成しましょう
そのうえで、もっと具体的な内容を添えて質問しましょう
タブコントロールの各ページにサブフォームを配置しているということでしょうか。
現状、どこまでできているのでしょうか。現在の状況を詳しく提示してもらえれば、そこからの改善点をアドバイスできると思います。
サブフォームのレコードソースのテーブルのフィールド構成も提示してください。
また、メインフォームは非連結フォームですか。
コンボボックスの名前は「サイトID」で間違いないですか。
自動で[]が付くのは自動補完機能なので問題ないです。コンボボックス名に間違いがなければ、
=サイトID.Column(1)
と設定すれば、
=[サイトID].Column
と補完してくれます。
沢山のお返事ありがとうございます。
情報が私にとっては難解で、なかなかお返事が
出来なくてすみません。
今日、ちょっと分かったところが
あったので、動きました。
hatenaさんの
=サイトID.Column(1)
=サイトID.Column(2)
をちょっと試してみたところ、
「#Name?」と表示されました。
後入力した値が自動的に改変され
「=[サイトID].Column」
となりました。
宜しく御指南していただけましたら幸いです。
りんごさんもありがとうございます。
いつもありがとうございます。できました!
丁寧にご説明頂き助かります!
まず、前回の回答の訂正から。
前回の回答でテキストボックスと書いていましたが、ラベルの間違いです。ラベルと置き換えて読んでください。
さて、本題です。
一つのラベル内のテキストの色(前景色)を部分的に変えることはできません。
行毎に変えたいなら、行数分のラベルに分割することになりますね。
hatena様
ご指導ありがとうございます。ヒントを頂き、色付けできました。Withよく理解できました。
初心者で申し訳ございませんでした。
しかし、この方法ですと予定の案件がすべて色が変わってしまいました。考えてみれば当たり前でした。
これを一案件毎に条件毎に色を変えるのはむつかしいでしょうか?
調べて勉強しようとは思いますが、何かとっかかりのヒントを頂ければ幸いです。
なるほど、やはりそうですよね。。。Accessを勉強し始めた頃、将来データ量が増えすぎることを恐れて、カテゴリのちがうDBをそれぞれに分けて作ってしまったんですが、それがそもそもの間違いだったんですね。
統合するとシステム全体を見直さないといけないので、時間がかかりますがコツコツやってみます。
いつも本当に勉強になります。ありがとうございます!
テーブルでのプロパティ設定のみですので、VBAでコード書くよりよほどハードルは低いと思いますので、とりあえずチャレンジしてみてください。
まったく同じフィールドを持っているテーブルを分けるのはデータベース的にはNGな設計になります。一つのテーブルにまとめるべきです。
例えば、A-1とA-2が全く同じフィールドなら、一つのテーブルにして、2つを識別するフィールドを追加します。
A-1とA-2の主キーが重複するなら、識別フィールドと現状の主キーの複合主キーにします。
B-1、B-2、B-3、B-4に関しても同様に一つのテーブルにまとめます。
そうすれば、クエリは一つですみます。あとは、それぞれの識別フィールドに抽出条件を設定すれば希望のデータを取り出せます。
レポートなら開くときにOpenReportメソッドの引数で抽出条件を設定することができます。
ありがとうございます。
まだまだ勉強中の私にはハードルが高そうすが、チャレンジしてみます。
いつもありがとうございます。本当に勉強になります。
>> 3
凄いです。正直、使い道がないプロパティと思っていました。
よく見たら、ラベルでしたね。ラベルの中身をカラフルに、色やフォントを変える文字列関数ってありましたっけ、誰かフォローして下さい。
視認性に拘るなら、略のラベルと氏名のラベルを同じように用意して最初から作りましょう。
視認性よりも可読性・保守性が大事だと思います。明日、明後日、来週、来月、来年、5年、10年後に見たときに、パッと理解・説明出来ないなら無意味ですよ。
Exitイベントでの入力チェックは完全ではありません。
例えば、先頭のテキストボックスから順に移動しながら入力してくれればいいですが、マウスで別のテキストボックスをクリックして、そのテキストボックスをとばした場合はチェックができません。
分割フォームでもフォーカス移動関係は複雑になるので、うまくいかないこともあるでしょう。
入力チェックを確実にするならやはりテーブルの方で設定するのがいいと思います。
エラーメッセージを希望のものにしたいなら、
テーブルやフィールドの「入力規則」プロパティと「エラーメッセージ」プロパティを使って入力チェックするといいでしょう。
入力必須にしたいフィールドがテキスト型なら、
そのフィールドプロパティを下記のように設定します。
以上でテーブルレベルで入力必須にできます。
ForeColorというのは「前景色」プロパティです。「前景色」プロパティはテキストボックスのプロパティです。
rs!略 & rs!氏名
は、レコードセットの「略」フィールド、「氏名」フィールドに入っているデータです。Me(rs!略 & rs!氏名)
としたら、そのデータと同じ名前のテキストボックスを探すことになりますが、そのような名前のテキストボックスはないですよね。まずは、それぞれのコードの意味を理解するように努力してください。最初は難しいと思いますが、それをしないとスキルアップはしません。
とりあえず、
With Me("T" & rs!日付 - FirstDay)
の部分でテキストボックスを指定しています。
With
の意味も調べてみてください。ちら見回答であれですが、上手く出来ないなら、2つに分ければいいんじゃない。略の前景色は、ほにゃらら、氏名の前景色は、ほにゃらら、みたいに。
文字色がレコードに保存されているならリッチテキスト形式を使うと楽ができるかもしれません
標準モジュールに次の関数を追加する(※)
新たにテキストボックスを設置する
このテキストボックスは編集できないので、編集が必要なら元のテキストボックスにぴったり重ね合わせて(前面配置にする)フォーカス取得時に
Me!項目.setFocus
とかしてあげる必要があります(※)単純な計算なので関数を使わず直接コントロールソースで計算させることもできます
当方、Access2016で同じエラー解決しました。
条件付き書式のスペースを消すとエラーが出なくなりませんか。
NG: "[文字色] = " & Rs!文字色
OK: "[文字色]=" & Rs!文字色
これは以下2点において、Access2016のバグと言っていいと思います。
・条件付き書式の解析の問題
・エラー内容とメッセージが違う問題
ありがとうございます。できました。
もうひとつご相談です。対象のフォームが分割フォームで作成されているのですが、新規レコードのフィールドAに入力しないまま、データシートビューで別のレコードをクリックすると、フォーカスは教えて頂いたVBAでそこから移動しないのですが、単票フォームはクリックしたレコードに移ってしまいます。それも抑止する方法はないでしょうか?
何度もすみません。
hatena様
お手数をおかけいたします。
If rs!略.Value = "関" Then はデバッグできましたが、
Me(rs!略 & rs!氏名).ForeColor がエラーになりました。
Meを外したり、rs!略だけにしても同じです。
色を変えたいのは表示させている 時間と略と氏名の一行、一行を略の選択によって色を変えたいです。
日付の登録が済んだら、次は日付別の何かを登録するんじゃないかと予想します。
最終的に、このデータベースを使ってどんな事がやりたいのでしょう。
それ次第で回答が変わるかもしれません。