マンガでよめる痔のこと・薬のこと

ACCESSで日付の入ったデータがあります。
これらのデータから、日を指定するとその週の月曜~日曜まで出るようにしたいのですが、そのようなことはできるのでしょうか。
また、できればその次の週以降も表示させたいのですが‥。

宜しくお願いします。

A 回答 (3件)

少し、回答を質問に沿ったものに修正しておきます。



質問者は月曜日を週の始まりとしているようです。
この場合、先に示した Monday関数、Sunday関数は、希望の日付を戻さないと思います。
次は、変形版のMonday関数、Sunday関数のテスト結果です。

[イミディエイト]
? Monday("2007/05/14")
2007/05/14
? Monday("2007/05/20")
2007/05/14
? Sunday("2007/05/14")
2007/05/20
? Sunday("2007/05/20")
2007/05/20

2007/05/14(月曜日)
2007/05/20(日曜日)

ですので、先の回答で示した関数の不具合は是正されています。

Public Function Monday(ByVal Hiduke As Date) As Date
  Dim D As Date
  
  D = DateAdd("d", 1, DateAdd("d", (Weekday(Hiduke) - 1) * -1, Hiduke))
  Monday = D + (D > Hiduke) * 7
End Function

Public Function Sunday(ByVal Hiduke As Date) As Date
  Dim D As Date
  
  D = DateAdd("d", -1, Monday(Hiduke + 6))
  Sunday = D - (D < Hiduke) * 7
End Function
    • good
    • 0
この回答へのお礼

大変ご丁寧にありがとうございます。
今回は2つ目の回答者様のものでやりたかったことができましたので、お教え頂いた方法は使いませんが、
今後ACCESSの使い方や、今回のやり方でもできないパターンが出てきた場合など、
ぜひぜひ参考にさせて頂ければと思います。

あとお二方に最高ポイントをお付けしたいのですが不可能なので、こういうポイントの付け方になりましたこと、お詫びし、アドバイスに感謝いたします。

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

お礼日時:2007/06/13 10:43

すでに入力されているテーブルから抽出するのかな



日付の抽出条件欄に

Between DateAdd("d",-Weekday([日を指定],2)+1,[日を指定]) And DateAdd("d",7-Weekday([日を指定],2),[日を指定])
    • good
    • 0
この回答へのお礼

すごい‥。さんざ悩んだのですが、数行でできてしまうのですね‥。
本当に助かりました。ありがとうございました!

お礼日時:2007/06/12 09:38

まずは、[イミディエイトウインドウ] を開いて日曜日を求めてみましょう。



? Weekday("2007/05/09")
4
? DateAdd("d",-3,"2007/05/09")
2007/05/06
? DateAdd("d", (Weekday("2007/05/09")-1)*-1, "2007/05/09")
2007/05/06
? DateAdd("d", (Weekday("2007/05/06")-1)*-1, "2007/05/06")
2007/05/06
? DateAdd("d", (Weekday("2007/05/12")-1)*-1, "2007/05/12")
2007/05/06

次に、土曜日を求めてみましょう。

? DateAdd("d", (7-Weekday("2007/05/06")), "2007/05/06")
2007/05/12
? DateAdd("d", (7-Weekday("2007/05/12")), "2007/05/12")
2007/05/12

ここまでテストすれば、Monday関数、Saturday関数も作成可能です。

? Monday("2007/05/06")
2007/05/07
? Monday("2007/05/12")
2007/05/07
? Saturday("2007/05/06")
2007/05/12
? Saturday("2007/05/12")
2007/05/12

さて、実際に、テーブル[日報]より月曜日から土曜日までを抽出してみましょう。

<クエリ1>
ID______日付
127____2007/05/07
128____2007/05/08
129____2007/05/09
130____2007/05/10
131____2007/05/11
132____2007/05/12

Accessが作成したクエリ1を[SQLビュー]で見ると、次のようです。

SELECT 日報.ID, 日報.日付, *
FROM 日報
WHERE (((日報.日付) Between Monday("2007/05/09") And Saturday("2007/05/09")));

Public Function Monday(ByVal Hiduke As Date) As Date
  Monday = DateAdd("d", 1, DateAdd("d", (Weekday(Hiduke) - 1) * -1, Hiduke))
End Function

Public Function Saturday(ByVal Hiduke As Date) As Date
  Saturday = DateAdd("d", 7 - Weekday(Hiduke), Hiduke)
End Function

ここまで書いて月曜日から日曜日という特殊な抜き出し方であることに気が付きました。
同じ要領で Sunday関数を作ればいいと思います。

