質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

Q&A

解決済

4回答

2439閲覧

縦持ちデータのクエリを横持ちデータに変換したい

退会済みユーザー

退会済みユーザー

総合スコア0

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

0グッド

0クリップ

投稿2023/05/01 03:00

実現したいこと

イメージ説明
画像のようにデータの縦横を変えたいです。

前提

集積した売上情報を指定した期間分Excelで出力するフォームを作成したいです。最終的に以下の画像のようにExcel出力をしたいと考えていて、色毎にテーブル・クエリを分割して作成し、出力用テーブルに追加してExcel出力する構想です。
イメージ説明

発生している問題・エラーメッセージ

現在は第一段階として青の部分、商品マスターテーブルの縦横を入れ替えた表を作成したいのですが、自身の知識では実現方法が浮かばなく、手詰まりを起こしています。

試したこと

ネットで縦持ち・横持ちの変換方法について調べてみましたが、あまり理解が及ばず・・・ヒントや参考になるサイトを教えて頂けないでしょうか。

補足情報(FW/ツールのバージョンなど)

Microsoft Access2019

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

そのような処理はAccessのようなデータベースでは苦手な処理です。できないことはないですが、面倒だし処理も重くなります。
最終的にエクセルに出力するのなら、
そのままの形でエクセルに出力してエクセルの方で縦横変換するのが簡単かつ高速です。

「エクセル 行列の入れ替え」とか「エクセル 縦横変換」で検索すれば解説ページが多数見つかります。

投稿2023/05/01 05:41

hatena19

総合スコア33715

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2023/05/01 06:02

Accessだと苦手な処理っぽいなぁというのは私自身も感じております…。 ただ、Excel出力・データを加工するのは私ではなく客先で、操作マニュアルにExcelで行列の入れ替えやデータの組み直しを入れるのは不親切だと感じています。 客先の人間が行う操作は、Access上で①出力したい期間を選択し②Excelに出力ボタンをクリック この2つに留めたいなあと思うのです。 前提のようにAccessから出力できるようご助言いただけないでしょうか?
hatena19

2023/05/01 06:45 編集

客先にはAccessファイルとして渡すのですか。 > 客先の人間が行う操作は、Access上で①出力したい期間を選択し②Excelに出力ボタンをクリック ということなら、その出力ボタンに割り当てたVBAで下記のような処理をするのがいいでしょう。 エクセルファイルにテーブルを出力する。 そのエクセルのデータを縦横変換する。 Accessからエクセルを操作する方法も検索すれば見つかります。例えば、 https://officevba.info/accessvba-exceloperation/ 下記も参考になるでしょう。 レコードセットの内容をそのままExcelのシートに出力する方法 https://tsware.jp/tips/tips_686.htm
退会済みユーザー

退会済みユーザー

2023/05/01 07:02

はい、Accessファイルとして提供し、売上情報の入力・データの出力・加工も客先側の作業となります。 ファイルの中身を作ってから出力ではなく出力してから体裁を整える、ということが可能なんですね。 そちらの実現方法をリンク先の情報を確認しながらやってみたいと思います!
退会済みユーザー

退会済みユーザー

2023/05/08 06:20

2個目のリンク、リンク先のリンク「#432 Excelセルへ個別出力する基本パターン」を参考にして記述してみたのですが、出力出来るのがレコードのみでフィールド名を出力できませんでした。 https://teratail.com/questions/lkiy9t40xkoo9b こちらの自己解答に、フィールドとレコードを分けて出力したコード記述しました。 見た目上は理想に近づいたのですが、テーブルやクエリをフィールド名ごと取り込む方法ご存じでしたらご教示いただけないでしょうか?
guest

0

遅くても構わないなら、Djoin関数が使えるかもしれません。

後は、動的にクロス集計クエリーを作成して処理するとか。

追記
質問を読み返してみると、集計は必要なく行列を入れ替えるだけですね。
であれば、行数分を列を持ったワークテーブルを生成し、元データを列ごとに読み込んで追加するという処理の方が簡潔ですね。

