3つのブックで指定した列のデータを集計する方法は?

このQ&Aのポイント
  • 初心者の方がWinXPとExcel 2002を使用して、3つの同型データを持つブックの指定した列のデータを別ブックに集計する方法を教えてください。
  • 質問者は、3つのブックに12シートずつの数字データがあり、その中から指定した列のデータのみを「集計1」という別ブックに書き込みたいと考えています。
  • また、質問者はマクロを使用して一度に実行したいとしています。
回答を見る
  • ベストアンサー

3つのブックで指定した列(3箇所)のみを別ブックへ書き込むには?

何卒、ご教示願います。 初心者です。WinXP、Excel 2002を使用。 同じxlsウインドウ内に3つのブックがあります。 松20060730.xls  竹20060730.xls  梅20060730.xls  …3つは同型内容のデータ それぞれ12シート(1S~12S)ある数字のデータ(最高行170行以下で変動します) の →3つの指定した列のみを→ 同じxlsウインドウ内の別ブック「集計1」(A列と1行が項目名)に書き込む。 1回のマクロ実行で可能なのでしょうか? --------------------------------------- Sub 3つのブックを1つのブックへ()   Call Test1   Call Test2   Call Test3  ブック「集計1」を「昇順に並び替える」  「行列を入れ替える」   End Sub --------------------------------------- A  B  C  D  E  F  G  H  I   ・・・・・・   N・・・ 01 松  2006年07月30日 9:00 あ い 赤 う ま さ こ き 青 ち く と ね 黄     32.3            9.9       6.3          136.3            31.8      1369.3      74.3           424.8      681 赤(C3…全シート同じ) 青(I3 …全シート同じ) 黄(N3…全シート同じ) Sub Test1() 「赤」列の36データ(項目名:赤も含む) を 別ブック「集計1」のB2~B37に 松竹梅の順で 横へ順次書き込む Sub Test2() 「青」列の36データ(項目名:青も含む) を 別ブック「集計1」のB38~B73に 松竹梅の順で 横へ順次書き込む Sub Test2() 「黄」列の36データ(項目名:黄も含む) を 別ブック「集計1」のB74~B109に 松竹梅の順で 横へ順次書き込む 以上のような内容でございますが、何卒よろしくお願い致します。

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

  • ベストアンサー
  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.5

#2です。 > 最後の下記部分だけなんですが、実行されない > ここがポイントだと思い、考えたのですが… #2の補足で Macro2 は動作済みだった筈ですが、そうでは無いのでしょうか? エラーが出ないなら、最終シートには少なくとも1列は転記されていると思いますが、、 36枚のデータ用シートのセル J1 が空なのではありませんか? Range("IV1").End(xlToLeft).Offset(0, 1) は セル IV1 から Ctrl + ← キーを押して移動したセルの1つ右のセルを意味します。 各データ用シートの J1 が空の場合、この動作は何度繰り返しても同じセルを選びます。 そのため、データの先頭が J4 ならば、最終列判定は IV4 でないといけません。 但し 4行目と言う半端なセルへ「列」を貼り付ける事は出来ないので EntireColumn で列全体の指定に直してやります。  Worksheets(i).Range("J:J").Copy _   Destination:=Worksheets(Worksheets.Count).Range("IV4").End(xlToLeft).Offset(0, 1).EntireColumn '----------------- 以上は単なる推測です。 文章だけのやり取りでは、提示されたコードを適宜 自分の環境に置き換える程度のスキルは最低限必要ですよ。 初心者は免罪符ではありませんし、求めているものは初心者が望む以上の物だと感じます。

oshietecho-dai
質問者

お礼

申し訳ございませんでした。 推測された通りでございます。実行されました。 私の質問欄記載の表の通り、J1は空であり、動作確認済はC列「赤」の列(C1は文字があり)で実行したので表示されました。 十分承知してはいるのですが、自身が遂行しなけらばならない、いち作業があるので、順不同で飛び越えて行っている次第でございます。 ほんとに、有難うございました。