Public Function Sunday(ByVal Hiduke As Date) As Date
  Sunday = DateAdd("d", 6, Monday(Hiduke))
End Function
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QAccessで日付のみのデータから週次集計したい

Accessで、ローデータとしてDate(yyyy/mm/dd)情報のみを持っているものに対して、週次集計をしたいと思っています。関数などで、週としてのまとまりを自動でつくることはできないでしょうか?

Aベストアンサー

DatePart 関数 - Microsoft Office Online
http://office.microsoft.com/ja-jp/access/HA012288121041.aspx

と、言う関数がありますので、クエリ上で
DatePart("ww",[対象フィールド])
で、週次集計可能ですが・・・Format関数あたりで、一工夫しないと年越し等がある場合、対応が難しくなってくるかな?

Qアクセス・クエリの抽出条件(翌日以降)

WinXP、OfficeXPまたはOffice2000のアクセスを使用してクエリを
作成しているのですが、抽出条件の設定方法を教えて下さい。

データベースには"年月日"の情報があり、それは当日及び翌日以降の
年月日情報です。
その中から、翌日以降だけのデータを抽出したい場合にどのような
抽出条件を入力すれば良いのでしょうか。

Aベストアンサー

>上記の「Date」には具体的に年月日が入るのでしょうか。
>その場合、毎日「Date」の年月日を変更する必要があると思うのですが

Date()とすれば、システム日付が自動で設定されますので、
自分で変更する必要はありません。
例えば今日、「>=Date()」と実行すれば実際は、
「>=2006/09/26」となり、明日は「>=2006/09/27」
となるのです。

QOfficeアクセス テーブル「テキスト型」⇒「日付型」への変換について

テーブルにデータが保管されており、そのフィールドの一つに「テキスト型」で”20080301”のようなデータを持っています。これを「日付/時刻型」”2008/03/01”のように変換したいのですが、どのようにすればよいのでしょうか。

※ちなみにこのオリジナルデータは毎日、自動的にテーブルにダウンロードされており、このテーブル自体の型を予め「日付/時刻型」に変換すると、日々のデータ取得時にエラーとなってしまいます。ですので、「日付/時刻型」のフィールドを持った新規のテーブルに、この”20080301”のデータを変換し格納したいのですがどのようにすればよろしいでしょうか。

テーブル⇒デザインより、該当のフィールドの型を「テキスト型」⇒「日付/時刻型」へ直接変換してしまうと、「データの変換中にエラーが発生しました。○○件のレコードのデータが失われました。」と表示されます。素人のため、なるべく追加クエリや更新クエリや簡単な関数のみでの方法を教えていただけたら幸いです。

Aベストアンサー

テーブルに日付時刻型フィールドを追加して、
更新クエリを使って、#1さんが提案されている
数式を使えばよいのでは?

QACCESSで空白のデーターをクエリで判定/識別する方法を教えてくださ

ACCESSで空白のデーターをクエリで判定/識別する方法を教えてください。
EXCELでは空白を""で判定/識別表していますがACCESSではどうなるのでしょうか。

下の例はフィールドに試験番号があればその番号を、空白なら”欠席”と表示しようとしています。
IIf(([試験番号]="空白の場合何を入れる?"),[試験番号],"欠席")

Aベストアンサー

もうひとつの書き方は
式1: IIf([試験番号] Is Not Null,[試験番号],"欠席")
第2、第3引数の、質問の順序にあわせるとこうなる。

Qエクセルで一週間単位で数値を集計する方法について質問です。

エクセルで一週間単位で数値を集計する方法について質問です。

毎週”日曜日まで”で区切った合計数値を算出したいのですが、
月が変わったりすると、また合計する範囲を選択し直さなくてはならないのが面倒です。
曜日を入力している箇所があるので、”日”と表示される箇所を数えたりして、
1週目・2週目の合計を自動で計算できる方法はありますでしょうか。

必ず”日曜日”で区切るので、5月でしたら、5/1~2、5/3~5/9・・・と
数値を合計したいです。

↑とても説明が下手だと思うのですが、
画像から汲み取っていただけましたら、是非解決策を頂きたいです。

Aベストアンサー

あまり詳しくないですが回答させてください。

A3 [=IF(NOT(MONTH(A2)=MONTH(A2+1)),"",A2+1)] A2に月の初めを入力すると自動的に日にちが表示されます。
B2 [=IF(A2="","",WEEKDAY(A2))]右クリック→セルの書式設定→ユーザー定義[aaa]
D2 [=IF(B2=1,0,1)]
D3 [=IF(A3="","",IF(B3=2,D2+1,D2))]
F4 [=MAX(D2:D32)]
F5 [=MIN(D2:D32)]
F6 [=IF(F5+1>$F$4,"",F5+1)]
H5 [=SUMIF($D$2:$D$32,F5,$C$2:$C$32)]

