- ベストアンサー
ACCESS VBA EXCEL クエリ 転記 集計 SQL
- ACCESSからEXCELへ転記する際に、データの操作を行いたい
- VBAを使用して、値をグループ化して集計し、EXCELに貼り付けたい
- SQLを使用して、名前と値段をグループ化し、個数と管理番号を集計したい
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
> 写真 700 3 A2 A8,A9,A11 は 写真 700 4 A2 A8,A9,A11 ですよね。 単純に管理番号でソートすると上記は 写真 700 4 A11 A2,A8,A9 となるので、 頭にスペース付けて6文字に統一して処理している例となります。 (A2 と A11 では、A11 の方が小さい) (見難くなってますが、RIGHTの右側にある空白は5文字分の空白です) (テーブル名は「T_T6」としています) 標準モジュールに以下作成 Public Function KanriNoEtc(sName As String, vPrice As Variant) As String Dim rs As New ADODB.Recordset Dim sTmp As String Dim iCount As Long sTmp = "" iCount = 0 rs.Source = "SELECT * FROM T_T6 WHERE [名前]='" & sName & "' AND [値段]=" & vPrice & " ORDER BY RIGHT(' ' & [管理番号],6);" rs.Open , CurrentProject.Connection, adOpenForwardOnly, adLockReadOnly While (Not rs.EOF) If (iCount > 0) Then sTmp = sTmp & "," & rs("管理番号") End If iCount = iCount + 1 rs.MoveNext Wend If (Len(sTmp) > 0) Then sTmp = Mid(sTmp, 2) End If KanriNoEtc = sTmp End Function ※ ADOで書いていますがDAOでもお好きな方を レコードを得るSQL SELECT T_T6.名前, T_T6.値段, Count(*) AS 個数, Replace(Min(RIGHT(" " & T_T6.管理番号,6))," ","") AS 管理番号, KanriNoEtc(T_T6.名前,T_T6.値段) AS その他の管理番号 FROM T_T6 GROUP BY T_T6.名前, T_T6.値段 ORDER BY Min(RIGHT(" " & T_T6.管理番号,6)); ※ 単純に確認するのであれば、クエリのSQLビューに張り付けて ※ データ量が多くなると遅いと思います 組み込む時には、現Excel処理前に行っていたレコード抽出部を上記に変更し .Cells(3+CntGyo,1)=rst![名前] .Cells(3+CntGyo,2)=rst![値段] .Cells(3+CntGyo,3)=rst![個数] .Cells(3+CntGyo,4)=rst![管理番号] .Cells(3+CntGyo,5)=rst![その他の管理番号] とします。
その他の回答 (2)
- 30246kiku
- ベストアンサー率73% (370/504)
#2 修正です > Wend > If (Len(sTmp) > 0) Then ↓ Wend rs.Close If (Len(sTmp) > 0) Then ※ 処理が複雑になっていますが、「管理番号」のデータ桁を揃えておくと簡単になります。 RIGHT(" " & T_T6.管理番号,6) → T_T6.管理番号 に置き換えれます。 また、Replace も不要になります。
- Hardking
- ベストアンサー率45% (73/160)
やり方は何パターンかありますが、 SQL的に一番シンプル方法は、抽出データのソートと キーブレイク処理で、個数と最小管理番号を取得する方法です。 (1).抽出データのソート 第一ソート:名前 昇順 第二ソート:値段 昇順 第一ソート:管理番号 昇順 (2).読み込みデータの名前と値段がともに同一の場合 個数カウンターをカウントアップする。 読み込みデータの名前と値段がともに同一の場合 でそのグループ内で1件の管理番号を最小管理番号とする 読み込みデータの名前と値段がともに同一で無いの場合 個数カウンターをゼロにする。 上記をVBAマクロでコーディングすればいいです。
お礼
返事を今まで申し訳ございません。 まだ、動作確認をしておりませんが 後ほど、ptを差し上げたいと思いますのでお待ちください。