oshietecho-dai
質問者

補足

誠に、申し訳ございません。 以前のコード(複数の行を列方向へ昇順に並び替える)を   ↓ 「複数の列を行方向へ昇順に並び替える」に 編集(下記)しようとしてるんですが、どうしてもうまく行きません。 ご教示くださいませ。 下記例は、3行目が項目(B3以降)、最後行が320行以下(変動あり、空白あり)でございます。 ----------------- Sub 複数の列を行方向へ昇順に並び替える() Dim r As Range With Worksheets(Worksheets.Count) For Each r In .Range("B3", .Range("IV3").End(xlLeft)) r.Offset(1, 0).Resize(320,).Sort key1:=r.Offset(1, 0), _ Order1:=xlAscending, Header:=xlNo, OrderCustom:=1, _ Orientation:=xlTopToBottom Next r End With End Sub -----------------

その他の回答 (5)

  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.6

#2です。 ヘルプを活用しましょう。 End であれば、En|d のように単語内にカーソルを入れてF1キーでヘルプが出ます。 見れない場合はVBAのヘルプをOfficeのCDから追加インストールして下さい。 End(xlLeft)  → End(xlToLeft) Resize(320,) → Resize(320,1) 補足の域を超える(と言うか元の質問と繋がってない)質問がこれで2回目です。 私は専属の指導員ではありませんので、この回答を最後にします。

oshietecho-dai
質問者

お礼

度々、誠に、有難うございました。 解らない事は、別ページにて、質問したいと思います。

  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.4

#2です。 ループをマスターしましょう。ループの構文は数パターンで後は応用です。 For i = 1 to x ~ Next、For Each x in xs ~ Next、Do ~ Loop Sub SheetLoop1()  For i = 1 To Worksheets.Count    MsgBox Worksheets(i).Name  Next i End Sub Sub SheetLoop2()  For Each w In Worksheets    MsgBox w.Name  Next w End Sub Sub BookLoop1()  For i = 1 To Workbooks.Count    MsgBox Workbooks(i).Name  Next i End Sub Sub BookLoop2()  For Each w In Workbooks    MsgBox w.Name  Next w End Sub 「Macro1」と「Macro2」と「複数の列を1つの列にする」は1つのループに収まるものではないですか? iだけ変数がダブっているのでmyColにしましたが、、 Sub hogehoge() '目的セルを~ より転記 Dim r As Range, base As Range Dim x, y Dim i, myCol 'Macro2より For i = 1 To Worksheets.Count - 1  '目的セルを~とMacro2でSelectを使用しているため追加  Worksheets(i).Select    'Macro1よりより転記  Range("J4:K158").Select  '目的セルを~ より転記  Set r = Selection  Set base = Selection.Cells(1, 1)  x = r.Columns.Count  y = r.Rows.Count  For myCol = 1 To x - 1    base.Offset(0, myCol).Resize(y).Copy base.Offset(y * myCol)  Next  base.Offset(0, 1).Resize(y, x - 1).Clear  base.Select  'Macro2より転記  Worksheets(i).Range("J:J").Copy _   Destination:=Worksheets(Worksheets.Count).Range("IV1").End(xlToLeft).Offset(0, 1) Next i End Sub

oshietecho-dai
質問者

補足

どうも、誠に有難うございます。 度々、すみいません。 最後の下記部分だけなんですが、実行されない(エラーではなく、表示されない)ので、自身で思考錯誤してみたのですがうまくできません、 >iだけ変数がダブっているのでmyColにしましたが、 ここがポイントだと思い、考えたのですが… よろしくお願い致します。 -------------------------- 'Macro2より転記  Worksheets(i).Range("J:J").Copy _   Destination:=Worksheets(Worksheets.Count).Range("IV1").End(xlToLeft).Offset(0, 1) Next i End Sub --------------------------

  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.3

