
実現したいこと
前提
集積した売上情報を指定した期間分Excelで出力するフォームを作成したいです。最終的に以下の画像のようにExcel出力をしたいと考えていて、色毎にテーブル・クエリを分割して作成し、出力用テーブルに追加してExcel出力する構想です。
発生している問題・エラーメッセージ
現在は第一段階として青の部分、商品マスターテーブルの縦横を入れ替えた表を作成したいのですが、自身の知識では実現方法が浮かばなく、手詰まりを起こしています。
試したこと
ネットで縦持ち・横持ちの変換方法について調べてみましたが、あまり理解が及ばず・・・ヒントや参考になるサイトを教えて頂けないでしょうか。
補足情報(FW/ツールのバージョンなど)
Microsoft Access2019
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答4件
0
ベストアンサー
そのような処理はAccessのようなデータベースでは苦手な処理です。できないことはないですが、面倒だし処理も重くなります。
最終的にエクセルに出力するのなら、
そのままの形でエクセルに出力してエクセルの方で縦横変換するのが簡単かつ高速です。
「エクセル 行列の入れ替え」とか「エクセル 縦横変換」で検索すれば解説ページが多数見つかります。
投稿2023/05/01 05:41
総合スコア34347
0
遅くても構わないなら、Djoin関数が使えるかもしれません。
後は、動的にクロス集計クエリーを作成して処理するとか。
追記
質問を読み返してみると、集計は必要なく行列を入れ替えるだけですね。
であれば、行数分を列を持ったワークテーブルを生成し、元データを列ごとに読み込んで追加するという処理の方が簡潔ですね。
投稿2023/05/01 07:04
編集2023/05/03 02:34総合スコア25426
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
総合スコア176
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

退会済みユーザー
2023/05/01 05:25

退会済みユーザー
2023/05/01 06:37

退会済みユーザー
2023/05/02 00:29

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総合スコア1066
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2023/05/01 06:02
2023/05/01 06:45 編集
退会済みユーザー
2023/05/01 07:02
退会済みユーザー
2023/05/08 06:20