Public Function 月初(申請日 As Variant) As Variant
If IsNull(申請日) Then Exit Function
'申請日がNULLなら関数は終わり
月初 = DateSerial(Year([申請日]), Month([申請日]) + 1, 1)
'月初めが出る
Do
Select Case Weekday(月初)
Case vbMonday To vbFriday
If IsNull(DLookup("祝日名", "T_祝日", "日付=#" & 許可日 & "#")) Then
Exit Do
End If
End Select
月初 = 月初 + 1
Loop
' 月初めが月曜から金曜の間で祝祭日がNULLならD0文が修了。土日はNULLじゃないから終了しない
終了するまで月初に1日プラスする。
End Function
Public Function 月初(申請日 As Variant) As Variant
If IsNull(申請日) Then Exit Function
月初 = DateSerial(Year([申請日]),Month([申請日])+1,1)
Do
Select Case Weekday(月初)
Case vbMonday To vbFriday
If IsNull(DLookup("祝日名", "T_祝日", "日付=#" & 許可日 & "#")) Then
Exit Do
End If
End Select
月初 = 月初 + 1
Loop
End Function
Public Function tesuuryou(申請日, 普軽別, 再申請, 自社)
tesuuryou = Null
If IsNull(申請日) Then Exit Function
If 再申請 = True or 自社 = 1 Then
tesuuryou = 1000
ElseIf 普軽別 = "普" Then
tesuuryou = 3000
ElseIf 普軽別 = "軽" Then
tesuuryou = 2000
End If
If 申請日 <= #9/30/2019# Then
tesuuryou = Int(tesuuryou * 1.08)
ElseIf 申請日 >= #10/1/2019#
tesuuryou = Int(tesuuryou * 1.10)
End If
End Function
Private Sub 月割_AfterUpdate()
If Me.チェック460 = True Then
Me.月割金額 = DLookup("[金額]", "Q_金額表", "[Q_金額表]![月]=[月割]")
Else
Me.月割金額 = DLookup("[金額]", "Q_金額表NEW", "[Q_金額表NEW]![月]=[月割]")
End If
End Sub
Dim Itm As Variant, ItmList As String
With Me.月検索
If .ItemsSelected.Count > 0 Then
For Each Itm In .ItemsSelected
ItmList = ItmList & "," & .ItemData(Itm)
Next
strfilter = strfilter & " AND 月 In (" & Mid(ItmList, 2) & ")"
End If
End With
簡単に解説しておきますと、
リストボックスの ItemsSelectedプロパティには、選択されたアイテムのインデックスが格納されています。
For Each でインデックス(Itm)を一つずつ取り出します。
ItemData(Itm) でインデックスに対応するデータを取り出します。
取り出したデータを カンマ区切りで連結していきます。
最後に、AND 月 In ( ) に挿入して、下記のような条件式文字列にします。
If Not IsNull(Me.複数月検索) Then
strFilter = strFilter & " AND " & BuildCriteria("月", dbText, "*" & Replace(StrConv(Me.複数月検索, vbWide), " ", "* Or *") & "*")
End If
インデントでいいのなら、通常のコンボボックスで、先頭に空白をいれればいいように思います。
例えば、リストのもとになるテーブル設計を下記のようにしておいて、
テーブル1
さらに下記のように設定すれば、
連結列:1
列数:2
列幅:0cm
疑似階層表示になると思います。
あ、階層表示といっても、インデント!?というのでしょうか、
それが設定出来るので、疑似階層表示といえば良いのかも知れません。
やはりそうですか。
コードが短く済むのでいいかなと思ったのですが、
見たところリスト行数の設定も難しそうですし、
keyの設定も、数字を文字列(全角にしても)に変換してもエラーが出ますし…
TreeViewコントロールで実装する事にします。
ありがとうございました。
イメージコンボボックスって階層表示に対応してるんですか?
階層表示するなら、自分なら、TreeViewコントロールをボタンのクリックで表示/非表示させる方針で行くかな?
Office TANAKA - TreeViewコントロールの使い方
返信ありがとうございます。
階層表示にしたいのでイメージコンボボックスをと考えていました。
色々とググったのですが、詳細が記載されているところが見当たらなくて。
イメージコンボボックスは使ったことがないのでご質問に回答できないですが、
普通のコンボボックスではダメなんですか?
hatenaさま、返信ありがとうございます。
日が変わり脳みそがリセットされたら、解決いたしました。
>一時テーブルへデータをエクスポートするときの抽出条件はどこでどのように設定してますか。
抽出条件に関する「W.回数=T.回数」について、
DELETEのSQLでの記載箇所“どこで”を誤っておりました。
EXSITSの中でこねくり回してしまっておりました。
下記のとおり書いたらうまく動作しました。
DELETE FROM T_受講受付 AS T
WHERE W.回数=T.回数 and NOT EXSITS (SELECT * FROM W_受講受付 AS T WHERE W.申込者=T.申込者)
どうもお騒がせいたしました。
もう不要ではありますが、うまく動作している方のSQLは下記のとおりとしておりました。
(実際のテーブルのフィールドは多いのでstrとしています。)
UPDATE T
INNER JOIN W
ON T.回数=W.回数
SET & strフィールド &
WHERE T.回数= str抽出した回数
INSERT INTO T ( & strフィールド & )
SELECT & strフィールド &
FROM W
ありがとうございました。
今後ともよろしくお願いいたしますm(__)m
とりあえず画像ファイルからの想像ですが、
一時テーブル以外のレコードがすべて削除されているようですね。
データを一時テーブルへ転送するときに、元テーブルに何らかの抽出条件を設定しているはずです。
削除クエリにも、同じ抽出条件を設定しないと、そのような結果になりますね。
T_受講受付 の主キー設定を提示してください。
そのうまくいっているSQLを提示してください。
あと、一時テーブルへデータをエクスポートするときの抽出条件はどこでどのように設定してますか。
レポートのプレビューに[印刷][閉じる]ボタンを付加する関数を下記で紹介していますので、
よろしかったらご参考に。
すみません!解決しました
ありがとうございました。
ポップアップする方法参考にさせていただきます。
ちょっと調べてみましたがメニューバーを表示する場合「ファイル」だけは非表示にできないような感じでした。
「ファイル」の中のメニューは好きに弄れるようです。(「閉じる」を非表示にしたりとか)
Access 2016 のリボンをカスタマイズする
「印刷」だけをさせたいなら右クリックのショートカットメニューをカスタマイズするとか、自分の場合はよく、[印刷]と[閉じる]のボタンだけを置いたフォームをポップアップに設定しておいて、レポートを「印刷プレビュー」で開くと同時にフォームを開くようなものを作ります。
だいたいあってます。
hatena様大変有り難うございました。
考え方としては次の通りでよろしいんでしょうか?
Public Function 月初(申請日 As Variant) As Variant
If IsNull(申請日) Then Exit Function
'申請日がNULLなら関数は終わり
月初 = DateSerial(Year([申請日]), Month([申請日]) + 1, 1)
'月初めが出る
Do
Select Case Weekday(月初)
Case vbMonday To vbFriday
If IsNull(DLookup("祝日名", "T_祝日", "日付=#" & 許可日 & "#")) Then
Exit Do
End If
End Select
月初 = 月初 + 1
Loop
' 月初めが月曜から金曜の間で祝祭日がNULLならD0文が修了。土日はNULLじゃないから終了しない
終了するまで月初に1日プラスする。
End Function
hatena様
閲覧してくださった皆様
有難う御座います
>レポートでなら、「分類」テキストボックスの「重複データ表示」プロパティを「はい」にしておけばいいでしょう
此方でレポートが無事に完成できました
有難う御座います
こんなに設定事項があるんですね
驚きました
時間を作って弄ってみます
重ねてアドバイス有難う御座いました
レポートでなら、「分類」テキストボックスの「重複データ表示」プロパティを「はい」にしておけばいいでしょう。
hatena 様
いつもありがとうございます。
正常に動作できるようになりました。
難しいですが理解できるように勉強致します。
下記でどうでしょうか。
親子関係でもできますが、集計等が複雑になるのでそこまですることはないと思います。
また、現状の割増等のフィールドを持たせる方法もあまりいい方法とはいえないと思います。
夜間割増以外にも、その他の割増とか割引とか増えてきたりするとその都度テーブル、クエリ、フォーム、レポートの修正が発生します。集計も複雑になります。
単純に「割増」というレコードを追加するのが一番シンプルだと思います。
日付 項目名 料金
○月○日 作業A 10000
○月○日 夜間割増 5000
DLookup の第3引数は抽出条件式を文字列として設定します。
現状は、
"文字列" AND "文字列"
となってますので、文字列に対する論理演算になり常にFalseになります。AND は""の中にいれてください。
次に、[テキスト2]が""内に入ってますので、これは単なる"[テキスト2]"という文字列になります。[テキスト2]コントロールを参照するには""の外に出す必要があります。
これで例えばテキスト2が「4月」、テキスト0が「5~6年」なら、第3引数は下記のような条件式として正しい文字列になります。
[月]='4月' And [学年]='5~6年'
hirotonさんTMGさん希望するかっこいい式です。
ありがとうございました。
また朱色さん参考にさせていただきます。
ありがとうございました。
9月に軽で再申請した市内、10月に普通で再申請した市内のパターンが抜けてる気がしまうが...ともかく。
テーブル構造を変えたくないのであれば以下でどうでしょうか。
※1円誤差とかその辺は全然考えてないです
※Intでいいんでしたっけ・・・
自分はプログラムの中に固定数値入れるな、と教わったので、
ほんというと手数料自体別テーブルに持って引っ張ったほうがいいんじゃないかと思うし、
消費税テーブルも作ったほうが、いいと思ってます。
手数料の変更や消費税がまた変わったなどの場合に、テーブル数値変えれば対応できますので。
hirotonさんのを参考にしますと、
消費税テーブルに税率の開始日をそれぞれ用意しておくことで対応できると思いますよ。
もし申請日が2019年9月30日の場合には、
により開始日は「2014/04/01」を取得することができ、
この部分で消費税8%を取得することができます。
hirotonさんさっそくご教示ありがとうございます。
なるほどですね。増税分はばっちり対応するようですね。
じつは9月30日以前の8%分も同じデータとして共存しなければなりません。
その場合は8%分の関数を作ってIIFで分けて使うのでしょうか。
ご教示お願いします。
単純に
tesuuryou = 基本料金 * 消費税
の形のほうが分かりやすいのでは?後は、せっかくACCESSを使っているのでデータはテーブルへ
・手数料テーブル(普軽別、再申請、自社、手数料)
・消費税テーブル(開始日、税率)
手数料テーブルの「手数料」は税抜き、消費税テーブルの「税率」は税率部分を整数入力想定です。(消費税10%なら整数で10)
返事が遅くなり申し訳ありません。おかげさまで希望通りの
結果が得られました。TMGさんhatenさん大変有り難うございました。
hatena様の関数式いつもかっこいいですね。ただどうしてこの関数で
こうなるのかというのを今後勉強していきたいと思います。
腰を据えてパソコンの前に座る時間が取れずだいぶ遅くなってしまいましたが返答を入れます。
リストボックスについての話はありません。かなり基礎的な内容です。
今回の案件で考えるべきは
Me.Filter
に設定する値)と3つあり、それぞれの影響はあまり大きくありません。色々試したということですが質問に記載のコードは前回の質問で完成したままで、試した内容がわかりません。
解決策としてはhatenaさん提示の通りという簡単なものですが、どのようなアプローチで無理な事を考えているに至ったのがわからないので「質問丸投げ、コードコピペ、次への応用ができない」という不安がでます。
この部分の確認が>> 1の質問でした。
ということで、不安になりそうなところを上げておきます。
別々な条件をすべて抽出
何となく理解しているだろうことは見えますが、
Or
で抽出できます。例えば1月、2月、3月を抽出したいとなると"月 = 1 Or 月 = 2 Or 月 = 3"
となります。テキストボックスを使って「1 2 3」の入力があるならなんて形になるでしょう。
ただし、実践上は他の条件との兼ね合いがあるので(And Orの優先順位を考慮すると
"And (月 = 1 Or 月 = 2 Or 月 = 3)"
がほしい)>> 2のコードはもう少しというところですね。
(BuildCriteriaを使う方法は不正解ではないですが、今回そこまで難しく考える必要はないので特に補足はしません)
最終的なリストボックスのコードはそれ用に独特の内容もありますが、全体の処理の流れは変わりませんし、出力(strfilterの値)も変わりません。(In句を使うかどうかは別問題です。後述)
最終目標はリストボックスを使ってとなりますが、問題を分割して何がわからないのかをもう少し掘り下げておけるとよかったと思います。
In句について
ここでの使い方は複数のOrをまとめたもの。
つまり「
" And (月 = 1 Or 月 = 2 Or 月 = 3)"
」と「" And 月 In (1,2,3)"
」は全く同じ動作をするということになります。これを表すコード部分で言うと
はどちらを記述しても全く同じ動作をすることになります。完成形のコードのほうであれば
のどちらを書いても同じ結果になります。
In句のほうが読みやすいのが一番のメリットですね。
In句を使っているからと言ってなにも特別なことはないとわかれば>> 4の疑問も理解できると思います。
以上、「全くわからない」を「何がわからないのかわかる」ようにするために問題を切り分けましょうという話でした。
hatena 様
ありがとうございました。
思う通り動作できました。
Meでの記述に変更致しました。
たいへん助かりました。
あぁすみません。そうですね
なんかボケてたみたいです
正常に動作しているなら、下記でいいかと。
ちょっと解説すると、
[フォーム1]![チェック460] ではフォーム上のコントロールを参照できないのでエラーになります。
Forms![フォーム1]![チェック460] とする必要があります。こうすればエラーになくなります。
コードが記述してあるフォーム(オブジェクト)は Me で参照できますので、Me!チェック460 と記述することもできます。
CodeContextObject はコードが実行されているオブジェクトという意味ですのでこれでもOKです。でも、長いので Me の方が楽ですよね。
私が疑問に思ったのは "[Q_金額表]![月]=[月割]" の部分で、この抽出条件では、コンボボックスの値を反映しないからです。ここに、この条件式を入れる意味はほとんど無意味。
質問から、コンボボックスで選択した値で抽出したいのだと読めますので。
Q_金額表 の中でフォーム上のコンボボックスを参照しているのなら正常に動く可能性はあります。
なぜ
CodeContextObject
を使っているのかわからないってだけでCodeContextObject
はMe
と同等なんじゃないですかねどこにコードを書いているかがないんでアレですが、まぁ動いてるんだろうなとは思ってます
ありがとうございます。
正常に動作しております。
説明不足で申し訳ありませんでした。
フォーム上に「年齢欄」があります
クエリ"Q_金額表"でフォーム上の「年齢欄」を参照して年齢のフィルターを掛けています。
宜しくお願い致します。
回答の前に、
このコードで、正しい結果になってますか。
コンボボックスを参照していないので、コンボボックスとは無関係の値になると思いますが?
一度、確認してみてください。
回答はそれからです。
😆
ほっと安心できました。
ありがとうございました。☺
はい、それで大丈夫ですよ(^-^)。😊
ご回答頂きましてありがとうございます。
思うように動作させることが出来ました。
本当にありがとうございました。
テキスト型にも運用できるようにしていきたいと思い以下のようにコード
を変更してみました。
テキスト型の項目に試してみると、抽出出来たのですが、
この部分だけの変更でいいのか、よく理解できていません。😨
リストボックス
名前 月検索
複数選択 標準 または 拡張
値集合タイプ 値リスト
値集合ソース 1;2;3;4;5;6;7;8;9;10;11;12
対象フィールド
フィールド名 月 (数値型)
として、下記のようなコードになります。
簡単に解説しておきますと、
リストボックスの ItemsSelectedプロパティには、選択されたアイテムのインデックスが格納されています。
For Each でインデックス(Itm)を一つずつ取り出します。
ItemData(Itm) でインデックスに対応するデータを取り出します。
取り出したデータを カンマ区切りで連結していきます。
最後に、AND 月 In ( ) に挿入して、下記のような条件式文字列にします。
AND 月 In (2,4,6,9,11)
2,4,6,9,11 を選択した場合
😄ご回答頂きまして、ありがとうございます。
チェックボックスは試していませんが、
スペースで区切って複数選択!なるものを試してみたのですが・・・・・・下記コードで当然のごとく、文字列として検索してしまい、例えば 1月と4月 を検索すると 入力は 「1 4」 で、検索結果は 1と11と12と4となります。
これを数値で検索できるようにするには・・・・・で、どこを修正すればいいのかわからず、また詰まっています。
すみません。😨
テキストボックスは試してみようと思います。