#2です。 > 下記 Macro1の手動をせずに「Macro2」とのよい繋ぎ方が自身ではうまく出来ません。 > Range"J4:K158" は 36(変動あり)シート全部同じです。 > もしよろしかったら、是非ご教示下さいませ(私の編集部分も併せて)。 ご質問の意味も何が質問なのかも解りませんでした。 分散したマクロは順番に Call する Sub を作るか、同じ Sub~End Sub内に記述してやれば良いだけです。 Macro1 で「複数の列を1つの列にする」マクロが記述されておらず、何をしているのかも解りませんし、、、

oshietecho-dai
質問者

補足

説明・解釈不足で大変すみません。 Macro1とMacro2を、繋げる必要はなかったわけでしたね。 Macro1 のまとめ方がうまくできないということでした。 よろしくお願い致します。 >Application.Run "複数の列を1つの列にする" は下記に記載します。 現状ですと、Macro1を36回(変動あり)実行することになります。 つまり、36(変動あり)シートなので、手動にて、"J4:K158"を36回範囲選択し、 手動にて"複数の列を1つの列にする"を36回実行することになります。 が、 『36シート分全部を1度に"J4:K158"を選択し、"複数の列を1つの列にする"を実行』 のマクロを作成すればよいわけですか?  そして、Call Macro2 すればよいわけでしょうか? ---------- Public Sub 目的セルを手動選択後に複数の列を1つの列にする() Dim r As Range, base As Range Dim x, y Dim i Set r = Selection Set base = Selection.Cells(1, 1) x = r.Columns.Count y = r.Rows.Count For i = 1 To x - 1 base.Offset(0, i).Resize(y).Copy base.Offset(y * i) Next base.Offset(0, 1).Resize(y, x - 1).Clear base.Select End Sub ------------

  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.2

可能かと言う質問に対しての回答は「可能です」になります。 セル範囲、シート名、ブック名などがいつも固定ならば、それぞれマクロ記録を取って順番にCallすれば良いだけですが、行などが可変となると書換えが必要です。 可変行とシートループ処理は前々回の質問時にサンプルを書きました。 それらを検証してご自分の物にしないといつまでも上達しません。 ご質問には何度か回答していますが、だんだん丸投げになって来ているような印象を受けました。

oshietecho-dai
質問者

補足

大変申し訳ございませんでした。今の私の能力・時間等では、仕方が…。 おかげさまで、非常にガサツですが、なんとか(3つのブックを1つにすることにより)、本質問は、自身にて解決できたと思います。 が、 #1様の以前の下記「Macro2」を 列を貼り付けるように編集させて頂きましたが(動作済)、 下記 Macro1の手動をせずに「Macro2」とのよい繋ぎ方が自身ではうまく出来ません。 Range"J4:K158" は 36(変動あり)シート全部同じです。 もしよろしかったら、是非ご教示下さいませ(私の編集部分も併せて)。 ------- Sub 下記Macro1とMacro2()  ブック1の36(変動あり)シート全部に手動作業後、Macro1を完了し、  Call Macro2 End Sub ------- と、行っても可能だと思うんですが、 もっとシンプル(1回の実行)に出来るのでしたら、是非ご教示下さいませ。 ------------------------------ 目的セルを手動選択後に複数の列を1つの列にする Sub Macro1() ' ' Macro1 Macro ' 目的セルを手動選択後に複数の列を1つの列にする ' Range("J4:K158").Select Application.Run "複数の列を1つの列にする" End Sub ------------------------------ 複数シートのある列を→最後のシートの列へ順次貼り付ける Sub Macro2()    Dim i As Integer On Error Resume Next For i = 1 To Worksheets.Count - 1   Worksheets(i).Range("J:J").Copy _   Destination:=Worksheets(Worksheets.Count).Range("IV1").End(xlToLeft).Offset(0, 1) Next i End Sub ------------------------------

  • NCU
  • ベストアンサー率10% (32/318)
回答No.1

