- ベストアンサー
エクセル表の集計方法とマクロを使ったオーダー数の自動入力
- エクセルを使用して表の集計方法とマクロを使ったオーダー数の自動入力について解説します。
- 基幹システムから製番と回答納期、発注数をダウンロードし、ピボットを使って集計します。
- また、マクロを使用して1ボタンで自分が作成したリストにオーダー数を入力する方法も解説します。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
時間ができたので書いてみました。 よかったら試してみてください。 なお、以下が制限事項です。 ・基幹システムから切り出したデータのレコード群は最大、50000レコード(1行目ヘッダー行を含む)まで ・列数は最大26列 ・データはエクセルファイルのシートに格納され、 そのシート名は"Sheet1" ・「2→自分で作成したリスト」には、A6セルから製番が始まっている ・エラー処理は全く考慮していません。 Option Explicit Sub Sample() Dim SQL As String Dim cn As Object Dim rs As Object Dim InList As String Dim r As Long Dim c As Long Dim strFilePath As String strFilePath = _ Application.GetOpenFilename(Filefilter:="Excelブック,*.xlsx") '型番リスト組立 With ThisWorkbook.Sheets(1) InList = "" r = 6 'リストの開始行 InList = InList & "'" & .Cells(r, 1).Value & "'" & vbCrLf Do r = r + 1 If .Cells(r, 1).Value = "" Then Exit Do InList = InList & ",'" & .Cells(r, 1).Value & "'" & vbCrLf Loop End With 'SQL全文を組み立て SQL = "SELECT [回答納期]" & vbCrLf SQL = SQL & "FROM [" & "Sheet1" & "$A1:Z50000]" & vbCrLf SQL = SQL & "Where [型番] in(" & InList & ")" & vbCrLf SQL = SQL & "GROUP BY [回答納期]" & vbCrLf SQL = SQL & "ORDER BY [回答納期]" & vbCrLf 'SQLを実行 Set cn = CreateObject("ADODB.Connection") Set rs = CreateObject("ADODB.Recordset") cn.Provider = "Microsoft.ACE.OLEDB.12.0" cn.Properties("Extended Properties") = "Excel 12.0;HDR=Yes;IMEX=1" cn.Open strFilePath rs.Open SQL, cn '結果セットを順番に読み、集計先、横方向に日付を羅列 If Not rs.EOF Or Not rs.Bof Then rs.MoveFirst c = 1 Do If rs.EOF = True Then Exit Do With ThisWorkbook.Sheets(1) c = c + 1 .Cells(5, c).Value = rs("回答納期") .Cells(5, c).NumberFormatLocal = "yyyy/m/d" End With rs.MoveNext Loop End If '後処理 rs.Close Set rs = Nothing cn.Close Set cn = Nothing With ThisWorkbook.Sheets(1) c = 2 '編集先テーブルの開始列 Do If .Cells(5, c).Value = "" Then Exit Do r = 6 '編集先テーブルの開始行 Do If .Cells(r, 1).Value = "" Then Exit Do .Cells(r, c).Value = _ sfCount(strFilePath, .Cells(r, 1).Value, .Cells(5, c).Value) r = r + 1 Loop '日ごとの合計算出 .Cells(4, c).Value = _ Application.WorksheetFunction. _ Sum(Range(.Cells(6, c), .Cells(50000, c))) c = c + 1 Loop End With End Sub Function sfCount(Path As String, Kataban As String, Nouki As Date) As Long Dim SQL As String Dim cn As Object Dim rs As Object Dim InList As String Dim r As Long Dim c As Long 'SQL全文を組み立て SQL = "SELECT Count([回答納期]) as HitCount" & vbCrLf SQL = SQL & "FROM [" & "Sheet1" & "$A1:Z50000]" & vbCrLf SQL = SQL & "Where (([型番] = '" & Kataban & "') and " & vbCrLf SQL = SQL & "( [回答納期] = #" & Format(Nouki, "yyyy/mm/dd") & "#))" & vbCrLf 'SQLを実行 Set cn = CreateObject("ADODB.Connection") Set rs = CreateObject("ADODB.Recordset") cn.Provider = "Microsoft.ACE.OLEDB.12.0" cn.Properties("Extended Properties") = "Excel 12.0;HDR=Yes;IMEX=1" cn.Open Path rs.Open SQL, cn '結果セットを取得 sfCount = rs("HitCount") '後処理 rs.Close Set rs = Nothing cn.Close Set cn = Nothing End Function
その他の回答 (1)
- imogasi
- ベストアンサー率27% (4737/17069)
ーー (1)この質問には、自社の自分の仕事のことだろう。 貴社は、システム部や提携ソフト業者が居るようだ。そちらに依頼して 最終目標に近いデータを吐き出してもらうように、 SAMUFS関数を使うぐらいで、残りは済むようにしてもらったらどうか。 ーーー 仮にVBAコードがわかったとして、会社は、それを加工するVBAを、 使うことを許すのか。 質問の表現ぶりから、許さない方がよいようにおもう。 ーーー やりたい内容は、ダウンロードしたデータで (1)ピボットで集計する、らしい。条件や項目(フィ-ルド名)は具体的にはなに? (2)>必要な製番リスト+データ?を作るらしいが、具体的には、方法はなに? 関数は抜出しは不得手と思うが、フィルタかその他なら何? ーー (1)ダウンロードデータ(シート) (2)中間データ(シート) (3)最終目的データ と(2)を中間にかました方がよいように思う。 (3)はクロスならピボットを使うとか、場合によってはエクセル関数で処理するほうが 良いのではないか === 小生などは (1)ーー>(2)のフィルタ的な庶路(セータ変形的なものはないのだろう)を文章で (2)ーー>(3)の処理をフィールド名と、文章で 説明してくれた方が、理解しやすい。 == 本日、日曜であり、オリパラテレビ観戦でいそがしいかもしれないが、2-3日経って回答が 出ないようなら小生の言うことも影響していると思って質問の仕方を工夫しては. 参考にピボットテーブルのVBAでの課題例を見つけたので https://www.relief.jp/docs/excel-vba-filter-pivot-table.html VBAでピボットテーブルのフィルターを設定する を上げてみる。