投稿2023/05/01 07:04

編集2023/05/03 02:34
sazi

総合スコア25195

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2023/05/02 06:16

回答ありがとうございます。 クロス集計クエリで実現できたらクエリのインポートだけで済むので便利だなと思って試してみたのですが理想形にならず…どのような手順で作成するのかご教示いただけないでしょうか? 商品マスターテーブルのフィールドは品番・会社名・品名・価格です
sazi

2023/05/03 01:55 編集

変換後の行毎のクロス集計をunionするイメージです。
guest

0

2023/4/1
- 購入者番号0001,割引券4,割引額400
- - 株式会社A,りんご,価格100,購入数1
- - 株式会社C,すいか,価格300,購入数1
————————————-小計:400
————————————-自己負担額:0
2023/4/2
- 購入者番号0002,割引券10, 割引額1000
- - 株式会社B,みかん,価格200,購入数4
- - 株式会社C,すいか,価格300,購入数1
————————————-小計:1100
————————————-自己負担額:100
2023/4/3
- 購入者番号0003,割引券5, 割引額500
- - 株式会社A,りんご,価格100,購入数1
- - 株式会社B,みかん,価格200,購入数3
————————————-小計:700
————————————-自己負担額:200

合計金額:2200;自己負担額:300;


 Accessのレポートは、使わないのでしょうか?

投稿2023/05/01 05:03

logres_Fan

総合スコア164

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2023/05/01 05:25

前提の画像の様式で出力したExcelデータを客先が更に加工するので、レポートではなくこの様式でExcel出力したいです。
退会済みユーザー

退会済みユーザー

2023/05/01 06:37

データを出力・加工するのが客先のため、Excel上で表の作成を客先にさせるのは不親切かなと感じております。客先側の操作は期間の選択・出力ボタンのクリックのみで前提の様式に出力できるようにAccess側でデータを加工できればと考えています。
logres_Fan

2023/05/01 08:53

> 客先の人間が行う操作は、Access上で①出力したい期間を選択し②Excelに出力ボタンをクリック 例えば、シート1のA列からC列に10,000行出力される場合、シート2の1行から4行に10,000列に数式を入れておけば、行列を入れ替える操作をしなくても自動的に表示されるはずです。  それはさておき、ユーザと改善・リセット・撤退などもっと話し合うべきです。古代王朝絵巻物のように横にながーくのびーる画面は、見やすいですか?緑の表は、本当に実装可能でしょうか?結局、Accessの役割はどうなるのでしょう。Excelに一本化しないのでしょうか?市販品、例えば、Excelと連携するならフュージョンプレイスが議題になると思いますが、提案されましたか?  最終的にExcel表は誰が何のために見るのでしょう?購入数合計値、自己負担額小計・合計って制度会計上必要ですか?管理会計の役に立ちますか?  
退会済みユーザー

退会済みユーザー

2023/05/02 00:29

出力するExcelシートに予め数式を入れておく方法もあるのですね、参考になります。 Access取り扱いの勉強として、以前客先に提供したデータベースファイルを再現しているところなので実際に客先と話し合う機会はないのですが…それはともかくとして、これを作ってみろと言われて、扱い辛い表だなぁとは自分自身も感じておりました。logresさんのレポート形式の見やすいこと…
guest

0

例えば、Excel.Range オブジェクトの CopyFromRecordset メソッドによって
レコードセットの内容を一旦ワークシートに出力してから、出力された範囲を
Excel.Range オブジェクトの PasteSpecial メソッド
Excel.WorksheetFunction オブジェクトの Transpose メソッドを用いて
行列変換した結果を別のワークシート/セル範囲に出力する、
という流れでもよさそうですが。

ただ、PasteSpecial メソッドだとクリップボードを仲介させるので
場合によっては貼り付けに失敗して実行時エラーが発生する恐れがありますし、
Transpose メソッドによって行列変換した2次元配列を得ても
値のみの行列変換になってしまう(書式は行列変換されない)ので、
どの道面倒くさいことになる可能性が高いです。

