• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:エクセル 表の集計)

エクセル表の集計方法とマクロを使ったオーダー数の自動入力

このQ&Aのポイント
  • エクセルを使用して表の集計方法とマクロを使ったオーダー数の自動入力について解説します。
  • 基幹システムから製番と回答納期、発注数をダウンロードし、ピボットを使って集計します。
  • また、マクロを使用して1ボタンで自分が作成したリストにオーダー数を入力する方法も解説します。

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

  • ベストアンサー
  • HohoPapa
  • ベストアンサー率65% (455/693)
回答No.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)
回答No.1

ーー (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でピボットテーブルのフィルターを設定する を上げてみる。

関連するQ&A