• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:MonthCalendarの選択範囲の日数)

MonthCalendarで選択範囲の日数を表示する方法

このQ&Aのポイント
  • MonthCalendarとDataGridViewを使用して、ユーザーが選択した範囲の日数を一行に表示する方法を教えてください。
  • 選択した範囲の日数を一行に表示するために、1/1から31日までの列を作成し、列の名前に日付を表示させたいです。
  • 最終的には、選択した範囲内の社員の勤怠表を表示したいため、社員データと日勤データのテーブルを組み合わせて表示する方法を教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • qtea
  • ベストアンサー率77% (38/49)
回答No.3

>テーブル1・・・勤務表 >日付 | 社員ID | 勤怠  の3列です。 >テーブル2・・・社員名簿です。 >社員ID | 氏名  の2列(抜粋です) この場合だと、以下のようなSQL文を実行すれば、良いと思います。 Access2003では、このSQL文は動作しました。 SELECT テーブル1.社員ID,テーブル2.氏名, MAX(IIF(テーブル1.日付=#2006/10/01#, テーブル1.勤怠, '')) AS [2006/10/01], MAX(IIF(テーブル1.日付=#2006/10/02#, テーブル1.勤怠, '')) AS [2006/10/02], MAX(IIF(テーブル1.日付=#2006/10/03#, テーブル1.勤怠, '')) AS [2006/10/03] FROM テーブル1 INNER JOIN テーブル2 ON テーブル1.社員ID=テーブル2.社員ID WHERE テーブル1.日付 BETWEEN #2006/10/01# AND #2006/10/03# GROUP BY テーブル1.社員ID,テーブル2.氏名 ORDER BY テーブル1.社員ID で、このSQL文を選択した日付で動作するように、コーディングしてます。 Dim sql As String sql = "SELECT テーブル1.社員ID,テーブル2.氏名" While wkdate <= MonthCalendar1.SelectionRange.End sql &= String.Format( _ ",MAX(IIF(テーブル1.日付=#{0:yyyy/MM/dd}#, テーブル1.勤怠, '')) AS [{0:yyyy/MM/dd}]", wkdate) wkdate = wkdate.AddDays(1) End While sql &= " FROM テーブル1 " sql &= " INNER JOIN テーブル2 " sql &= " ON テーブル1.社員ID=テーブル2.社員ID " sql &= String.Format(" WHERE テーブル1.日付 BETWEEN #{0:yyyy/MM/dd}# AND #{1:yyyy/MM/dd}# ", _ MonthCalendar1.SelectionRange.Start, MonthCalendar1.SelectionRange.End) sql &= " GROUP BY テーブル1.社員ID,テーブル2.氏名" sql &= " ORDER BY テーブル1.社員ID" こんな感じ。 あと、補足?ですが、 >sql = "SELECT テーブル1.社員ID,テーブル2.氏名" _ >& "FROM テーブル1 INNER JOIN テーブル2" _ >& "ON テーブル1.社員ID = テーブル2.社員ID" この場合、展開すると、「氏名FROM」のようになり、エラーとなっていまします。 前側の「"」の後にスペースを入れるか、後側の「"」の前にスペースを入れましょう。 上のSQL文だと、下記の○の位置にスペースを入れてください。 sql = "SELECT テーブル1.社員ID,テーブル2.氏名" _ & "○FROM テーブル1 INNER JOIN テーブル2" _ & "○ON テーブル1.社員ID = テーブル2.社員ID" または、 sql = "SELECT テーブル1.社員ID,テーブル2.氏名○" _ & "FROM テーブル1 INNER JOIN テーブル2○" _ & "ON テーブル1.社員ID = テーブル2.社員ID"

nanacyanyo
質問者

お礼

この度もわかりやすい回答をいただきましてありがとうございました。 おかげさまで、きちんと動作させることができました。 SQL文の書き方は、スペースの位置でエラーになることがあるんですね。 大変勉強になりました。 まだ試行錯誤しつつ勉強中ですので、また質問を見かけた際にはどうぞよろしくお願いします。 この度は本当にありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

  • qtea
  • ベストアンサー率77% (38/49)
回答No.4

SQL文初挑戦ということなので、参考になる(かもしれない)サイトを紹介します。 http://www11.plala.or.jp/studyhall/access/index.html http://www.rasweb.co.jp/reference/index.html http://homepage2.nifty.com/inform/vbdb/ No.3のSQL文を理解できようになるまでは、ちょっとたいへんかもしれません…。 #あと、考えてみれば、アクセスのクロス集計クエリーを使って実現する方法もありますね。 #こちらのほうが楽なのかも。

nanacyanyo
質問者

お礼

回答ありがとうございました。 サイトのリンクを貼っていただいてありがとうございました。 覚えることが沢山あって大変そうですが、使いこなせるととても便利だと思うので頑張って勉強します。 アクセスの「クロス集計クエリー」というのをはじめて聞いたのでネットで調べて作ってみました。まだプログラムに組み込んでないのでどちらが良いのかわかりませんが、色々と試して見たいと思います。 この度はお世話になって本当にありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • qtea
  • ベストアンサー率77% (38/49)
回答No.2

>←ここ!の部分でエラーになり、「集計関数の一部として指定された式 '社員ID' を含んでいないクエリを実行しようとしました。」と表示されます。実際のテーブルには他にも項目があるのですが、それが原因でしょうか? SQL文がどこかで間違えてるのだと思います。 No1のサンプルコードは、以下のようなSQLを作っています。 SELECT テーブル1.社員ID, MAX(IIF(テーブル1.日付=#2006/10/01#, テーブル1.勤務形態, '')) AS [2006/10/01], MAX(IIF(テーブル1.日付=#2006/10/02#, テーブル1.勤務形態, '')) AS [2006/10/02], MAX(IIF(テーブル1.日付=#2006/10/03#, テーブル1.勤務形態, '')) AS [2006/10/03] FROM テーブル1 WHERE テーブル1.日付 BETWEEN #2006/10/01# AND #2006/10/03# GROUP BY テーブル1.社員ID ORDER BY テーブル1.社員ID 「集計関数の一部として指定された式 '社員ID' を含んでいないクエリを実行しようとしました。」というエラーは、 GROUP BY テーブル1.社員ID がない場合に出力されることが多いです。 もしかしたら、社員名をだすのに、社員一覧と結合してたりしますか? 例えば、 SELECT テーブル1.社員ID FROM テーブル1 INNER JOIN 社員一覧 ON テーブル1.社員ID=社員一覧.社員ID GROUP BY 社員一覧.社員ID のようにしてたりしませんか?この場合は、 GROUP BY 社員一覧.社員ID を GROUP BY テーブル1.社員ID とするか SELECT テーブル1.社員ID を SELECT 社員一覧.社員ID としないとエラーになります。(ORDER BY あたりも見てください) あとデバッグするときには、 dbadpt.Fill(ds) あたりで一時停止して、変数 sqlの値を見て、SQL文の確認をしてみださい。

nanacyanyo
質問者

お礼

こんにちは。丁寧な回答をしていただきましてありがとうございました。 ご指摘どおり、社員名を出すのに名簿と結合しておりました。 何度かやったのですが、SQL文初挑戦でして、どこに埋め込んだらよいのかわからず試行錯誤しており、うまくいかないのでお時間のある時に下記のコードを見て、どこに入れたら良いのか教えていただけますか? テーブル1・・・勤務表 日付 | 社員ID | 勤怠  の3列です。 テーブル2・・・社員名簿です。 社員ID | 氏名  の2列(抜粋です) sql = "SELECT テーブル1.社員ID,テーブル2.氏名" _ & "FROM テーブル1 INNER JOIN テーブル2" _ & "ON テーブル1.社員ID = テーブル2.社員ID" Dim mdb As String = "C:\テスト.mdb" Dim dbcon As New OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=""" & mdb & """") dbcon.Open() Try Dim wkdate As Date = MonthCalendar1.SelectionRange.Start Dim sql As String sql = "SELECT テーブル1.社員ID"   ←ここに上のSQL文を追加してました。 While wkdate <= MonthCalendar1.SelectionRange.End sql &= String.Format( _ ",MAX(IIF(テーブル1.日付=#{0:yyyy/MM/dd}#, テーブル1.勤務形態, '')) AS [{0:yyyy/MM/dd}]", wkdate) wkdate = wkdate.AddDays(1) End While sql &= " FROM テーブル1 " sql &= String.Format(" WHERE テーブル1.日付 BETWEEN #{0:yyyy/MM/dd}# AND #{1:yyyy/MM/dd}# ", _ MonthCalendar1.SelectionRange.Start, MonthCalendar1.SelectionRange.End) sql &= " GROUP BY テーブル1.社員ID" sql &= " ORDER BY テーブル1.社員ID" Dim dbadpt As New OleDb.OleDbDataAdapter(sql, dbcon) Dim ds As New DataSet dbadpt.Fill(ds) DataGridView1.DataSource = ds.Tables(0) Finally dbcon.Close() End Try 埋め込む場所が他にもあるのでしょうか?上記の結合のSQL文をいれずに実行したらきちんと動作します。

全文を見る
すると、全ての回答が全文表示されます。
  • qtea
  • ベストアンサー率77% (38/49)
回答No.1

MonthCalendar1,DataGridView1があるとして… >ユーザーが選択した日数の取得の仕方 MonthCalendar1.SelectionRange.End.Subtract(MonthCalendar1.SelectionRange.Start) または、 MonthCalendar1.SelectionRange.End - MonthCalendar1.SelectionRange.Start で日数は取得できます。 >取得した範囲内の個別の日付を列の名前に指定するやり方 いろいろやり方は考えられますが、下記を参考にしてみてください。 http://www.atmarkit.co.jp/fdotnet/vblab/gridlab_01/gridlab_01_01.html http://www.atmarkit.co.jp/fdotnet/vblab/gridlab_02/gridlab_02_01.html 単純に選択日付の列をつくるだけなら… DataGridView1.Columns.Clear() Dim wkdate As Date = MonthCalendar1.SelectionRange.Start While wkdate <= MonthCalendar1.SelectionRange.End DataGridView1.Columns.Add(wkdate.ToString("yyyy/MM/dd"), wkdate.ToString("MM/dd")) wkdate = wkdate.AddDays(1) End While でいけますけど、DBの内容を設定するのが、ちょっと面倒そうです。 他には、テーブル1があって、項目が以下のようだとします。 社員ID (KEY) 日付 (KEY) 勤務形態 で、動的にSQLをつくってあげて、むりやり(?)表示させる方法もあります。 Dim mdb As String = "C:\テスト.mdb" Dim dbcon As New OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=""" & mdb & """") dbcon.Open() Try Dim wkdate As Date = MonthCalendar1.SelectionRange.Start Dim sql As String sql = "SELECT テーブル1.社員ID" While wkdate <= MonthCalendar1.SelectionRange.End sql &= String.Format( _ ",MAX(IIF(テーブル1.日付=#{0:yyyy/MM/dd}#, テーブル1.勤務形態, '')) AS [{0:yyyy/MM/dd}]", wkdate) wkdate = wkdate.AddDays(1) End While sql &= " FROM テーブル1 " sql &= String.Format(" WHERE テーブル1.日付 BETWEEN #{0:yyyy/MM/dd}# AND #{1:yyyy/MM/dd}# ", _ MonthCalendar1.SelectionRange.Start, MonthCalendar1.SelectionRange.End) sql &= " GROUP BY テーブル1.社員ID" sql &= " ORDER BY テーブル1.社員ID" Dim dbadpt As New OleDb.OleDbDataAdapter(sql, dbcon) Dim ds As New DataSet dbadpt.Fill(ds) DataGridView1.DataSource = ds.Tables(0) Finally dbcon.Close() End Try あまりほめられたやり方ではないかもしれませんが…

nanacyanyo
質問者

お礼

回答ありがとうございます。 SQLを作って表示させる、というコードをコピーしてデバッグしてみたのですが、後半部分の Dim dbadpt As New OleDb.OleDbDataAdapter(sql, dbcon) Dim ds As New DataSet dbadpt.Fill(ds)  ←ここ! DataGridView1.DataSource = ds.Tables(0) Finally dbcon.Close() End Try ←ここ!の部分でエラーになり、「集計関数の一部として指定された式 '社員ID' を含んでいないクエリを実行しようとしました。」と表示されます。実際のテーブルには他にも項目があるのですが、それが原因でしょうか?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • ピボットテーブルの範囲を選択する事はできますか?

    ピボットテーブルの範囲を選択する事はできますか? ピボットテーブルをクリックして、 CTRL+Aを押すと、 現在アクティなピボットテーブル全体を選択できます。 この動きをマクロの記録で取ってみたのですが Sub Macro1() Range("A3:B9").Select Range("B8").Activate End Sub しか記録されてませんでした。 やりたいことは、該当のピボットテーブル全体を選択し、 その範囲に名前を付けたいのですが まずピボットテーブルの範囲を選択するマクロ(VBA)を作成したいです。 ピボットテーブル名を指定して範囲を選択することはできないのでしょうか? Cells(Rows.Count, "A").End(xlUp).Row など最終行、最終列を取得していくしかないのでしょうか?

  • 複数の名前の定義をした範囲を選択してピボットテーブ

    複数の名前の定義をした範囲を選択してピボットテーブルを作成することは可能ですか? 例えば、「A」というシートには、 シート名 番号 日付 A 1 1月1日 A 2 1月1日 A 3 1月1日 というデータが入っています。 参照範囲を=A!$A$1:$C$4にして、Aという名前の付けました。 同じように、 「B」というシートには、 シート名 番号 日付 B 1 1月1日 B 2 1月1日 B 3 1月1日 というデータが入っています。 参照範囲を=B!$A$1:$C$4にして、Bという名前の付けました。 この二つの名前を基にピボットテーブルを作成したいのですが、 テーブル/範囲では、一つの名前しか指定できません。 どうすれば複数の名前を選択することができるのでしょうか? アクセスでたとえるのであれば、ユニオンクエリのようなことがしたいです。

  • エクセル:任意の範囲の所定日数を数える

    会社が変形労働制を行っており、各人について勤務していた期間の所定日数を求めたいです。 シート1に会社カレンダーを作成し、A列・・日付  B列・・営業日=0、休日=0とういうカレンダーを作っています。 シート2にA列・・入社日  B列・・退社日 C列にシート1のカレンダーを参照し、各人の在職期間の所定日数を求めるには、C列にどのような式を入れたらいいのでしょうか?

  • エクセルの範囲選択について

     エクセルでの 範囲選択について質問します。 例えば A列に入っているデータのみをすべて範囲選択して 表示方法を変更したいとき A列の一番上の セルをアクティブにし、コントロールキー+オルトキー+↓で 一番下のセルまで範囲選択します。 その後下にスクロールされている画面を 範囲選択を解除しないまま、一番上の画面まで戻すには どうしたらいいのでしょうか? 垂直スクロールバーを使う方法以外で 簡単に戻す方法はあったら教えてください!!!

  • エクセルで休日日数・連休日数を表示するにはどうしたら良いですか?

    休日日数(連休日数)を表示させたいです。 A列には日付がカレンダー通りに並びます。 (日付が飛ぶ・前後するという事はありません) B列にはA列に並んだ日付に対応して土日祝日を判定し、該当する場合1が表示されます。 そこで、C列にB列の小計を出したいのですが、どうしたら良いでしょうか? (例 単独の休日なら1、土日なら2、土日を含む3連休なら3) 但し、表示箇所は小計するセルの2行上(2日前)のセルとしたいです。 よろしくお願いします。

  • Excelでの日数のカウントについて

    A列に日付(重複も含む)のデータがあります。 そこでC列には重複なしの日付と、D列にはその日数が表示されるようにしたいのですが、どうすればいいでしょうか。 画像のような感じにしたいです。

  • VB2005 DateTimePickerのカレンダー表示制御

    お世話になります。 現在、DataGridViewの制御に合わせてカレンダーを表示したりしようと しているのですが、MonthCalendarだと日付「範囲」が選択できて しまうようなので、あまり嬉しくない状況です。 そこで、DateTimePickerを使用して、ロジックで強制的にカレンダーを 表示したり非表示にしたりしたいと思っています。 表示の方は、ググってみたら何とか検索できたので、それを基に やってみたら成功したのですが、カレンダーを閉じる方の処理が うまくいきません。 コントロール(サブクラス)側でEscapeキーをWndProcで送ったり してみたのですが…… 正しいやり方をご存知の方がいらっしゃいましたら、お教えください。 または、MonthCalendarで単一日付のみを選択する方法を教えて頂くのでも 構いません。 よろしくお願いします。

  • マクロ 選択範囲と同一の範囲を違う列で選択する

    いつも回答して頂き感謝感謝です。 今回の質問ですが、下記のマクロで日付が入力されている列の範囲選択が出来ましたが、この選択範囲を元に列を任意に変更し同等の行範囲で選択したいのですがどうしたらよろしいでしょうか?思いつく範囲でマクロを記述しましたがさっぱりでした。御指導の程宜しくお願い致します。 ・B4から下方向に日付が連続で入力されている。 ・C3から右方向に商品名が入力されている。 ・上記の交差する箇所に商品の使用回数が入力されている。 Sub 範囲の選択5() Dim Date1 As Date Dim Date2 As Date Dim 商品名 As Variant Dim b1 As Variant Dim b2 As Variant Dim b3 As Variant With Worksheets("集計用") s1: Date1 = Application.InputBox("最初の日付を2012/12/1のように入力してください。") Set b1 = .Columns("B").Find(Date1, , xlValues, 1) If b1 Is Nothing Then MsgBox "入力した日付が見当たりません。再度入力して下さい。": GoTo s1 s2: Date2 = Application.InputBox("最後の日付を2012/12/31のように入力してください。") Set b2 = .Columns("B").Find(Date2, , xlValues, 1) If b2 Is Nothing Then MsgBox "入力した日付が見当たりません。再度入力して下さい。": GoTo s2 .Range(b1, b2).Select s3: 商品名 = Application.InputBox("商品名を入力して下さい。") Set b3 = .Rows("3").Find(商品名, , xlValues, 1) If b3 Is Nothing Then MsgBox "入力した日付が見当たりません。再度入力して下さい。": GoTo s3 .Range(b3).Select End With End Sub

  • 値を指定しないで、選択範囲を設定、選択範囲内で同じ値なら指定した値を返す方法

    エクセルの質問です 値を指定しないで、選択範囲を設定、選択範囲内で 同じ値なら指定した値を返す方法 ・エクセルバージョン 2001 SP-1 ・OSバージョン  WIN 2000 プロフェッショナル   「ブック1」と「ブック2」があります 「ブック1」には、 ・1列目には「名前」 ・2列目には「売上」 ・3列目には「確率」 ・4列目には「前年比」 「ブック1」例 ああ 10 10% -10 いい 20 20% -20 うう 30 30% -30 .... .... 「ブック2」 ・「名前」が、バラバラに並んでいます ・項目は「名前」「売上」「確率」「前年比」で同様 「ブック2」例 ああ 10 10% -10  いい 20 20% -20 うう 30 30% -30 「名前」は、ざっと680種くらいあります 「ブック1」・「ブック2」で 「ブック1」の1列目の「名前」と 「ブック2」のバラバラにおかれている「名前」が 同じなら、「ブック2」の例のように「売上」「確率」 「前年比」の値を返したいのですが、 なにかいい方法はありますでしょうか。

  • 列選択で勝手に広範囲に範囲選択される

    よろしくお願いいたします。 ・使用環境 エクセル2010 表示は[標準]で[ページ レイアウト]は使用していません。 [範囲選択の拡張]は設定していません。 セルの結合とウィンドウ枠の固定の組み合わせで、行を選択した時に勝手に広範囲に範囲選択されます。 例1) A1:D5の表でA1:B1を結合 セル番地B2を選択して[ウィンドウ枠の固定]を設定 ↓ この状態で1行目を選択すると1~14行目が範囲選択されます。 2行目以降は通常通りに選択可能。 (ウィンドウ枠の固定はG10で固定した場合も同様) 例2) A1:D5の表でB1:C1を結合 セル番地B2を選択して[ウィンドウ枠の固定]を設定 ↓ 1行目を選択すると通常通り1行目のみ範囲選択されます。 セルの結合とウィンドウ枠の固定のどちらかのみの設定の場合は、この現象は発生しません。 使用しているの他のブックでは、列選択でも勝手に範囲選択される現象が起きています。 回避策がございましたら、ご教示ください。

印刷面の汚れ
このQ&Aのポイント
  • 【HL-L2375DW】印刷すると三箇所、汚れが付着します。
  • お使いの環境はMacOSで、無線LANで接続されています。
  • ブラザー製品についての質問です。
回答を見る