- ベストアンサー
ACCESS データシートビューでの回転
こんにちは。 ACCESSに詳しい方のご意見をうかがいたくお尋ねします。 現在エクセルで処理を行っている業務があるのですが、これを効率化のためにACCESSに移植する事を検討中です。 その中に受注一覧表というのがあり、数か月分の受注状況をフォームに表示したいのですが、現在のエクセルでは日付を横方向にスクロールするように作っています。 ACCESSでもそれと同じ動きを実現するためには、レコードを一番上の行(もしくは下の行)に追加するのではなく、一番右の行に追加するという作る必要があります。 データシートビューでそのような表示は可能でしょうか?
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
できますなら、ユーザーに日付を縦方向に取る表や画面になれてもらうのが一番コストがかからないと思いますけど でないと無駄な作業ばかりが増える羽目になると思いますけど データベースは一般的に時間軸は縦方向に取るように仕組み上なっていますからそれに逆らうとあとあと不便なことになってしまう気がします 今回限りにしておくことをお勧めます
その他の回答 (6)
- piroin654
- ベストアンサー率75% (692/917)
肝心なことを書くのを忘れていました。 No2の(3)で作ったフォームのボタンを クリックするとインポートしたデータを 収めたテーブル「Sheet1」からテーブル 「T受注明細」へデータを移動します。 (5)~(7)で作成したフォームのボタン「cmd追加」 をクリックすするとテキストボックスに入れた データを「T受注明細」へ入れ、そのデータを元に 「Q受注」の結果が変更され、変更された結果を フォームに表示するためにサブフォームの表示 コントロールのソースオブジェクトを再設定 して表示しなおす、ということをしています。 Q受注はクロス集計クエリですが、クロス集計クエリ には直接データを入力したりできないのでこのような 方法をとります。
- piroin654
- ベストアンサー率75% (692/917)
No2の追加をもう一つしておきます。 No2の(7)で、 Private Sub cmd初期化_Click() Me!tx日付 = "" Me!tx名前 = "" Me!tx受注 = "" End Sub としていますが、同じ日にデータを集中して 入力するならば、日付は消さずにそのままにして、 Private Sub cmd初期化_Click() Me!tx名前 = "" Me!tx受注 = "" End Sub でもいいのでは、と思います。そのあたりは ボタンを数個用意し、状況に応じて使いわける などの設定もいいのでは、と思います。 これは入力時の便宜を図るものですから、特に 重要というわけではありませんが。
- piroin654
- ベストアンサー率75% (692/917)
No2の追加をしておきます。 No2で、 >なお、名前がダブって同じ日に登録されるものか >わかりませんが、一応ないものとしています。 >ある場合は、Accessにデータを移動した後処理を >することになりますが。 としていますが、 (1) 入力するデータで、一日のうち以下のように 同じ人物から複数回あった場合には入力時には すべて合計したデータを入力するならば No2のままでいいです。 名前 2011/1/1 2011/1/2 2011/1 /3・・・・・・ 徳川 200 30 90 豊臣 100 120 60 伊達 60 200 150 徳川 300 120 豊臣 300 (2) 入力時に合計せずにそのまま入力し、表示で 合計しておく場合は、Q受注を以下にします。 TRANSFORM Sum(T受注明細.受注) AS 受注の合計 SELECT T受注明細.名前 FROM T受注明細 GROUP BY T受注明細.名前 PIVOT Format([日付],"Short Date"); (3) 合計せずにそのまま表示する場合は、Q受注を 以下のようにします。 TRANSFORM First(T受注明細.受注) AS 受注の先頭 SELECT T受注明細.ID, T受注明細.名前 FROM T受注明細 GROUP BY T受注明細.ID, T受注明細.名前 ORDER BY T受注明細.ID PIVOT Format([日付],"Short Date");
- piroin654
- ベストアンサー率75% (692/917)
No2です。 訂正です。 No2の(6)の最後あたり、 >db.Close: Set rs = Nothing となっていますが、正しくは、 db.Close: Set db = Nothing です。
- piroin654
- ベストアンサー率75% (692/917)
以下はAccessのバージョンによって出来るかは 確認していませんが、多分できるだろうという 予測のもとに作成しています。 同じような状況の事が以下のところに記載されています。 http://www.mahoutsukaino.com/ac/ac2000/vba2000/03/000001.htm ただし、上記はExcelのデータをAccessに取り込み、 取り込んだデータを別テーブルに入れ直すところ までです。 上記はADOですが、ここではDAOですべて行ないます。 コード表のツール、参照設定からDAAにチェックを いれてください。 Micrososft DAO 3.6 Object Library のようなものです。チェックをいれたら ↑ボタンで上げられるところまで上げて ください。 (1) Excelでデータが以下のように並んでいるものします。 名前 2011/1/1 2011/1/2 2011/1/3・・・・・・ 徳川 200 30 90 豊臣 100 120 60 伊達 60 200 150 なお、名前がダブって同じ日に登録されるものか わかりませんが、一応ないものとしています。 ある場合は、Accessにデータを移動した後処理を することになりますが。 このデータをこのままAccessからインポートします。 インポート時には上記の名前というデータが入力 されている必要があります。 Accessの外部データの取り込み、インポートから、 Excelファイルを指定して、インポートを押します。 データのあるシートを指定して、次へ行き、 「先頭行をフィールド名に使う」にチェックを入れ、 次に行き、「新規テーブルに保存」にチェックを入れ 次に行き、また次に行き、「主キーを設定しない」に チェックを入れ、次に行き、「インポート先のテーブル名」 に適当な名前をいれ、完了をおします。 「インポート先のテーブル名」は何もしなければたとえば データのあるシート名がテーブル名になります。たとえば 「Sheet1」のようになります。ここでは分かりやすく 「Sheet1」とします。 (2) テーブルを一つ作ります。テーブル名は「T受注明細」 フィールドは、 ID オートナンバー 日付 日付/時刻型 名前 テキスト型 受注 通貨型 主キーは設定しません。 (3) フォームを一つ作りそのフォームに ボタンを一つ設定します。 そのボタンの「クリック時」のイベントに 以下を設定します。 Private Sub コマンド0_Click() Dim db As Database Dim rs1 As Recordset Dim rs2 As Recordset Dim i As Integer Dim j As Integer Dim str As String Set db = CurrentDb Set rs1 = db.OpenRecordset("Sheet1") Set rs2 = db.OpenRecordset("T受注明細", dbOpenDynaset) i = rs1.Fields.Count - 1 j = 0 Do Until i = j j = j + 1 If rs1.RecordCount > 0 Then rs1.MoveFirst str = rs1.Fields(j).Name Do Until rs1.EOF rs2.AddNew rs2!日付 = str rs2!名前 = rs1!名前 rs2!受注 = rs1.Fields(j) rs2.Update rs1.MoveNext Loop Else Exit Do End If Loop rs1.Close: Set rs1 = Nothing rs2.Close: Set rs2 = Nothing db.Close: Set db = Nothing End Sub 保存して閉じます。 (4) クエリを一つつくります。 以下を新しいクエリのSQLビューに貼り付け、 ほぞんしてください。名前は「Q受注」とします。 TRANSFORM First(T受注明細.受注) AS 受注の先頭 SELECT T受注明細.名前 FROM T受注明細 GROUP BY T受注明細.名前 ORDER BY T受注明細.名前 PIVOT Format([日付],"Short Date"); (5) フォームを一つつくります。 フォームのデザインビューで、フォームに 「フォームヘッダ/フッタ」を設定します。 フォームを適当に大きく広げ、「フォームヘッダ」の 下の部分にテキストボックスを三つ、ボタンを二つ 設定します。名前は、 tx日付 テキストボックス tx名前 テキストボックス tx受注 テキストボックス cmd追加 ボタン cmd初期化 ボタン とします。 次に、フォームの「詳細」の下に「サブフォーム」 を表示するコントロールを設定します。初期値は 「埋め込み0」のような名前になっています。 一応名前はそのままにしておきます。 その上で右クリックから、ソースオブジェクト の項で、「クエリ.Q受注」を選択し、保存します。 (6) 「cmd追加」のクリック時のイベントで以下のように 設定します。これはテキストボックスに入力した データをテーブルに保存し、改めてフォームの ソースオブジェクトを設定しなおして、データを 再表示するものです。なお、コード中の埋め込み0 はサブフォーム表示コントロールですが、この場合は このコントロールにクエリを表示します。 Private Sub cmd追加_Click() Dim db As Database Dim rs As Recordset Set db = CurrentDb Set rs = db.OpenRecordset("T受注明細", dbOpenDynaset) If rs.RecordCount > 0 Then rs.MoveFirst Do Until rs.EOF If rs!日付 = Me!tx日付 Then rs.AddNew rs!名前 = Me!tx名前 rs!受注 = Me!tx受注 rs.Update Exit Do Else rs.AddNew rs!日付 = Me!tx日付 rs!名前 = Me!tx名前 rs!受注 = Me!tx受注 rs.Update Exit Do End If rs.MoveNext Loop End If Me.埋め込み0.SourceObject = "クエリ.Q受注" Me.Refresh rs.Close: Set rs = Nothing db.Close: Set rs = Nothing End Sub (7) 「cmd初期化」のクリック時のイベントで、以下を 設定します。これはテキストボックスに入力した データを消す為のものです。 Private Sub cmd初期化_Click() Me!tx日付 = "" Me!tx名前 = "" Me!tx受注 = "" End Sub 以上です。なお、データがない状態から始める場合は、 (2) (4) (5) (6) (7) の順番でテーブル、クエリ、フォームを作りデータを 入力してみてください。
- hatena1989
- ベストアンサー率87% (378/433)
> データシートビューでそのような表示は可能でしょうか? 表示だけなら、クロス集計クエリを使えば可能ですが、データ入力や編集は不可能です。 入力もできるようにするには、非連結フォームで、テキストボックスを多数並べて、VBAで、テーブルからデータをセット、編集後のデータをテーブルへ書き込む、等すべて自前で処理をする必要があります。 かなりの工数になりますし、それなりのスキルも必要です。
お礼
回答ありがとうございます。 理論的にはご指摘の方法で実現可能である事は理解できますが、現実的にはかなり困難ではないかと考えます。
お礼
非常に丁寧な回答に深く感謝します。 それぞれの回答に対してお礼を書くべきですが、この欄で全回答へのお礼とさせて下さい。 まず私の質問の意図ですが、エクセルにはX軸とY軸を回転させるチェックボックスがあったはずなのでアクセスのデータシートビューでもそれが可能なのかどうかを確認したかったのです。 私が確認した範囲ではその機能はなさそうだったのですが、お二人の回答でそれができない事が確認できました。 また、この回答欄でご指摘くださった通り、ソフトウェアの仕様に準じない設計は無理がありそうな事から、今回は時間軸を縦にするように設計変更をしようと思います。 せっかくのサンプルコードを生かす事ができずに申し訳ありません。