ACCESS VBA EXCEL クエリ 転記 集計 SQL

このQ&Aのポイント
  • ACCESSからEXCELへ転記する際に、データの操作を行いたい
  • VBAを使用して、値をグループ化して集計し、EXCELに貼り付けたい
  • SQLを使用して、名前と値段をグループ化し、個数と管理番号を集計したい
回答を見る
  • ベストアンサー

ACCESS VBA EXCEL クエリ 転記 集計 SQL

ACCESSからEXCELへ転記する際に以下のような一定の操作を行いたいと考えています。 ACCESSの中で以下のようなクエリがあります。 名前 値段 管理番号 雑誌 500 A1 写真 700 A2 音楽 600 A3 ソフト 500 A4 写真 400 A5 雑誌 500 A6 音楽 900 A7 写真 700 A8 写真 700 A9 ソフト 500 A10 写真 700 A11 これを通常にEXCELへ貼り付ける時には以下のようなプログラムをVBAにて作成し実行してます。 With wkb.Worksheets(stSheet) Do Until rst.EOF 'ここに新たな式を書く .Cells(3+CntGyo,1)=rst![名前] .Cells(3+CntGyo,2)=rst![値段] .Cells(3+CntGyo,3)=rst![管理番号] CntGyo=CntGyo+1 rst.MoveNext Loop End With ここでEXCELに貼り付ける際に以下のようにしたいと考えております。 A列   B列 C列 D列 E列 名前 値段 個数 管理番号 その他の管理番号 雑誌 500 2 A1  A6 写真 700 3 A2  A8,A9,A11 音楽 600 1 A3 ソフト 500 2 A4  A10 写真 400 1 A5 音楽 900 1 A7 名前と値段をグループとして考え、 C列に個数を、D列に管理番号の一番小さい値を示す。 E列にグループ化された管理番号のその他の値を示す。 以上の操作をSQL構文等を使って作れるものなのでしょうか?

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

  • ベストアンサー
  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.2

> 写真 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![その他の管理番号] とします。

defmerube
質問者

お礼

返事を今まで申し訳ございません。 まだ、動作確認をしておりませんが 後ほど、ptを差し上げたいと思いますのでお待ちください。

その他の回答 (2)

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.3

#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)
回答No.1

やり方は何パターンかありますが、 SQL的に一番シンプル方法は、抽出データのソートと キーブレイク処理で、個数と最小管理番号を取得する方法です。 (1).抽出データのソート 第一ソート:名前 昇順 第二ソート:値段 昇順 第一ソート:管理番号 昇順 (2).読み込みデータの名前と値段がともに同一の場合   個数カウンターをカウントアップする。      読み込みデータの名前と値段がともに同一の場合   でそのグループ内で1件の管理番号を最小管理番号とする   読み込みデータの名前と値段がともに同一で無いの場合   個数カウンターをゼロにする。 上記をVBAマクロでコーディングすればいいです。