vba

1Option Compare Database 2Option Explicit 3 4Sub TestMacro1() 5 6 Dim daoDatabase As DAO.Database 7 8 Set daoDatabase = CurrentDb 9 10 Dim daoRecordset As DAO.Recordset 11 Dim strSQL As String 12 13 '[商品マスターテーブル]の全てのレコードを[品番]の昇順に並べ替えた結果を得るSQL文 14 strSQL = "SELECT *" & _ 15 " FROM [商品マスターテーブル]" & _ 16 " ORDER BY [品番];" 17 18 'SQL文の実行結果をレコードセットとして取得 19 Set daoRecordset = daoDatabase.OpenRecordset(strSQL, dbOpenSnapshot) 20 21 'レコードがない場合は終了する 22 If daoRecordset.EOF Then 23 MsgBox "出力対象となるレコードがありません。", vbExclamation, "レコードなし" 24 Set daoRecordset = Nothing 25 Set daoDatabase = Nothing 26 Exit Sub 27 End If 28 29 Dim lngRecordCount As Long 30 31 'レコード件数の取得 32 daoRecordset.MoveLast 33 lngRecordCount = daoRecordset.RecordCount 34 daoRecordset.MoveFirst 35 36 Dim xlsApp As Object 37 38 'Excelアプリケーションの新規インスタンスを生成 39 Set xlsApp = CreateObject("Excel.Application") 40 xlsApp.Visible = True 41 xlsApp.ScreenUpdating = False 42 43 Dim xlsWorkbook As Object 44 Dim xlsWorksheet As Object 45 46 '新規ブックの作成 47 Set xlsWorkbook = xlsApp.Workbooks.Add 48 '作成したブックの1つめのワークシートを参照 49 Set xlsWorksheet = xlsWorkbook.Worksheets(1) 50 51 Dim daoField As DAO.Field 52 Dim xlsFirstColumnCell As Object 53 Dim lngRow As Long 54 Dim lngColumn As Long 55 Dim strFormatString As String 56 57 With xlsWorksheet 58 59 lngRow = 1 60 lngColumn = 1 61 62 '行見出し列の出力、および各セルの表示形式の設定 63 .Cells(lngRow, lngColumn).Resize(daoRecordset.Fields.Count, 1).NumberFormat = "@" 64 For Each daoField In daoRecordset.Fields 65 Set xlsFirstColumnCell = .Cells(lngRow, lngColumn) 66 xlsFirstColumnCell.Value = daoField.Name 67 Select Case daoField.Type 68 Case dbText, dbMemo 69 strFormatString = "@" 70 Case dbDate 71 strFormatString = "yyyy/mm/dd hh:mm:ss" 72 Case Else 73 strFormatString = "General" 74 End Select 75 xlsFirstColumnCell.Resize(1, lngRecordCount).Offset(0, 1).NumberFormat = strFormatString 76 Set xlsFirstColumnCell = Nothing 77 lngRow = lngRow + 1 78 Next 79 80 'レコードセットを行列変換しながら出力 81 Do Until daoRecordset.EOF 82 lngRow = 1 83 lngColumn = lngColumn + 1 84 For Each daoField In daoRecordset.Fields 85 .Cells(lngRow, lngColumn).Value = daoField.Value 86 lngRow = lngRow + 1 87 Next 88 daoRecordset.MoveNext 89 Loop 90 91 '列の自動調整 92 .UsedRange.EntireColumn.AutoFit 93 94 End With 95 96 xlsApp.ScreenUpdating = True 97 98 Set xlsWorksheet = Nothing 99 Set xlsWorkbook = Nothing 100 Set xlsApp = Nothing 101 102 Set daoField = Nothing 103 Set daoRecordset = Nothing 104 Set daoDatabase = Nothing 105 106End Sub

パフォーマンスを度外視するなら、上記のサンプルのようなコードが挙げられます。

投稿2023/05/01 07:05

編集2023/05/02 01:38
sk.exe

総合スコア744

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問