Microsoft Access 掲示板

6,622 件中 6,281 から 6,320 までを表示しています。
3

すみません、勘違いをしておりました。
レポートヘッダーとページヘッダーを勘違いをしていました。(テストレポートにレポートヘッダーを作ったつもりだったのがページヘッダーしか作ってありませんでした。)申し訳ありません。うまくできました。

2

ありがとうございます。

AccessはOffice365の32bit版です。
ご提示していただいている確認用コードを、コピペしただけのテスト用レポートを作って、プレビュー、印刷実行を行いましたが、すべて、「プレビューのみです」が返ってきてしまいます。

4
あや 2019/06/08 (土) 22:46:42 38bd8@d57aa

ありがとうございます。できました!!

1

うまくいきませんとは、具体的にどのようにうまくいかないのですか。

Officeは、32bit版ですか、64bit版ですか。
32bit版なら、2013でも問題なくいけるはずです。

64bit版の場合は、標準モジュールの宣言部のAPIの参照のコードを下記のように書き換えてください。

Declare PtrSafe Function apiIsWindowEnabled Lib "user32" _
    Alias "IsWindowEnabled" (ByVal hwnd As LongPtr) As Long
6
ゆか 2019/06/07 (金) 13:14:20 26d08@f2a60

ありがとうございます!できました!

理解力が低い私のために、懇切丁寧に教えて下さり、本当にありがとうございました!
これで、カウントミスや間違った入力を見つけることができそうです。

誠にありがとうございました!

5
名前なし 2019/06/07 (金) 12:01:33 7f2b8@f966d

基本的な考え方は「7日間だけ抽出する」「連続して7日出勤しているなら7レコードあるはずだ」です。
連続3日ということは「4日前は休み=レコードがない」なのでその日までの7日分だけ抽出したら最大でも6レコードしかないはずで「抽出条件:7」で表示されるのはおかしいとなります。

Dcount関数の条件指定を正せばいいのですが、おかしい原因は

  1. 同じ日付が複数ある
  2. 「出勤」以外の日付のレコードがある
  3. 8日以上離れた日付がある

のどれかです。
そこで、おかしいレコードで「7日間だけ抽出する」して、抽出されたレコードを直接見て原因をつかもうというのが>> 3です。

社員CD7  4月2週目  1、連続3日目なら(月曜から出勤として対象日は4/10日)
社員CDの抽出条件に「7」
日付の抽出条件に「>#2019/04/10#-7 And <=#2019/04/10#」
でクエリを表示すると7レコード以上表示されるはずです。
この場合のSQLを記載しますので、新規にクエリを作成し、SQLビューで以下を張り付けてデータシートビューで確認してみてください。