あとは下にびろーんとやってみてください。
間違えがあれば連絡下さい。

QACCESS IIF関数 複数条件の設定について

 選択クエリにおいて、あるフィールド「 X」 のレコード数値が
 
  0<[X]<=50   であれば A 
  50<[X]<=100  であれば B 
  100<[X]<=150  であれば C

 と表記させるフィールド「Y」を追加したいと考えています。
 この場合、Yのフィールド設定で指定する数式についてご教授願います。

 一応、
  IIf(0<[X]<=50,"A","") Or IIf(50<[X]<=100,"B","") Or IIf(100<[X]<=150,"C","")

  としましたが、実行すると、Yの列がすべて「-1」と表記されてしまいます。

 何卒よろしくお願いいたします。

Aベストアンサー

a)IIF関数で対応する場合:
 IIF関数の第2引数または第3引数に、IIF関数を入れ子とする必要があります。

式: IIF([X]<=0, "", IIF([X]<=50, "A", IIF([X]<=100, "B", IIF([X]<=150, "C", ""))))


b)別の組込関数を使用する場合:
 IIF関数は二択ですので入れ子にする必要がありますが、Accessのクエリで
 使用できる、似た機能の関数に、Switch関数というものもあります。
 これであれば、入れ子にする必要がなくなります。
 (詳しくは、Accessのヘルプを参照下さい)

式: Switch([X]<=0, "", [X]<=50, "A", [X]<=100, "B", [X]<=150, "C", True, "")


なお、数学あるいは一般生活では確かに「0<[X]<=50」という表記をしますが、
Accessの関数などではこれだと正しい結果が得られません。
正しく認識させるためには、等号・不等号を挟んだ式は、「左辺」と「右辺」の
2つの要素からなる形にする必要があります。
(「0<[X]<=50」は「[X]>0 And [X]>=50」と分割してやる、と)

但し、今回のご質問のような『連続した範囲』であれば、前(左)で既出となる
式の要素で「[X]<=0」が「真(=-1)」とならなかった時点で、「[X]>0」が保証
されますので、上記のように、「[X]>0」を省略して「[X]<=50」だけを条件として
指定すればOk、ということになります。
(「0<[X]<=50」の次が「80<[X]<120」などのように、「50~80」が欠けた
 場合は、省略ができない、と)


【参考】
「0<[X]<=50」は、このままだと「0 < ([X]<=50)」という式と解釈されます。
この場合、「[X]<=50」は、「真(=-1)」か「偽(=0)」か「Null」のいずれかに
なります。
何にせよ、「0<[X]<=50」全体として「正(=-1)」となることがないため、
ご質問の式では、IIF関数は常に第3引数に指定された値「""」を返す
ことになります。

この結果、式全体としては「"" Or "" Or ""」という形となり、「0かNull」
以外なので、「真(=-1)」という値が返された、ということです。

なお、Nullについては、以前、他の方の質問につけた回答も、併せて参考までに:
http://oshiete.goo.ne.jp/qa/4850675.html

a)IIF関数で対応する場合:
 IIF関数の第2引数または第3引数に、IIF関数を入れ子とする必要があります。

式: IIF([X]<=0, "", IIF([X]<=50, "A", IIF([X]<=100, "B", IIF([X]<=150, "C", ""))))


b)別の組込関数を使用する場合:
 IIF関数は二択ですので入れ子にする必要がありますが、Accessのクエリで
 使用できる、似た機能の関数に、Switch関数というものもあります。
 これであれば、入れ子にする必要がなくなります。
 (詳しくは、Accessのヘルプを参照下さい)

