'前略
If Not IsNull(DLookup("CLN_YMD","D_カレンダー","CLN_YMD=#" & txtyear & "/1/1" & #)) Then
MsgBox "既に入力済みの年です。別の年を指定してください。"
txtYear.SetFocus
Exit Sub
End If
'後略
Option Compare Database
Option Explicit
Private Sub datain_Click()
If IsNumeric(txtYear) = False Then
MsgBox "未入力もしくは数値以外が入力されてます。"
txtYear.SetFocus
Exit Sub
End If
If Abs(Year(Date) - txtYear) > 100 Then
MsgBox "年の指定が誤りです。"
txtYear.SetFocus
Exit Sub
End If
If IsNull(DLookup("CLN_YMD", "D_カレンダー", "CLN_YMD=#" & txtYear & "/1/1#")) Then
MsgBox "既に入力済みの年です。別の年を指定してください。"
txtYear.SetFocus
Exit Sub
End If
Dim dbs As Database
Dim rst As Recordset
Dim dtmLoop As Date
Set dbs = CurrentDb
Set rst = dbs.OpenRecordset("D_カレンダー")
With rst
For dtmLoop = CDate(Me.txtYear & "/1/1") To CDate(Me.txtYear & "/12/31")
.AddNew
!CLN_YMD = dtmLoop
!CLN_YOUBI = Format$(dtmLoop, "aaa")
!CLN_OFF = DLookup("HLD_NAME", "T_休日", "HLD_YMD=#" & dtmLoop & "#") '追加
!CLN_Y = dtmLoop
.Update
Next dtmLoop
.Close
Me.txtYear.Value = Null
End With
MsgBox "カレンダーが作成されました。"
DoCmd.Close
End Sub
Private Sub datadel_Click()
If MsgBox("データ削除しますか?", vbYesNo + vbQuestion) = vbNo Then Exit Sub
CurrentDb.Execute "DELETE * from D_カレンダー"
MsgBox "データが削除されました。"
End Sub
Private Sub datain_Click()
If IsNumeric(txtYear) = False Then
MsgBox "未入力もしくは数値以外が入力されてます。"
txtYear.SetFocus
Exit Sub
End If
If Abs(Year(Date) - txtYear) > 100 Then
MsgBox "年の指定が誤りです。"
txtYear.SetFocus
Exit Sub
End If
If IsNull(DLookup("CLN_YMD","D_カレンダー","CLN_YMD=#" & txtyear & "/1/1" & #)) Then
MsgBox "既に入力済みの年です。別の年を指定してください。"
txtYear.SetFocus
Exit Sub
End If
'以下略
.ControlTipText = Nz(DLookup("摘要","T_休日","日付=#" & D & "#"),"") '定休日をヒントテキストに設定
If .ControlTipText = "" Then
.ControlTipText = ktHolidayName(D) '祝日名をヒントテキストに設定
End if
最初の回答のコードが間違ってました。下記に修正してください。(Notが不足していた。)
添付しました画像の通りです。
一度既にあるデータを削除して年の値を入力すると、既に入力された数値ですと表示され、その後どの年数も受け付けなくなりました。
すみませんがよろしくお願いいたします。
D_カレンダー テーブルの各フィールド名、データ型、主キー設定を提示してください。
'''sql
の部分ですが、単引用符(')ではなくバッククォート(`)を3つ続けるとコードブロックになります。
バッククォートは Shift + @ で入力できます。
早速の回答ありがとうございます。
今度は実行時エラー’3022’が表示されました。
デバックをすると以下の箇所が黄色で示されました。
'''sql
Set dbs = CurrentDb
Set rst = dbs.OpenRecordset("D_カレンダー")
With rst
For dtmLoop = CDate(Me.txtYear & "/1/1") To CDate(Me.txtYear & "/12/31")
.AddNew
!CLN_YMD = dtmLoop
!CLN_YOUBI = Format$(dtmLoop, "aaa")
!CLN_OFF = DLookup("HLD_NAME", "T_休日", "HLD_YMD=#" & dtmLoop & "#") '追加
.Update
Next dtmLoop
.Close
Me.txtYear.Value = Null
End With
MsgBox "カレンダーが作成されました。"
DoCmd.Close
End Sub
'''
フォーム上ではcircleメソッドは使えませんね。
私の場合は、小さい円なら、ラベルの標題に「〇」を設定して使います。大きい円や楕円の場合は、エクセルかワードのオートシェイプで作成した図形を貼り付けてます。
あっ、すみません。コード間違ってますね。下記に修正してください。
ご回答ありがとうございます。
試したところ構文エラーが表示されます。
入力した段階で
'''sql
If IsNull(DLookup("CLN_YMD","D_カレンダー","CLN_YMD=#" & txtyear & "/1/1" & #)) Then
'''
が赤文字になります。
カレンダーテーブルに認識用に"CLN_Y"を作成して試してみましたが、エラーが表示されます。
下記でどうでしょうか。
はい、それでもいいと思います。
結果は同じですのて、仕様に合わせて選択すればいいでしょう。
今回の場合は、エクセルでの画像をみると日付の上に罫線があるので、日付ヘッダーは表示させて直線コントロールを配置するといいかなと思い、そちらを提案しました。
最後のところ、VBAは使わずに
「日付グループヘッダー」
可視:いいえ
「日付」テキストボックスと「注意事項」テキストボックスは「詳細セクション」に配置
重複データ非表示:はい
でいいんでないかな。と
サブフォームのレコードソースのテーブルに「年」フィールドがあるということでしょうか。
もう少し、具体的かつ詳細な情報が必要です。その内容では状況が分かりません。
また、別の質問になると思いますので、新規に質問しなおしてください。
そのときに、具体的かつ詳細な情報を提示してください。
再度すみません、サブフォームの年に同じ値を入れて作成すると重複のエラーが表示されるので、こちらをメッセージを出るようにしてるのですが、どうにも上手くいきません。
色々調べて入力規則を使う方法を試しましたが、別なエラーが表示されてしまい、上手く作動せず。
クエリを使用して行う方法は、設定が理解できず挫折しました。
VBAで組んでみたのは、すべての数値を弾くものになりました。
カレンダーテーブルに年だけのフィールドを作成して、それと入力フォームを比べて重複を確認しようとしましたが、IF関数で組みました上手くいきません。
申し訳ございませんが、よろしくお願いいたします。4
詳しい解説ありがとうございました
とても参考になりました
ありがとうございます。
If文で切り分けるといいでしょう。
度々申し訳ございません。
祝日のマクロとの併用はやはり難しいのでしょうか?
先の説明で不足していたのですが、祝日は休みが基本なので自動で入力できるとありがたいのですが。
無事に動きましたありがとうございます。
単純なミスでした。
申し訳ございませんでした。
コードを下記に修正したらどうでしょうか。
早速のレスありがとうございます。
一応一度は成功したのですが、再度カレンダーフォームを起動すると「実行時エラー’13’ 型が一致しません。」とエラーが発生します。
デバック箇所は、
になります。
カレンダーは基本操作画面フォームがあり、カレンダーボタンをクリックすると現在のカレンダーと年を入力・作成するサブフォームが開くようになっていますが、開かなくなりました。
この場合の対処も教えてくださますでしょうか?
申し訳ございませんが、よろしくお願いいたします。
「うまく動きません。」とだけ言われても今どのような結果が出ていて、本当はどのような結果が欲しいのかを言っていただかないと何が間違っていてどこを正せばいいのか誰にもわかりませんよ?
「【最終的にやりたいこと】」を見る限りは条件式の書き方の問題ではないかと思いますが
IIf(
| [テーブルA]![フィールド1]=[テーブルB]![フィールド1] --1.の条件判定
| ,"9" --1.のとき○
| ,IIf( --1.でないときはさらに条件分岐
| | [テーブルA]![フィールド2]<>DateAdd("d",1,[クエリA]) --2.の条件判定
| | ,"9" --(1.でなく)2.のとき○
| | ,"3" --(1.でなく)2.でもない(3の)とき×
| )
)
ご回答いただき、本当にありがとうございます。
ご教授頂いた通り、修正致しました。
その式がどこに記述してあるか、クエリ全体でどのような構成になっているかで回答がことなります。
現状のクエリをデザインビューで開いてから、SQLビューにするとSQL文が表示されますので、それをコピーして貼り付けてください。SQLを見れば、クエリの全体の構成が分かりますので、回答しやすいです。
ちなみに「クエリA」というのはクエリではなく、フィールド名なのかな?
すみませんクエリの認識が間違っていたかもしれませんが、iif〜とdateadd〜がうまく動きません。
その2つのクエリのSQLを質問に追記してもらえますか。
「イレギュラーの休日や社内規定休日」を登録するテーブルを作成します。
例えば、下記のような感じです。
名前 T_休日
カレンダー形式のスケジュール管理フォーム作成 その3 - hatena chips の SetCalendar関数内の下記のコードを、
下記のように修正すればいいでしょう。
tblカレンダ に「休日」フィールドを追加して、
参考にしたリンク先のコードに下記ようにコードを追加すればいいでしょう。
!日付 = dtmLoop
!曜日 = Format$(dtmLoop, "aaa")
!通年日 = Format$(dtmLoop, "y")
!通年週 = Format$(dtmLoop, "ww")
!休日 = DLookup("摘要","T_休日","日付=#" & dtmLoop & "#") '追加
.Update
注意事項のマスターテーブルは下記だとします。
名前 T_注意事項
レポートのデザインビューで「グループ化、並べ替え」で「日付」フィールドでグループ化してグループヘッダーを表示させます。
グループヘッダーに、「日付」をテキストボックスとして配置します。
そのとなりにテキストボックスを2つ配置して下記のように設定します。
名前 連番
コントロールソース =1
集計実行 グループ全体
可視 いいえ
名前 注意事項
コントロールソース ==DLookUp("注意事項","T_注意事項","注意事項ID=" & ((([連番]-1) Mod 20)+1))
※
([連番]-1) Mod 20)
の20の部分は注意事項の件数詳細セクションに「従業員」フィールドを配置します。
デザインビューでのレイアウト例
日付グループヘッダーの「フォーマット時」のイベントプロシージャを下記のように記述します。
以上です。
おそくなりました
現在エクセルで手入力していて画像のようにしています
例えば本日の注意事項マスタに3件あるときそれを順繰りで表示させたいです
#27 のコードが間違ってました。
正しくは下記です。
#27 の回答のコードも修正しておきます。
&< /p> です。すみません。
早速ご回答いただきありがとうございます。
< /p >
を削除することで改行することができました。
Do Until rs.EOF
With Me("T" & rs!作業日 - FirstDay)
.value = .value & "< p >" & rs!開始時間 & " " & IIf(rs!確定<>"",""," ☆") & rs!略名 & < /p >
End With
rs.MoveNext
Loop
下記のコードだとどうでしょうか。
すみません。見落としていました。
☆を赤文字に変更したら、箇条書きで表示されなくなりました。
同日中の予定が、すべて続けて表示されます。
ラベルの時のように件名毎に改行できますでしょうか。
ありがとうございます。
ご教授頂いたようにラベルをテキストボックスに変更する方法を試してみたところ、☆の色を変更することができました。
本当にありがとうございます。
レポートのレコードソースのフィールド名を提示してください。
また、「グループ化と並べ替え」の設定はどうなってますか。
できれば、レコードソースのデータ例とレポート上にどのように表示させるのか。「本日の注意事項」はどこに表示させるのか。の詳細な説明をお願います。
例えば、「日にち」のグループヘッダーがあり、そこに「本日の注意事項」を表示させるのでしょうか。
レポートの「グループ化と並べ替え」で日付フィールドでグループ化して、グループフッターに直線コントロールを配置すれば日付毎に罫線を表示できます。グループフッターの高さは直線が表示できる最小の高さにしておくといいでしょう。
「同じ日付は一度だけ表示」するには、日付のテキストボックスの「重複データ非表示」プロパティを「はい」に設定します。
テーブル名とフィールド名から推測するとデータは下記のような関係かとおもいます。
「T_顧客情報_日本支社」と「T_顧客情報_海外本社」は一対一の関係のはずです。
本社が複数あるのは考えられないので。
一対一関係のデータは一つのテーブルに纏めます。
T_顧客情報
顧客ID 主キー
会社名
英語表記
購入サイクル
海外本社名
国名
日本支社担当者、海外担当者 はそれぞれ複数ある場合があるということなので、上記のデータとは一対多の関係になります。
T_国内担当者
国内担当者ID 主キー
顧客ID
担当者名
T_海外担当者
海外担当者ID 主キー
顧客ID
担当者名
テーブルをこのように変更して、同じフィールド名同士でリレーションシップを設定してクエリを作成すれば入力可能なクエリになるはずです。
データベースのテーブルの設計には「正規化」というセオリーがあります。まずは、これについて理解をしておいてください。
下記のページの「正規化」の項目の説明が分かりやすいと思います。他にもWEB検索すると解説ページが見つかりますので分かり安そうなページを読んで理解を深めておくことをお勧めします。
columnプロパティを使用することで解決できました。お騒がせ致しました。
この掲示板は画像をアップロードできますので、リンクではなくアップロードして表示させてください。
リンク先の画像をダウンロードしてここにアップロードしておきます。