Public Function GetColorNumber(ColorName As String) As Long
Select Case ColorName
Case "Black": GetColorNumber = vbBlack
Case "Red": GetColorNumber = vbRed
Case "Green": GetColorNumber = vbGreen
Case "Yellow": GetColorNumber = vbYellow
Case "Blue": GetColorNumber = vbBlue
Case "Magenta": GetColorNumber = vbMagenta
Case "Cyan": GetColorNumber = vbCyan
Case "White": GetColorNumber = vbWhite
Case Else: GetColorNumber = -1
End Select
End Function
Dim STR as String
STR = Dlookup("ForeColor","***","商品コード = '" & Me.商品コード & "'")
Me.商品名.ForeColor = GetColorNumber(STR)
Dim STR as String
STR = Dlookup("ForeColor","***","商品コード = '" & Me.商品コード & "'")
With CreateObject("MSScriptControl.ScriptControl")
.Language = "VBScript"
Me.商品名.ForeColor = .Eval(STR)
End With
すでにhirotonさんから的確な回答が付いていますので、蛇足ですが、
レコードソースに設定したクエリは、フォーム読み込み時にレコードセットとして開かれて読み込まれます。
その後、クエリのSQLを変更したとします。
そこで、フォームを再クエリしても、クエリからレコードセットを再読込せずに、現状のレコードセット(つまり変更前のSQLのまま)として再読込します。
よって、変更したSQLは反映されません。
hirotonさんの回答にあるように、
Where句の変更ならForm.Filterプロパティ、Order By句の変更なら、Form.OrderByプロパティで設定すればいいでしょう。
もし、それ以外の部分でSQLを変更したい場合(例えばFROM句とか...)は、いったんRecordSourceプロパティを解除してから再設定すると反映されます。
フォームに設定したレコードセットに対してWHERE条件を追加したい場合、フォームのフィルター(Filter)プロパティを操作すると良いです
Form.Filter プロパティ (Access)
「レコードソースに設定したクエリ自体にWHERE条件が含まれていて、その条件を変更したい」というのはのはちょっと困難なので、そういう場合はその部分のWHERE条件を外した状態のクエリをレコードソースに設定して、やはりフィルタープロパティで操作すると良いです
デフォルトのWHERE条件を設定したい場合はフォームの読み込み時イベントで設定すればいいでしょう
ありがとうございます。
考え方自体が違ったようですね。
サブフォームに使われているクエリをのWHERE条件を変化させたかったので、ソースのクエリごと毎回生成させようかと思ったのですが。
hiroton様
そのやり方もやってみます。
ありがとうございます。
ACCESSでそのような、「クエリそのものを入れ替える処理をする」のがおかしい。ですかね。そうしなければならない理由がちょっと思いつかないです
サブクエリなら問題ない速度ということであれば、操作できるコントロール(透明ボタンや非連結のテキストボックス)を用意して更新後処理などでデータの更新処理をする(更新クエリを実行する)という手もあります
hiroton様
お返事遅くなりすみません。
定義域集合関数を使ったら確かに更新できるようになりました。
が、帳票フォームなので動きがノッソリノッソリしてしまいます。
いろいろ考えましたが、集計した金額をテーブルのフィールドに格納することにしました。
ありがとうございました。
hatenaさん すみませんでした。結果的に日付・サブID 並べ替え設定して 日付&サブIDを結合したカスタム順番(例:2023040100005)のフィールドを使い DSum("金額","クエリ名","カスタム順番<=" & [カスタム順番]) にしたらレコード毎にきちんと累計がだせました。
色々している内に混乱し、お手数かけてしまいました。
ここまでは出来ましたのでいずれデータが大量になる事を想定して、自動入力する関数にトライしたいと思ってます。
ありがとうございました。
どのような累計が欲しいのでしょうか。
最初の質問では、日付とサブIDで並べ替える。
次に、その並び順で累計を出したい。
サブIDはオートナンバー型ということなので重複はないですよね。ならば、同じ値はでないと思いますが。
もう少し正確な情報を出してください。
実際のテーブル名とフィールド構成(フィールド名、データ型、主キー設定)
どのような累計が欲しいのか。
hatenaさん 何度もすみません、ふと思ったのですがDSum式にメインIDも記述必要でしょうか? 日付等が格納されていますメインテーブルには同じ日付のものも多数あるので(メインID:1 日付:4/1、メインID:2 日付:4/1の場合もあり)。だから今のDSum式では同じ値の累計がでてるのでしょうか?
hatenaさん すみません、取りあえず DSum("項目の金額等","クエリ名","日付 <= #" & [日付] & "# OR (日付=#" & [日付] & "# AND サブID<=" & [サブID] & ")")をクエリに記述して試したところエラーにはなりませんが累計の値がところどころ計算されずにすぐ上のレコードと同じ値がでます。並べ替えも設定し出来ていているのですが・・・何かが間違っているのでしょうか?
hatenaさん ありがとうございました。すごいアイデアです。因みにクエリ内での累計をせずにフォームやレポートにだけ累計の場合はどうなりますでしょうか?(日付、サブIDの並べ替え設定したクエリを基に作成)
2つのテーブルを結合したクエリを元にクエリを作成し、下記のような感じの式になります。
2つのフィールドを&で結合してそれを対象にするとインデックスが無効になるので重い処理になります。DSumはただでさえ重いので、演算フィールドを対象にするのはお勧めできません。
上記の式にようにすればインデックスが有効になるので、データ数が多くなっても重くなりづらいです。
ただ、それでも重い処理になりがちなので、なんとかしたいと思われたなら、下記のページを参考にしてください。
累計値をテーブルに自動入力する関数 - hatena chips
hatenaさん ありがとうございます。その場合、累計の式はどうすればいいでしょうか?
累計: DSum("項目の金額等","テーブル名","日付 <= #" & [日付] & "#")や日付のところをサブIDにしても、日付+IDの順番での累計がでないので、、、それで結合をしたのです。何で設定すれば分からなくて。
日付、サブID の昇順で並べ替えをしたいということでしょうか。
ならば、フィールドを結合する必要はなく、それぞれのフィールドで並べ替えを設定すればいいでしょう。
デザインビューのグリッドで左側のあるフィールドが優先されますので、下記のように設定すればご希望の並び順になります。
私の場合は、マスターに普通に登録しちゃいます。
どちらにしてもどこかに登録する必要がありますので、一見さん専用テーブルを別に作成したりとかするのもかえって面倒になります。
マスターに管理用のフィールドを追加して、一見さんとか手離れした取引先はチェックしておいて、クエリで表示するとき抽出しないようにしておけばいいでしょう。
一見さんが継続して取引することになることもあるかもしれません。その時はチェックを外せばいいだけです。
下記で紹介しているごみ箱の設計と同じような考え方です。
削除したレコードを復活できる「ごみ箱」の設計 - hatena chips
ご検証ありがとうございます。
私の環境だけで発生しているわけではなさそうなので、変な意味で一安心しました。
私もメンバーIDを別の文字で置き換えてみたら、正常に表示されたので、バグかなと思っていましたが、
hatenaさまの環境でも発生したようなので、バグと確信しました。
メンバーIDを変えてしまうと、いろいろなところで影響が出ますので、今回はこのままにします。
動作上は問題なさそうなので。
いつもこちらのサイトを参考にさせていただき、業務アプリを作成しています。助かっています。
ありがとうございました。
ColorContantsで定義されているものだけなら、変換関数を自作してもいいかも。
標準モジュール
提示の画像とまったく同じテーブル名、フィールド名でテーブルを作成してクエリを作成したら、現象が再現できました。
フィールド名を「メンバーID」から「MemberID」に変更したテーブルで試したら、正常に表示されました。
特定のフィールド名だと症状がでるのかも?
バグっぽいですね。
クエリのデザインビューでテーブルを追加したときには、1対多で表示されるのですが、
そのクエリを保存して、再度デザインビューで開くと、右のようになってしまうのです。
このテストファイルは365で作っています。accdb形式です。
このテストファイルは、このテーブルとクエリ1しかなく、テーブルの中にデータはありません。
IDという文字がいけないのでしょうか。
ご対応ありがとうございます。
画像のようになってしまうのです。
リレーションシップでは1対多で表示されますが、クエリではそれが表示されません。
当方、2013がないので365との比較はできないですが、結合線が細いと言われたら細い気もしますが、デザインが変わっただけではないでしょうか。
1と∞が表示されているならリレーションシップは正しく機能しているのではないでしょうか。
早速のご返答ありがとうございます。
特に動作上問題はありませんが、リレーションシップで表示されている結合線と、クエリで表示されている結合線が違っているので、気になった次第でした。
こちらでも新しくデータベースをaccdbで作成し、テーブルを2つ用意し、片方の主キーに全角カタカナを使用し、2つのテーブルにリレーションシップを設定し、この2つのテーブルを用いたクエリを作成し、保存して再度デザインビューで開いたら、やっぱい結合線が細くなっていて、1対多の太線が表示されませんでした。
適当にできるだろうと思ってやったら痛い目を見ました
それこそデータベース化したらいいじゃないかということではありますが一応
※この掲示板ではEvalを半角で記述できないので、上記コードでは全角で記述しています
単に
Eval(str)
で実行できればよかったのですがACCESS(2013)では許されないようです無理やりどうにかする方法を見つけましたが完全に非推奨な方法です
動作原理からしても、やはりカラーコード対応テーブルで対応すべきとなります
全角カナが主キーのテーブルとサブテーブルを作ってリレーションシップを設定してみたけど特に問題はなかった。
現状の状態で動作に不具合とかはありますか。
ありがとうございます。
番号でやってみます。
「ForeColor」フィールドのデータ型がテキスト型で、vbRed という文字が格納されているということですか。
VBAのコードでvbRedは定義済み定数で、中身は数値です。文字ではありませんので、そのエラーになります。
イミディエイトウィンドウで
?vbRed
と入力してEnterキーを押すと
255
と表示されます。この255がvbRedの中身です。
「ForeColor」フィールドのデータ型は数値型にして、赤にしたいなら255を入力してください。
定数の中身は上で説明したようにイミディエイトウィンドウで確認できます。
下記のようなテーブルを作成しておいて、それを参照するようにするといいでしょう。
ColorTbl
そして、結合プロパティを開くと、右の列見出しのところが、
[メンバーID]
というように、[]のかっこが付いています。
はい、「データベースツール」-「リレーションシップ」でそのテーブルを結合しています。
はい、その結合線の両端に1と∞が表示されています。
サブクエリの代わりに定義域集合関数(DSumとか)で計算させると更新できるようになったりしますね
「データベースツール」-「リレーションシップ」でそのテーブルを結合してますか。
また、その結合線の両端に1と∞が表示されてますか。
自動修正をはいにすると、デザインビューでウィンドウを任意の位置とサイズに変更しても、レポートの大きさに修正されてしまいますよね?
Hatenaさんでも分からないなら諦めます。
テラテイルでのsk.exeさんと同じ見解です。
[サイズ自動修正]プロパティを「はい」にするという対応ではだめですか。
それがだめなら、hirotonさんの回答のフォームを使う方法ぐらいしか私も思いつきません。
上がダブルクリックで開いた状態。
下が理想の状態です。これで現状を理解できましたか?
位置とサイズはデザインビューでどうにでもなるんです。
ナビゲーションウィンドウからダブルクリックでレポートを開くと、レポートが左下にずれるんです。
こちらに参考画像用意してますのでご確認ください
テラテイルでの質問
いまいち、質問の意図をつかみかねていますが、レポートのプレビューウィンドウを希望の位置とサイズで開きたいということでしょうか。
レポートのプレビューを開いたときの位置とサイズは、デザインビューで上書き保存したときの位置とサイズを記憶していてそれが適用されるようです。
ただし、「自動中央寄せ」「サイズ自動修正」が「はい」に設定されいるときはそちらが優先されますが。
デザインビューでご希望の位置とサイズにして、上書き保存すればどうでしょうか。