そのまま記述されればよろしいのでは? どこかわからない点でもあるのでしょうか? うまくいかない点を、コード、エラーメッセージと共に質問して下さい。

関連するQ&A

  • ExcelVBA ブック全データを別ブックにコピー

    お世話になります。 自分のPC環境のC:\test\配下にある"練習.xls"というブックがります。 ボタンが押された時にこのブックの全データをデスクトップにある"集計.xls"のA1から張り付けたいのです。 あるサイトで下記のようなロジックが公開されていましたので、ファイル名を変えて実行しましたが 下記★箇所で"インデックスが有効範囲にありません"とエラーが出てしまいます。 どなたか改善方法をご教授いただけませんでしょうか? よろしくお願い致します。 環境 windows XPSP3  Excel2003 Sub ボタン1_Click() Dim a As Variant Dim b As Variant Workbooks.Open Filename:="C:\test\練習.xls" ★Set a = Workbooks("\C:\test\練習.xls").Worksheets("sheet1").UsedRange Set b = Workbooks("集計.xls").Worksheets("sheet1").Range("A1") a.Copy (b) Set a = Nothing Set b = Nothing End Sub

  • 2つのブックで、1レコードの3列の値が同じ行のセル選択するには?

    2つのブックで、1レコードの3列の値が同じ行のセル選択するには? Windows XP Home Edition Office XP Personal 2002 Excel 2002 画像のように、 左.xls のB5(赤色セル)を選択したら  右.xls のB10(B9ではありません)を選択させたいのですが、 うまく行きません。 左右のブックの赤色セルの各行番号は同じではありません。 1レコードの「 B列 と C列 と D列 」の「3列の値が同じ行のセル」を選択したいのです。 この行は、必ず1つしかありません。 しかし「 B列 と C列 」「 B列 と D列 」などの「2列の値が同じ行のセル」は複数あります。 また、 左.xls のB6(青色セル)を選択した場合は、  右.xls のB12(B11ではありません)を選択させたいのです。 B列( 日付、実際には西暦 2010/05/05 です )だけは、全く同じデータとなっております。 ●2つのブックを左右に並べて、  同じ行データを閲覧したいわけでございます。 下記コードは、B列だけしか参照できません。 ややこしくて、恐れ入りますが、 何卒、ご教示のほどをお願い致します。 Sub TEST() Const wBook = "右.xls" '表示させたいBook名 Const wSht = "Sheet1" '表示させたいSheet名 Dim Target As Range Dim TargetVa As Integer TargetVa = ActiveWindow.ActiveCell.Value With Workbooks(wBook).Sheets(wSht)   For Each Target In .Range("B1", .Range("B65536").End(xlUp))    If Target.Value = TargetVa Then     Workbooks(wBook).Activate     Sheets(wSht).Activate     Target.Cells.Select    End If   Next Target  End With End Sub

  • 他ブックのセル参照するのに名前をセルで指定して参照させたい。

    他ブックのセル参照するのに名前をセルで指定して参照させたい。 題名が適当でないかもしれませんが、よろしくお願いします。 オフィス2000もしくは2002です。 200604.xls、200605.xlsという日付を基にした名称の規則的なブックがあります。 ファイル自体はネットワークの共通ドライブにあります。 それぞれsheet1に同様の形式で値のデータ(文字)が入っています。 その中のA1、B1、C1~・・・の値を 別ブック(仮にtest.xls)のA1に2006、A2に5と入力させることによって test.xlsの3行目に200605.xlsのA1、B1、C1~・・・の値を表示させたいです。 ブック名 test.xls    A列  B列  C列 ・・・・・・ 1行 2006 2行  5 3行 200605.xlsのA1、B1、C1~の値を表示させたいです。 4行 フォルダー名\[200605.xls]sheet1'!A1、次B1、次C1、と都度埋め込んでいけば値自体は出るのですが、 ブック名が手軽に変えられなくて困っています。 test.xlsのセルに埋め込んだ ='フォルダー名\[200605.xls]sheet1'!A1の [カッコ内]の文字をA1,A2セルに入れた値で参照させたいのですが、、、。 (A2は5ですが、参照したいのは2006の05というのも少々ミソです) 結果が同じなら手段はそんなには問いません。 よろしくお願いします。

  • 別のブックから、特定のシートを指定して他のブックを開くには

    マクロ初心者です。 A.xlsと、B.xlsという2つのブックがあります。 B.xlsはこの時、閉じた状態です。 Aには1つのシートのみがあって、Bには日毎に追加されていく不特定数のシートがあります。 Aのブックのシート内のセル番地A1に、「aaa」と入力した場合、B内の「aaa」という名前のシート名を指定してB.xlsを開くマクロはどう書いたら良いのでしょうか。 頼りきりの質問になってしまって申しわけございません。 何卒宜しくお願い申し上げます。

  • エクセルでブック間のシートの合体?教えてください。

    エクセルの作業で困っちゃいました。 同じホルダー内に 0210A.xls、sから0309A.xlsの12種類 0210B.xls、sから0309B.xlsの12種類 0210C.xls、sから0309C.xlsの12種類 0210D.xls、sから0309D.xlsの12種類 の48のブックがあります。(0210は2002年10月の意味です。) 各ブックは複数のシートを持っており、各ブックに共通してあるのは「AAA」、「BBB」、「CCC」の3種類で、それ以外のシートもあります。シートの順番は各ブックによりまちまちです。 これらのブックの共通する3種類のシートだけを合体して 0210AB.xlsから0309AB.xlsの12種類、(AとBの合体) 0210CD.xlsから0309CD.xlsの12種類、(CとDの合体) の24種類のブックを作りたいのです。 各ブックは「AAA」、「BBB」、「CCC」の3シートを持ちます。中身はオリジナルの各「AAA」、「BBB」、「CCC」の単純な寄せ集めです。 データは各シートとも1行目に項目、2行目以降にデータで、列はAF列まで使用しています。データの個数はまちまちで、オートフィルターを使用しています。 たとえば、0210A.xlsのシートAAAが200行であれば0210BのシートAAAのデータの一行目の項目は不要ですので2行目から最終行までコピーして201行以降に貼り付けるという感じです。同様にシートBBB、シートCCCも処理します。各シート1行目はオリジナルと同じ項目名とします。 手作業でやろうと思いましたが、誤りの発生もこわいのでVBAなどでうまくできる方法はないでしょうか?わたしのVBAの知識はマクロ自動記録ができるくらいなので助けてほしいのです。 Windows2000でエクセルも2000です。 よろしくお願いしま~す。

  • エクセルVBAで複数のブックから指定のシートを別のブックに複写するには

    エクセルVBAの超初心者です。 複数のフォルダに「●●社計算書(2010年3月).xls」・・・()内の年月は毎月増えます。格納されているフォルダは各会社名です。 というブックがあります。その各ブック内の売上というシートにある商品コードと売上金額を別の集計用ブックで集計したいと思っています。 どのように集計用ブックにコードを書いたらよいのでしょうか? 1 商品コードは各社共通です。 2 ブック名は共通ですがブック内のフォーマットは共通していません。(シート名は共通) 3 集計するのは集計時の年月度のデータです。 要領を得ず、ぶしつけな質問かと思いますが、大変困っています。 どなたかお分かりになる方、ご教授願います。 

  • エクセルVBA 集計

    事情がありピボットテーブルを使用しないで実現したいです シート1のドロップダウンリストで集計したい項目を2つ選択(15項目中) 例えば、項目1が色、項目2が形と選択 シート2に500件程(数が増える)のデータがあり、シート3へ集計 (シート3)  A | B | C | D |・・・・・・ 1|色|数|形|数|・・・・・・ 2|赤|30|○|10| 3|青|20|△|20| 4|白|40|□|30| 5|黄|40| ・ ・ シート1で設定した項目1でシート3の1行目を参照し、合致したデータをシート4のA列、B列に貼り付け シート1で設定した項目2でシート3の1行目を参照し、合致したデータをシート4の1行目、2行目に貼り付け 数値は例えばC3なら赤で○のものを表示 (シート4)  A | B | C | D |・・・・・・ 1| |   形  |・・・・・ 2| | |○|△|□| 3| |赤|20|10|16| 4|色|青|10|15|23| 5| |白|14|15|35| 6| |黄|17|15|35| ・ ・ このような感じでシート4を作るVBAをご伝授ください。 シート1、シート2、シート3は出来ているので大丈夫です。 稚拙な説明ですいません。 よろしくお願いいたします。

  • エクセル 特定のシートを異なるブックの指定したシートにコピーするマクロ

    エクセルの"貼り付け先.xls"の(シート名="集計")を開いている状態で、 別の異なるブックの"貼り付け元.xls"の(シート名="sheet1")の内容を全部コピーして "貼り付け先.xls"の(シート名="集計元データ")へ貼り付けるマクロは どのようになりますでしょうか? いろいろ調べて下記のように書きましたが、 インデックスが有効範囲にありませんというメッセージが出て、 デバッグを確認すると Workbooks("貼り付け元.xls").Worksheets("Sheet1").Range("A1").Copy_の部分が黄色く表示されてきます。 (1) "貼り付け先.xls"と"貼り付け元.xls"は同じパソコンのマイドキュメントに保存されています。 (2)"貼り付け元.xls"の"Sheet1"はセルA1から入力されていて、 内容は毎日変わります。 (3)Range("A1")や("A1:IV65536")のセル番地をいろいろ変えたりしても同じでした。 Sub クリップボードを経由せずにコピー貼り付けする_異なるブック() Workbooks("貼り付け元.xls").Worksheets("Sheet1").Range("A1").Copy_ Workbooks("貼り付け先.xls").Worksheets("集計元データ.xls").Range ("A1:IV65536") End Sub

  • Excelで質問です。ListBoxの項目を別bookから読込むには

    Excelで質問です。ListBoxの項目を別bookから読込むには VBA初心者です。 book-AのListBox1からbook-Bのセルの項目を読み込むことは可能なのでしょうか。 Excel2003です。 book-AのUserForm1に下記のコードを実行しても構文エラーになってしまいます。 book-Aとbook-Bは同じフォルダに入っています。出来ればbook-Bを閉じた状態で実行できれば良いのですが Private Sub UserForm_Initialize() ListBox1.RowSource =[book-B.xls]Sheet1!A1:A10 End Sub

  • 2つのブックで、1レコードの2列の値が同じ行のセル選択するには?

    2つのブックで、1レコードの2列の値が同じ行のセル選択するには? Windows XP Home Edition Office XP Personal 2002 Excel 2002 画像のように、左.xls 右.xls 共に、 1レコードの 「 B列 と C列 」 の値が同じ行のセルを選択したいのですが、 うまく行きません。 画像の例では赤色セルの部分です。 左右のブックの赤色セルの各行番号は同じではありません。 B列(日付、実際には西暦です)だけは、全く同じデータとなっております。 ●2つのブックを左右に並べて、  同じ行データを閲覧したいわけでございます。 何卒、ご教示のほどをお願い致します。 Sub TEST() Const wBook = "右.xls" '表示させたいBook名 Const wSht = "Sheet1" '表示させたいSheet名 Dim Target As Range Dim TargetVa As Integer TargetVa = ActiveWindow.ActiveCell.Value With Workbooks(wBook).Sheets(wSht)   For Each Target In .Range("B1", .Range("B65536").End(xlUp))    If Target.Value = TargetVa Then     Workbooks(wBook).Activate     Sheets(wSht).Activate     Target.Cells.Select    End If   Next Target  End With End Sub

専門家に質問してみよう