関連するQ&A

  • VBA EXCEL 集計 操作 カウント

    EXCELのVBAにて「変換」ボタンを押したら 名前と値段が同じ物の個数が表示され 管理番号も並ぶようなプログラムを作りたいのですが どのように構築すればよいでしょうか? 詳しくは図をご覧ください。

  • VBA EXCEL 集計 操作 カウント

    図が不鮮明だったため、再投稿です。 EXCELのVBAにて「変換」ボタンを押したら 名前と値段が同じ物の個数が表示され 管理番号も並ぶようなプログラムを作りたいのですが どのように構築すればよいでしょうか? 詳しくは図をご覧ください。

    • ベストアンサー
    • CSS
  • 行列で検索をかけてその結果を転記するVBAは

    早速ですが質問させていただきます。 sheet1のA列に月日、2行目に製品名をとり製品個数を記した表があります。(列数150行数1000です)これをsheet3のCells(2, 6)に記入した月日とCells(2, 4)に記入した製品名(文字)の2つでsheet1の行と列から当てはまるセルの検索をコマンドボタンを押すことにより行い、そのセルにsheet3のCells(2, 7)に記入した製品個数を転記するようなVBAを書きました。 Private Sub CommandButton1_Click() Dim LastA, idxA As Long, trgA, trgB With Worksheets("Sheet3") LastA = .Range("A1000").End(xlUp).Row trgA = Application.Match(.Cells(2, 6), Worksheets("Sheet1").Range("A:A"), 0) For idxA = LastA To 3 Step -1 trgB = Application.Match(.Cells(2, 4), Worksheets("Sheet1").Range("2:2"), 0) Worksheets("Sheet1").Cells(trgA, trgB) = .Cells(2, 7) Next idxA End With End Sub 以前質問して教えていただいたものを参考に、少し変更してみたのですがこれで正しいでしょうか?実行するとうまく転記するのですがかなり時間がかかってしまい、もう少し何とかならないものかと思っています。どなたかご指導お願いします。

  • 複数条件での集計方法について(Excel2003)

    複数の条件で集計を行い、データの個数を表示させたいと考えてます。 対処方法をご教示下さい。 <例>     列A    列B   列C  列D 1 注文番号 メーカ名 タイプ  購入日 2  123     NEC   NOTE  2010/1 3  123     NEC   NOTE  2010/1 4  123     NEC   DESK  2010/1 5  456     HP    NOTE  2010/2 6  456     HP    NOTE  2010/2 上記の表を列A~列Dの集計により     列A    列B   列C  列D  列E 1 注文番号 メーカ名 タイプ  購入日 個数 2  123     NEC   NOTE  2010/1  2 3  123     NEC   DESK  2010/1  1 4  456     HP    NOTE  2010/2  2 列Eにデータの個数を表示 尚、集計の条件としては、列Aの注文番号が最優先の集計キー、次いで列B、列C、列Dとなります。 又、行数は約1500行前後です。 宜しくお願い致します。

  • 【Excel VBA】並べ替え

    Excel2003を使用しています。 あるテキストファイルから必要なデータを抽出し、予めExcelで作成してある表に、抽出したデータをコピーするという作業をマクロで処理しています。 Excelの表は、A列→4桁の番号(数値)、C列→文字列、D列→数値で、A列の番号順(昇順)に表示されています。 抽出されたデータは、2行目以下に表示されるので、まず、A2セルに『0000』、C2セルとD2セルにそれぞれ該当のデータがコピーされ、以下、順番にコピーされます。このA2セル『0000』の行データをコピーされたデータの一番最後にもっていき、下記のように上方向へシフトさせたいのですが、このようなことはコードを追加することで可能でしょうか?    A列  C列  D列 2  0000  あ  100 3  1200  い  200 4  1500  う  300        ↓ 2  1200  い  200 3  1500  う  300 4  0000  あ  100 データ元のテキストファイルは、会社で使用しているシステムの機能を使って、テキストファイルにしたものです。このデータが昇順で表示されているので、こちらを並べ替えてマクロを実行すればいいかと思ったのですが、数値と文字列が混在しているので、Excelの表にコピーした後(数値と文字列の混在がなくなった後)に、上記のように並び替えることができればと思い、質問させていただきました。 よろしくお願いします。

  • VBAでのデータ転記(再)

    データがsheet1に縦記述で書いてあります。 C列 D列 ああ A01 いい A02 うう A03 . ささ B01 しし B02 すす B03 . はは AA01 ひひ AA02 ふふ AA03 . やや AB01 ゆゆ AB02 よよ AB03 . D列を元にしてC列の文字列をsheet2に以下のように並べたいです。D列はアドレス扱いででアルファベットが変わったら改行してデータを並べるようにします。 A列  B列 C列 ああ いい うう・ ささ しし すす・ ・・・・・ はは ひひ ふふ・ やや ゆゆ よよ・ 作成したコード Dim I As Integer, MAE As String, IMA As String, TEMP2 As String Dim X1 As Integer, Y1 As Integer, X3 As Integer, Y3 As Integer, PINNAME As String X1 = 4: Y1 = 2 X3 = 1: Y3 = 1 MAE = Sheets("Sheet1").Cells(Y1, X1) Do PINNAME = Sheets("Sheet1").Cells(Y1, X1 - 1) IMA = Sheets("Sheet1").Cells(Y1, X1) '今の値が入っている If IMA = "" Then Exit Do End If If Left(MAE, 1) <> Left(IMA, 1) Then Y3 = Y3 + 1: X3 = 1 Sheets("Sheet2").Cells(Y3, X3).Value = PINNAME X3 = X3 + 1 Else Sheets("Sheet2").Cells(Y3, X3).Value = PINNAME X3 = X3 + 1 End If MAE = Sheets("Sheet1").Cells(Y1, X1) Y1 = Y1 + 1 Loop Until IMA = "" Left関数でアドレスの左1文字を前後のセルで比較して異なる場合、改行する方法を考えましたが、AA01 AA02・・・がムリです。このコードに補足すればできるでしょうか?それとも別の考え方で行った方がいいでしょうか? 初心者レベルなので考え方も教えて下さい。宜しくお願いします。

  • excel2003 VBAマクロの作成

    すいません、下記についてコピーして動作する状態でいただけますでしょうか? 本当はもっと複雑なのですが、下記の部分だけなかなかうまくいかず、お力を貸してください。 管理台帳.xlsには↓のように記載があります。 A列 B列 C列 D列 ------------------------------------------ 管理番号 値段 商品名 数 1行目 K0001 500 X 5 2行目 K0002 200 S 1 K0002 300 T 1 K0003 100 Z 15 K0003 500 X 15 K0003 700 M 15 K0003 600 N 15 ・ ・        n行目 ------------------------------------------ ■条件/動作要件 ・管理番号は商品名別に1行とする為、同じ管理番号は複数行に記載がある ・管理番号1つに対して、商品名は複数ある マクロの処理内容としては、以下の2つが欲しい (1)重複計上を避ける為、行の情報がまったく同じものはセル範囲A?:D?の"値"を削除する ※セルや行ごと削除すると、Excel関数を使用しているセルに不具合がでる (2)2~n行目の範囲をソートする 優先度1:管理番号 優先度2:商品名 ※(2)は作成済みなので回答不要です

  • EXCEL2003 VBAについて

    EXCEL2003 VBAについて EXCEL2003で12個の同じ体裁の複数シートで構成されたブックがあります。 (1)シート1の[A1]に数値を入力するとシート名に文字列で構成された[E1]セルの内容を反映させる (2)シート2~12の[A1]セルにはシート1[A1]の値が入る (3)シート2~12にも[E1]の内容がシート名に反映される・・・はず (4) (1)処理時に自動的に(3)の処理が行われず、シート2~12に関しては、手動でA1をダブルクリックした後ESCキーでキャンセルし、シート名を更新しています。 しかしこの方法ですとこれをシート2~12全てでやらなければなりません。 (1)の入力だけで(2)を自動更新させる方法についてアドバイス頂けないでしょうか。 どうぞよろしくお願いします。 Sheet内スクリプト Private Sub Worksheet_Change(ByVal Target As Excel.Range) On Error GoTo ERR: If Target.Cells(1, 1).Address = "$A$1" Then Me.Name = Cells(1, 5) End If Target.Cells(1, 1).Select Exit Sub ERR: MsgBox "その名前には変更出来ません。", vbCritical + vbOKOnly, "ERROR" Resume Next End Sub

  • excel2003(vba)で御教授御願いします。

        A     B     C 1  番号   名前   タイプ 2  qqq111  Xさん   SA1 3  qqq222  Yさん   SA2 4  aaa111  Xさん   SB1 5  111    Xさん   SC3 6  222    Yさん   SC2 入力情報として上記のような3列からなる情報がエクセルに記入されていたとします。 A1,B1,C1にそれぞれ項目名(列名)があるとします。 番号111と222の人がC列に対して上記のようなタイプを保持しているとき 出力結果として下記の表をVBAにより自動発生させることを実現したいです。     A    B    C    D    E    F    G    H    I 1            SA1   SA2  SB1  SB2   SC1  SC2  SC3 2  番号  名前 3  111   Xさん  ○         ○                  ○ 4  222   Yさん        ○                  ○ ロジックとして、 出力結果のA列は、入力情報のA列の"数字"部分です。 頭三文字:aaa,qqqは省きます。 出力結果のB列は重複している名前を一つにして出力しています。 つまり番号列は数字部分、名前はそのままでそれぞれ重複文を 圧縮して出力します。 さらに、入力タイプ列に書かれた情報通りに○をCからI列のどれかに ○を付けます。 番号と名前は可変するとします。。 また、タイプはSA1からSC3で固定でしてこの中のいづれかに該当するとします。 動作確認を行いOKとなったソースプログラムの記述を御願い致します。 以上長くなりますが、何卒宜しく御教授お願い致します。

  • Excel VBA 別ブックを開かずに転記

    Excel2007のユーザーフォームについて教えてください。 ユーザーフォームを以下のように作成しました。 ■テキストボックス6つ テキストボックス2→件名 テキストボックス3→数 テキストボックス4→名前 テキストボックス5→備考1 テキストボックス6→備考2 ■コマンドボタンが1と3の2つです。 コマンドボタン1→転記と印刷 コマンドボタン3→終了 ■シートの構成  sheet"作成と一覧"   1行目を以下の項目で使用しています。  A1→番号(テキストボックス1を表示)  B1→件名(テキストボックス2を表示)  C1→数(テキストボックス3を表示)  sheet"印刷"  A1→番号(テキストボックス1を表示)  A2→件名(テキストボックス2を表示)  B2→数(テキストボックス3を表示)  A3→名前(テキストボックス4を表示)  A4→備考1(テキストボックス5を表示)  A5→備考2(テキストボックス6を表示) テキストボックスに入力した値を2つのシートにそれぞれ転記して、 シート"印刷"を2部印刷しています。 ここまで以下のコードで行いました。 Private Sub CommandButton1_Click() '入力値を作成と一覧シートに転記 行 = ActiveCell.Row 列 = ActiveCell.Column Cells(行, 列) = UserForm1.TextBox1.Value Cells(行, 列 + 1) = UserForm1.TextBox2.Value Cells(行, 列 + 2) = UserForm1.TextBox3.Value '入力値を印刷シートにに転記 Worksheets("印刷").Range("A1") = UserForm1.TextBox1.Value Worksheets("印刷").Range("A2") = UserForm1.TextBox2.Value Worksheets("印刷").Range("B2") = UserForm1.TextBox3.Value Worksheets("印刷").Range("A3") = UserForm1.TextBox4.Value Worksheets("印刷").Range("A4") = UserForm1.TextBox5.Value Worksheets("印刷").Range("A5") = UserForm1.TextBox6.Value 部数 = 2 Worksheets("印刷").PrintOut Copies:=部数, Collate:=True UserForm1.TextBox1.SetFocus Cells(行 + 1, 列).Select End Sub Private Sub CommandButton3_Click() '終了ボタンで値をクリアしてウィンドウを閉じる Dim Ctrl As Control For Each Ctrl In Controls If TypeName(Ctrl) = "TextBox" Then _ Ctrl.Value = "" Next Ctrl Unload Me End Sub 教えて頂きたい事なのですが・・・ コマンドボタン1の入力値を作成と一覧シートに転記の所なのですが、 アクティブセルではなく、常にA列の最後の値の次の空白行に転記するようにしたい場合、 どのように書き換えればいいのでしょうか? もう一点ですが、 別ブックにテキストボックス1から6が入力された一覧があります。 この別ブックを開かずに、 テキストボックス1に入力された番号を探して、 テキストボックス2から6に表示されるようにしたいのです。 うまく説明できないのですが・・・ 別ブックの名前は"たちつ" 別ブックは、あいうサーバーの かきくフォルダの中のさしすフォルダです。 ブック"たちつ"に"一覧"というシートがあります。 一覧のシートのD列の3行目以降には番号が入力されており、日々増えています。 テキストボックス1に入力された番号を、 一覧のD列から探し、 I列の値をテキストボックス2へ K列の値をテキストボックス3へ L列の値をテキストボックス4へ M列の値をテキストボックス5へ J列の値をテキストボックス6へ転記させたいのです。 同じブックの別シートを参照するときには Application.VLookupで出来たのですが、 マクロの記録でやってみても、解決できませんでした。 コードをご覧いただいてお分かりの通り、 VBA超初心者です。 ネットを見ながら試行錯誤している状況です。 コードの間違い等あるかもしれませんが、 ご教示よろしくお願いいたします。