式: Switch([X]<=0, "", [X]<=50, "A"...続きを読む

QACCESSで縦に並んだテーブルデータを横に並べることは出来ますか?

お世話になります。現在大量にデータを前に悩んでいます。

テーブルに以下のようなデータがあります。

| 薬剤名 | 効果 |
-----------------------
| A剤  | 頭痛 |
| A剤  |生理痛 |
| A剤  | 発熱 |
| B剤  | 歯痛 |
| B剤  |生理痛 |
| C剤  | 頭痛 |

これを、薬剤名ごとにまとめ効果を横へ並べる。

| 薬剤名 |効果1|効果2|効果3|効果4|
-------------------------------------------
| A剤  | 頭痛 |生理痛| 発熱 | |
| B剤  | 歯痛 |生理痛|   | |
| C剤  | 頭痛 |   |   | |

ことって出来るのでしょうか?
効果の数はいくつになるか分かりません。現在は最大7つですが、今後それ以上の物が出る可能性もあります。

ACCESSでは無理なことでしょうか?

また、ACCESSのバージョンは2002です。なお、ACCESSについては、使用法を含め初心者に毛が生えたくらいの知識しかありません。申し訳ありませんが「サル」にもわかるくらいの優しさでご指導願えれば幸いです。

よろしくお願いします。

お世話になります。現在大量にデータを前に悩んでいます。

テーブルに以下のようなデータがあります。

| 薬剤名 | 効果 |
-----------------------
| A剤  | 頭痛 |
| A剤  |生理痛 |
| A剤  | 発熱 |
| B剤  | 歯痛 |
| B剤  |生理痛 |
| C剤  | 頭痛 |

これを、薬剤名ごとにまとめ効果を横へ並べる。

| 薬剤名 |効果1|効果2|効果3|効果4|
-------------------------------------------
| A剤  | 頭痛 |生理痛| 発熱 ...続きを読む

Aベストアンサー

こういう場合は、<薬剤別効果一覧>などのテーブルを作成したらどうですか?

・<薬剤別効果一覧>テーブルをクリアする。
・<薬剤別効果情報>を取得する。
・<薬剤別効果一覧>テーブルに追加する。

一種の一時テーブルを作成するということです。
これですと、作成後は、いとも簡単に閲覧したりレポートに出力できます。

*少し、ADO を利用することになります。コードはサワリだけ。

薬剤名 効果総数 効果名_1 効果名_2 効果名_3
A剤   3    頭痛   生理痛  発熱

このように、<薬剤別効果一覧>テーブルにデータを登録するコードは以外と簡単です。

Private Sub コマンド_薬剤別効果一覧追加_Click()
  Dim isOK  As Boolean
  Dim strSQL As String
  
  isOK = CnnExecute("DELETE FROM 薬剤別効果一覧")
  If isOK Then
    strSQL = "INSERT INTO 薬剤別効果一覧 " & _
         "(薬剤名, 効果総数, 効果名_1, 効果名_2, 効果名_3)" & _
         " Values " & _
         "('A剤', 3, '頭痛', '生理痛', '発熱')"
    isOK = CnnExecute(strSQL)
    If isOK Then
      MsgBox "[薬剤別効果一覧] にデータを追加しました。"
    End If
  End If
End Sub

僅かに、CnnExecute()を自作ライブラリに追加するだけで、このように読めば判るコードが書けます。
これならば、質問者にとっても別に難しいことではないと思います。
SQL文は、Accessプロジェクトのそれですので Jetとは違うかも知れませんが基本は同じです。
課題は、strSQL の生成にあります。
ここが一つにハードルです。
まあ、それも含めて書くと、一つのプロシージャ全体を請け負うことになりますのでチョットです。

質問レベルからして、いずれ、この領域に踏み込む必要ありと感じましたので・・・。

Public Sub ErrMessage(ByVal CnnErrors As ADODB.Error, ByVal strSQL As String)
   MsgBox "ADOエラーが発生しましたので処理をキャンセルします。" & Chr$(13) & Chr$(13) & _
      "・Err.Description=" & CnnErrors.Description & Chr$(13) & _
      "・Err.Number=" & CnnErrors.Number & Chr$(13) & _
      "・SQL State=" & CnnErrors.SQLState & Chr$(13) & _
      "・SQL Text=" & strSQL, _
      vbExclamation, " ADO関数エラーメッセージ"
End Sub

Public Function CnnExecute(ByVal strSQL As String) As Boolean
On Error GoTo Err_CnnExecute
   Dim isOK As Boolean
   Dim cnn As ADODB.Connection
  
   isOK = True
   Set cnn = CurrentProject.Connection
   With cnn
     .Errors.Clear
     .BeginTrans
     .Execute strSQL
     .CommitTrans
   End With
Exit_CnnExecute:
On Error Resume Next
   cnn.Close
   Set cnn = Nothing
   CnnExecute = isOK
   Exit Function
Err_CnnExecute:
   isOK = False
   If cnn.Errors.Count > 0 Then
     ErrMessage cnn.Errors(0), strSQL
     cnn.RollbackTrans
   Else
     MsgBox "プログラムエラーが発生しました。システム管理者に報告して下さい。(CnnExecute)", _
        vbExclamation, " 関数エラーメッセージ"
   End If
   Resume Exit_CnnExecute
End Function

こういう場合は、<薬剤別効果一覧>などのテーブルを作成したらどうですか?

・<薬剤別効果一覧>テーブルをクリアする。
・<薬剤別効果情報>を取得する。
・<薬剤別効果一覧>テーブルに追加する。

一種の一時テーブルを作成するということです。
これですと、作成後は、いとも簡単に閲覧したりレポートに出力できます。

*少し、ADO を利用することになります。コードはサワリだけ。

薬剤名 効果総数 効果名_1 効果名_2 効果名_3
A剤   3    頭痛   生理痛  発熱

この...続きを読む

QAccessのRefresh・Requery・Repaintの違い

Requeryはもう一度ソースレコード(テーブル)を読み込むようです。このとき、テーブルの先頭レコードに移動してしまいます。
Refreshは最新のレコード(テーブル)を再表示するような気がします。レコードの移動は起こらない気がします。
Repaintは、VBAでキャプションなどを変更したとき使っています。
でも、よくわかっていません。
どんなときにどんなメソッドを使えばいいのでしょうか?
詳しい方、よろしくお願いいたします。

Aベストアンサー

たびたびすみません。
調べてたらこんなのがでてきました。
http://www.nurs.or.jp/~ppoy/access/access/acF007.html

参考URL:http://www.nurs.or.jp/~ppoy/access/access/acF007.html

QアクセスVBAのMe!と[ ]

基本的なことですみません。

アクセスのイベントプロシージャで、Me!ってありますけど、これはどういう意味なんでしょうか?

また、Me!の後に、Me!.~~と書く場合と、Me!.[~~]と書く場合がありますが、どこが違うのでしょうか?

Aベストアンサー

>プロシージャ内で[]を使う場合は、そのフォーム外のオブジェクトを使う場合と考えてよろしいでしょうか?
別のオブジェクトを使う場合だけではありません。
Hensu = Me![Text1]のようにHensuという変数に自身のTest1の値を代入する場合のように。
[]で括られているのがオブジェクト名やコントロール名だよという事。
クエリの抽出条件に存在しない[?]とすれば?というコントロール等が参照できないので?というダイアログが表示されるように?というオブジェクトやコントロールは何?と聞いてくるように。
>フォーム内のオブジェクトの場合はあくまでMe!で良いのでしょうか
Forms.[フォーム名]![コントロール名]やForms![フォーム名]![コントロール名]が構文。
アクティブなフォームが自分自身ならForms![フォーム名]の変わりにMeでもOKですという事。

と言う解釈の方が良いと思います。

Q2つのテーブルに共通するレコードを削除したい

2つのテーブルがあり、両方にID番号フィールドが存在しています。
Aテーブルは元のデータ
Bテーブルは削除したいレコードのID番号
という構成になっているとき、
AテーブルとBテーブルの共通するレコードを削除するにはどうすればよいでしょうか。

ものすごく単純な質問で申し訳ないのですが...宜しくお願いします

Aベストアンサー

1、テーブル内容
 Aテーブル フィールド:ID番号、・・
 Bテーブル フィールド:削除番号、・・

2、まず、選択クエリで削除したいIDのサブクエリを作る。
  ・AテーブルとBテーブルのIDを結合。
  ・表示のSQLでサブクエリをゲット
   内容は
     SELECT Aテーブル.ID番号
     FROM Aテーブル INNER JOIN Bテーブル
ON Aテーブル.ID番号 = Bテーブル.削除ID;   

3、次に削除クエリを作成
  ・新規クエリで削除クエリを作成
  ・Aテーブルのみ選択
  ・ID番号を下にドラッグ
  ・その抽出条件に2で作成したサブクエリを「;」を外して
   IN (  )をつけて入力
   内容は
     IN (SELECT Aテーブル.ID番号
     FROM Aテーブル INNER JOIN Bテーブル
     ON Aテーブル.ID番号 = Bテーブル.削除ID)

 これで、クエリを実行することにより、Aテーブルの内容が、
 Bテーブルの削除番号と同じID番号のレコードを削除できます。

1、テーブル内容
 Aテーブル フィールド:ID番号、・・
 Bテーブル フィールド:削除番号、・・

2、まず、選択クエリで削除したいIDのサブクエリを作る。
  ・AテーブルとBテーブルのIDを結合。
  ・表示のSQLでサブクエリをゲット
   内容は
     SELECT Aテーブル.ID番号
     FROM Aテーブル INNER JOIN Bテーブル
ON Aテーブル.ID番号 = Bテーブル.削除ID;   

3、次に削除クエリを作成
  ・新規クエリで削除クエリを作成
  ・Aテーブルのみ選択
...続きを読む


人気Q&Aランキング