SELECT [T_出退勤].[社員CD], [T_出退勤].日付
FROM T_出退勤
WHERE ((([T_出退勤].[社員CD])=7) AND (([T_出退勤].日付)>#4/10/2019#-7 And ([T_出退勤].日付)<=#4/10/2019#));

表示されたレコードに「おかしい結果」に該当するものがあった場合はそれを弾く条件の追加が必要です。
「おかしい結果」が無い場合はDcount関数の条件が間違っています。最初の式と同じものを記載しますのでコピーしてみてください。

今日まで7日間の出勤数: DCount("社員CD","T_出退勤","社員CD=" & [社員CD] & " and 日付>#" & [日付]-7 & "# and 日付<=#" & [日付] & "#")
3
shige 2019/06/07 (金) 11:24:08 efb60@b63e8

DateAdd("m",1,[日付]) では?
勘ですが(汗)

2
あや 2019/06/07 (金) 10:41:56 38bd8@d57aa

ありがとうございます。

DateAdd("m",1,"日付")
と入力しましたが、データ型が一致しませんというエラーになります。
DateAdd("m",1,#日付#)
としてみましたが、こちらもエラーになってしまいます。
何かほかに必要でしょうか?よろしくお願い致します。

4
ゆか 2019/06/07 (金) 09:27:12 26d08@f2a60

ご回答ありがとうございます。

間違って表示されているパターンは下記の通りでした。
社員CD7  4月2週目  1、連続3日目
            2、連続4日目
      ※連続5日目は表示されていませんでした。

社員CD9  4月の最終週 1、連続3日目
             2、連続4日目
             3、連続5日目
      ※連続6日目は出勤自体がないため表示されていませんでした。
社員CD19  5月最終週  1、連続2日目
             2、連続1日目(1日休んだ後に出勤)
             3、連続2日目
その他にもパターンが全く違う社員が出ている状況です。
もちろん日付が重複しているレコードはない状態です。

賢くない私には、パターン化が見えない状況です。
非常にお手数を取らせてしまい申し訳ありませんが、
よろしくお願いいたします。

3
名前なし 2019/06/06 (木) 16:53:46 f52ac@f966d

直接「T_出退勤」テーブルを見ているわけではないので何ともですが、間違って表示されてしまう人の条件でクエリを表示すると何かわかるかもしれません。

たとえば
間違って表示されてしまう人の社員CDが「3」
表示されてしまう4日目が「2019/5/16」
なら
新しく作ったフィールド(今日まで7日間の出勤数)の抽出条件を削除
社員CDの抽出条件に「3」
日付の抽出条件に「>#2019/05/16#-7 And <=#2019/05/16#」

として表示すると7件以上のレコードが表示されるはずです。
日付が重複しているレコードがあったり、7日間に含まれない日付があったりしませんか?

2
ゆか 2019/06/06 (木) 13:42:59 26d08@f2a60

早速お答えくださり、ありがとうございます。

新しいフィールドに、教えていただいた式を入力させていただいたのですが、
7日連続勤務ではない数字が出てきてしまう状況です。
危惧されている、一日2回入力することはない状況なのですが、
4日目で表示されてしまう人がいる状況です。

引き続き教えていただければ幸いに存じます。
どうぞ、よろしくお願いいたします。

1
名前なし 2019/06/06 (木) 12:57:29 f52ac@f966d

条件を指定してレコードを数える方法としてDCount関数が使えます。

「今日」を基準として7日間の出勤記録が7個あればいいので、新しく作るクエリにフィールドを追加して

今日まで7日間の出勤数: DCount("社員CD","T_出退勤","社員CD=" & [社員CD] & " and 日付>#" & [日付]-7 & "# and 日付<=#" & [日付] & "#")
抽出条件:7

とすれば抽出できます。
※出退勤の記録は1日1回までを前提としています。中休みを入れて午前午後で2回記録がついたりするなんてことがある場合は日付をグループ化したりする必要が出ると思います。

別案
クエリで定義域集計関数を使うと重くなるので「T_出退勤」に連続出勤日数フィールドを用意して出退勤を記録するフォームで入力時に連続出勤日数を記録するといいと思います。

10

自作関数勉強になります。仕事で使っているmdbは、ORACLEとのリンクテーブルでしてフィールドのを追加する事が出来ませんがこの知識は今後役に立ちそうです。有難う御座いました。

9
hatena 2019/06/04 (火) 14:59:45 修正

VBAで自作関数を作成する場合の方法です。

標準モジュールに下記の関数を作成してください。

Public Function IncludWords(sText, Words) As Boolean
    If Nz(sText, "") = "" Or Nz(Words, "") = "" Then Exit Function
    
    Dim Word

    For Each Word In Split(Words, " ")
        If sText Like "*" & Word & "*" Then
            IncludWords = True
            Exit For
        End If
    Next

End Function

クエリで下記のように設定してください。

フィールド 式1: IncludWords([対象フィード], "○○ □□ △△")
抽出条件  False

上記のように禁止ワードを空白区切りで入力します。
これで、○○、□□、 △△ のどれかを含むものは除外されます。

抽出条件を True にすればどれかを含むものが抽出されます。

8
名前なし 2019/06/04 (火) 14:58:11 1a3c7@f966d

やっぱりクエリでやろうとすることがスマートじゃないんじゃないかなぁと思いつつ
クエリにフィールドを一つ増やして
Eval(BuildCriteria("'" & [対象フィールド] & "'",10,"*" & Replace([検索文字列],",","* or *") & "*"))
抽出条件:false
目的も状況もわからずスマートではないと思っているのでとりあえず解説はありません

7

色々ご教示頂き有難う御座いました。テーブル試しに作ってやってみます。有難う御座いました。

6

Like "*[!ABC]*" ではだめなら、Like演算子のみでは無理です。

上の回答の方法か、VBAで自作関数を作成することになります。

禁止ワードテーブルを作成したほうが、ワードの編集、追加は楽だと思います。
複数のクエリで使用する場合も一か所の編集で済みます。

5

*で囲まれた範囲は、フォントを斜体にするいう意味になりますので、
そのようなコードや式を記述する場合は、バッククォート ` で囲んでください。
バッククォートは、Shift+@ で入力できます。

`Like "[○,○,・・・]"`

4

ご回答有難うございます。Not Like "*A*" AND Not Like "*B*" AND Not Like "*C*" で現在複数文字の曖昧抽出を行なっていますが、複数文字列の場合でnot like  "*○○*" AND ・・・をコンパクトに行いたいと思っています。Not Like "A" AND Not Like "B" AND Not Like "C"が複数文字列である場合の分解しない状態をご教授願えないでしょうか。宜しくお願い致します。

4

データベースファイルを長く使用していると、ゴミがたまって、ある日、突然不具合が発生する、破損するというようなことがたまにあります。それを防ぐために、下記を参考にしてください。

AccessのDBファイルを長期的に安定して使用するには - hatena chips

今回の回答の方法も上記にあります。あとは、バッグアップは定期的にとるようにしましょう。

3
hatena 2019/06/04 (火) 13:34:50 修正

Like "*[ABC]*" は、一文字単位で、AまたはBまたはCを含むものという意味ですがそれでいいのでしょう。
分解すると、下記の意味になります。
Like "*A*" OR Like "*B*" OR Like "*C*"

一文字単位でいいなら、
Like "*[!ABC]*"
とすれば、A, B, C のすべてを含まないものという条件になります。分解すると、
Not Like "*A*" AND Not Like "*B*" AND Not Like "*C*"
となります。

3
totoo 2019/06/04 (火) 13:32:54 ac29f@d9723

お世話様です。全部インポートして、現在ところ正常に動いています少。
まだ少し不安もありますが、とりあえずこれで行ってみようと思います。
ありがとうございました。

2

ご回答誠に有難うございます。大量にあるわけでは、無いのです。AND では無く ORの場合は、
Like "[○,○,・・・]"があり、ANDでもこの様な事が出来ないかなと思いまして。見易さ、編集のし易さを考えています。テーブルを作らない方法をお願い致します。

1
hatena 2019/06/04 (火) 11:18:03 修正

非表示の対象が大量にあるのなら、「非表示リスト」テーブルを作成してそれを利用するといいでしょう。

禁止ワードリスト

禁止ワード
○○
△△
□□
◆◆

クエリのフィールド欄に下記の式を設定。

式1: DLookup("禁止ワード","禁止ワードリスト","'" & [対象フィールド] & "' Like '*' & [禁止ワード] & '*'" )

抽出条件欄には、下記を設定。

Is Null

禁止ワードの追加や変更があった場合、禁止ワードリストを変更するだけですみます。

3
いのそらん 2019/06/01 (土) 21:19:41 4a53a@5f14a

ありがとうございます。
予定の無い月に移動してもしょうがないので、さっそくアドバイスに通りに変更しました。
無事動作も確認できました。ありがとうございます。

2

それで、OKですね。

あるいは、

SetCalendar DMax("日付", "T_予定")

とすれば、T_予定テーブルの最新日の月に移動します。

1
いのそらん 2019/06/01 (土) 11:57:58 4a53a@5f14a

自己解決?

Private Sub Form_Open(Cancel As Integer)
Dim i As Integer

    For i = 1 To 42
        Me("T" & i).OnClick = "=SetDate(" & i & ")"
    Next
    Me.cmdPrev.OnClick = "=MoveMonth(-1)"
    Me.cmdNext.OnClick = "=MoveMonth(1)"
    SetCalendar DLookup("日付", "T_予定")
End Sub

    SetCalendar DLookup("日付", "T_予定")

    SetCalendar Date

に変えたらとりあえず移動したようです。
正しいのでしょうか?

2
totoo 2019/05/31 (金) 22:36:55 7b765@027df

ありがとうございます。
月曜日出社後に試してみます。

1

新規ファイルを作成して、そのファイルにすべてのオプジェクトをインポートして、そのファイルを使用するようにしてみてください。
それで改善する場合があります。

2007はサポートが終了しているので、新しいバージョンへの移行も検討された方がいいかと。

Office にはサポート期限があります! 2017年10月10日(火)、Office 2007 の 延長サポートが終了します。余裕をもったご準備を。

11
ゆきぴ 2019/05/30 (木) 09:55:21 598e9@20787

色々お気遣いいただきありがとうございました。
今回はMENU画面で個別のフォームを開くボタンの前にポップアップで番号を入力する画面を作成しました。
この形でOKが出たのでこのままにしておこうと思います。(^^;)

またお聞きすることがたくさん出てくると思いますのでよろしくお願いします。

10
hatena 2019/05/29 (水) 20:03:49 修正

毎月集計のクエリをレコードソースとする表形式のレポートを作成します。
レポートウィザードを使うと簡単にできます。
詳細セクションにテキストボックスを配置して、
下記のように設定します。

コントロールソース =[入庫数合計]-[出庫数合計]
集計実行 全体

以上です。

レポートは、印刷プレビューではなく、レポートビューで表示すると一覧性が高いものになります。

2
ojyamajyo 2019/05/29 (水) 13:01:13

ありがとうございます!
できました!

1
shige 2019/05/29 (水) 09:28:51 d1a4b@b63e8

DoCmd.SetWarnings False '←コメントの非表示?
削除の処理~
DoCmd.SetWarnings True '←コメントの表示

9
igaguri 2019/05/28 (火) 07:08:35 32a1e@d14a6

御世話になります。クエリでなくても大丈夫です。

8

クエリでないとダメですか。
クエリをレコードソースとするレポート(印刷プレビューまたはレポートビュー)なら、テキストボックスの「集計実行」プロパティの設定で簡単に表示できます。

クエリだとDSum関数かサブクエリで実現することになりますが、かなり複雑なものになります。

6
igaguri 2019/05/27 (月) 16:27:56 32a1e@d14a6

ありがとうございました。無事に抽出できました。
また、細かな点を別途ご指摘いただきましてありがとうございます。
皆様からご教授いただいたモノをメモにして整理させていただいています。

5
名前なし 2019/05/27 (月) 15:47:45 1b7fd@f966d >> 4

あぁ、よく見たら最初の式はちゃんとシングルクォーテーションでくくった形になってますね。3.は問題ありませんでした。訂正します。

ただ、「#」は不要です。
like演算子を使った時の「#」は何でもいい1文字の数字となるので、最初の式では例えば「0April 20180」~「9April 20189」の100パターンに一致するものを抽出するという設定になります。

8
ゆきぴ 2019/05/27 (月) 14:51:20 598e9@20787

ありがとうございます。
フォームを送りたいのですが会社のセキュリティ上ページが開けません。
今は別フォームでIDを入力するフォームを作成して、txt氏名IDの規定値に =[Forms]![F_ID]![txtID] を設定したら入力されたIDが表示されました。
menu画面 ⇒ ID入力画面 ⇒ カレンダー表示 となるのでもう少しスマートな方法がないかと模索中です。(^^;)

4
名前なし 2019/05/27 (月) 14:36:14 1b7fd@f966d

filterはレコードソースのフィールドに対して働きます。
テキストボックス「月」のコントロールソースは「月」になってますか?

以下、以前からの質問の延長であると想定した回答です。

Me.Filter = "[入出庫日 を月でグループ化] = '" & Me.検索月 & "'"

ではどうでしょう?

その他あれこれ
1.[入出庫日 を月でグループ化]
フィールド名に半角スペースが入っている場合は[]で囲む必要があります。煩雑になるのでフィールド名に半角スペースは使わないと決めてしまうといいと思います。

2.like
like演算子はワイルドカードを用いた比較に必要な演算子です。完全一致でいい今回は「=」でいいと思います。

3.#(~)#
データの種類を指定する囲み文字ですが、format関数で出力した結果は文字列型になるので文字列同士の比較となるよう「'(~)'」のようにシングルクォーテーションで囲みましょう。