• ベストアンサー

複数シートの対象範囲セルを1つのシートに集約

共通の条件で作成された複数シートの対象範囲セルを1つのシートに集約したく望んでおります。 月毎の身体測定結果を集約することが目的で、不特定の人数、名前の情報を管理しております。 (人数の最大は10名程度) 既存ブック(測定結果.xls)を予め設け、内部に「表紙」と「集計」シートを作成。 提出されたファイル内の各シートは測定結果.xls内に全て格納。(シート名は全て氏名です) 「表紙」シートに氏名の入力欄を設定(D列2行目から下方へそれぞれ入力) 入力された氏名からブック内のシートを検索し、対象となるシートの指定セルを「集計」シートの指定セルへコピー 説明が解り辛いと思いますので、例を伴ってご説明致します。 当月の身体測定結果をAさん・Bさん・Cさん・Dさん・Eさんの5名が提出したとします。 ※各人の測定結果はそれぞれのシート名「Aさん」、「Bさん」、「Cさん」、「Dさん」、「Eさん」で構成され、シート内の記載配列等も全て同様としております。(共通する書式フォーマットで作成) これらのシートは全て測定結果.xls内に存在するものとします。 1列目はタイトル、2列目から入力された必要数値となります。 A列には日付(A2セルから1日→A32セル=31日まで) B列には体温(B2から数値記載) C列には体重(C2から数値記載) D列には体脂肪率(D2から数値記載) E列にはBMI(E2から数値記載) F列には血圧(F2から数値記載) ※ ブック内の「集計」シートにタイトルやA列の日付も予め入力。 (1) ブック内「表紙」シートの氏名入力欄に測定者名を入力 (例:D2セル=Aさん、D3セル=Bさん、D4セル=Cさん、D5セル=Dさん、D6セル=Eさん) (2) マクロ実行 (3) 入力された測定者名から合致する対象シートを検索 (4) 「表紙」シートの氏名入力欄D2セルの対象であるAさんの情報(シート内B2::F32までの範囲)を「集計」シートB2::F32へコピー (5) D3セルの対象であるBさんの情報(同じくシート内B2::F32までの範囲)を「集計」シートG2::K32へコピー(コピー先を5列毎変える) (6) 優先順位に従い、動作を繰り返して全ての情報を「集計」シートに集約 ※ コピー先への優先順位は「表紙」シートの氏名入力欄上部より判定(D2→D3→D4・・・) このような動作をマクロ化したく望んでおります。 マクロの記録や相談箱を参考に何度かチャレンジしているのですが、コードの意味が理解できず、近づくことすら出来ません。 恐れ入りますが、ご教授いただきたくお願い致します。 以上

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

  • ベストアンサー
  • myRange
  • ベストアンサー率71% (339/472)
回答No.4

>何度かチャレンジしているのですが、コードの意味が理解できず 最初は皆、そうです。 が、習得するためには粘りと根性でそれを乗り切らないと。。。 ●集計シートに、予め、日付や項目を入力しておくというのは止めて それも全てマクロに任せた方がいいでしょう。 要するに集計シートは何もない状態、ということです。 もちろんクリアーもマクロでするわけですが。。 極力初心者用のコードにしてみました。。(^^;;; '--------------------------------------------- Sub Test()  Dim R As Long  Dim Clm As Integer  Dim Namae As String 'シート”集計”をクリアー  Sheets("集計").Cells.Clear '各個人のデータを”集計”へコピー  For R = 2 To Sheets("表紙").Cells(Rows.Count, "D").End(xlUp).Row    Clm = (R - 2) * 6 + 1    Namae = Sheets("表紙").Cells(R, "D").Value    Sheets(Namae).Range("A1:F32").Copy Sheets("集計").Cells(1, Clm)  Next R '最初の人の”日付列”だけ残し、他の人の”日付列”は削除  For Clm = Sheets("集計").Columns.Count To 2 Step -1    If Sheets("集計").Cells(1, Clm).Value = "日付" Then      Sheets("集計").Columns(Clm).Delete xlShiftToLeft    End If  Next Clm End Sub '-------------------------------------------------------   但し、各個人のシートはちゃんとあること。 集計へコピーした後、日付列を削除するときに、 項目名の"日付"を見つけて削除しますので "日  付" とか間にスペースなどがあるときは >If Sheets("集計").Cells(1, Clm).Value = ●"日付"● Then ●"日付"● の部分を変更すること。     

Tarjin_lar
質問者

補足

早速、使用してみました。 コピー先の条件は一切変わらぬものとして、 A列:日付~F列:血圧の6列分の測定結果が、8列、9列と引用する列が増加した場合と A列~F列がR列~Z列などに範囲が変わった際にはどの様に対応したら宜しいのでしょうか?

その他の回答 (4)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.5

半分以後になって「(2) マクロ実行」が現れて、初めてVBAの質問らしいと判る。 こんな書き方はまずい。標題に「VBAで・・」を入れるべきだ。 >「特定の」「不特定の」が好きみたいだが、わかりにくい。 質問者が言っている意味では書く必要はないと思う。 ーー なぜ実例を挙げないのか。回答者読者は、本当は質問者のシートを見たいのだ。それが出来ないから、判りやすい質問は、シートを例示して行うものだ。 ーー 「Aさん」シーのA,B、列の見出しは? 1,2,3・・の様子は?こういうものを書くのだよ。 列数など3、4列書けばコードの本質に影響しない。 行数も同じ。 A列ーーB列ーーーーーC列ーーーーD列 1日 体温数値   体重数値 体脂肪率数値   2日  以下上に同じ 3日 ・・ ーー 集計シートは 氏名指定順に Bさんシート内容 1日 ・・   Bさんシートの数値 31日 Dさんシート内容 1日 ・・  Dさんシートの数値 31日 Aさんシート内容 1日 ・・ 31日 ==== シート名を指定されたとき(まずはInputBoxで聞く、初歩的な方法でやる)シートを探すのは Sub test02() sn = InputBox("シート名=") Set sh = Worksheets(sn) For i = 1 To 3 '3行の例 For j = 1 To 3 'A,B,Cの3列の例 MsgBox sh.Cells(i, j) Next j Next i End Sub で良い。 上記のSet sh = Worksheets(sn)やsh.Cells(i, j)のようなやり方は簡単そうだが、独学では、なかなか到達しないだろう。 Sheet1で A1:C3 文字列にしているが「数値でも同じ。 a1 b1 c1 a2 b2 c2 a3 b3 c3 とするとa1,B1,c1,A2,B2,C2,A3,B3,C3の順にセルの値が表示されるだろう。 最下行は第31+アルファ(一定数)行に決まっているなら For i = 1 To 35などのようになる。人ごとに同じ行数かどうかはっきり書いてないが重要。 ーー 集計シートに集約するのは、前までに集約してなった行番号を変数(例えばk)に記憶し、1名分集約し終わったたら行数分加える。 次はその次行からデータを集める。 コピーは避けて 集計シートのセル=各人シートのセル をお勧めする。とりあえずうまく行ったら、 各人シートのセル群コピーーー>集計シートの貼り付け左上セル指定し貼り付け(Destinationの記述)をやると良い。 ーー 集計シートのセルの指定は or i=3 to 35 Worksheets("集計シート").Cells(k,j)=Worksheets("Aさん").Cells(i,j) 集計シートの列jは,個人の列と、同じか一定数プラスの列でしょう k=k+1 Next i 以上を参考に。 http://www.officepro.jp/excelvba/sheet/index1.html の Dim sheet1 As Worksheet Set sheet1 = Worksheets(2) sheet1.Range("A1").Value = "Test" のパターンを使う。私は sheet1を短くしてSh1などと使うように(個人的に)している。 sheet1.Range("A1").Value = "Test"はsh1.Range("A1").Value = "Test" になる。

Tarjin_lar
質問者

お礼

厳しいご指摘ながらも、懇切丁寧にご説明いただきましてありがとうございました。 少しずつではありますが、コードの意味を理解できるように頑張ります。 また、質問の方法や伝え方も改善するように致しますので、今後もどうぞ宜しくお願い致します。

  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.3

質問文からわかる範囲で、サンプルとして作成しました。 >マクロの記録や相談箱を参考に何度かチャレンジしているのですが チャレンジする気があるようなので、あとは適当に修正してください。 あえて、解説等は抜きにしてあります。 入力値チェックなどは、ほとんど行っていません。 Sub test() Dim hSheet As Worksheet, sSheet As Worksheet, dSheet As Worksheet Dim s As Worksheet, dRng As Range Dim rw As Long, sName As String, msg As String Set hSheet = Worksheets("表紙") Set dSheet = Worksheets("集計") dSheet.Range("B2").Resize(31, Columns.Count - 1).ClearContents Set dRng = dSheet.Range("B2:F32") msg = "" For rw = 2 To hSheet.Cells(Rows.Count, 4).End(xlUp).Row  sName = hSheet.Cells(rw, 4).Value  Set sSheet = Nothing  For Each s In Worksheets   If s.Name = sName Then Set sSheet = s: Exit For  Next s  If sSheet Is Nothing Then   msg = msg & sName & " --- シートなし" & vbLf  Else   dRng.Value = sSheet.Range("B2:F32").Value   Set dRng = dRng.Offset(0, 5)   msg = msg & sName & " --- コピー完了" & vbLf  End If Next rw MsgBox (msg) End Sub

  • hige_082
  • ベストアンサー率50% (379/747)
回答No.2

>コードの意味が理解できず、近づくことすら出来ません。 分らないことは、やめた方がいいよ 仕様の変更やエラーが出た場合の回避処理は 自分でやらなければいけないので サンプルを提示しておきますが、エラー等は自分で勉強してください Sub test() Dim 名前 As Variant Dim 出力シート As Worksheet Dim 読込範囲 As String Dim i As Integer Dim ii As Integer Set 出力シート = Worksheets("集計") 読込範囲 = "B2:F32" With Worksheets("表紙") 名前 = .Range("D2", .Range("D65536").End(xlUp)) End With For i = 1 To UBound(名前, 1) 出力シート.Cells(2, (i - 1) * 5 + 2).Resize(31, 5).Value = Worksheets(名前(i, 1)).Range(読込範囲).Value Next i End Sub

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.1

現在まで出来ている部分を提示してみては如何でしょう。

Tarjin_lar
質問者

補足

お世話になります。 >現在まで出来ている部分を提示してみては如何でしょう。 VBAに対してあまりにも無知なため、マクロの記録以降進んでおりません。 記録で得られたコードは以下のようになりましたが、出来ることならば氏名を別表(質問本文中「表紙」シートのD列2行目から下方)より参照し、膨大な手作業を回避したく望んでおります。 素人の無謀な質問とは思いますが、月末の集計に辟易として滅入っており、ご教授いただけるととても助かります。 Sub Macro1() Sheets("Aさん").Select Range("B2:F32").Select Selection.Copy Sheets("集計").Select Range("B2").Select ActiveSheet.Paste Sheets("Bさん").Select Range("B2:F32").Select Application.CutCopyMode = False Selection.Copy Sheets("集計").Select Range("G2").Select ActiveSheet.Paste Sheets("Cさん").Select Range("B2:F32").Select Application.CutCopyMode = False Selection.Copy Sheets("集計").Select Range("L2").Select ActiveSheet.Paste Sheets("Dさん").Select Range("B2:F32").Select Application.CutCopyMode = False Selection.Copy Sheets("集計").Select Range("Q2").Select ActiveSheet.Paste Sheets("Eさん").Select Range("B2:F32").Select Application.CutCopyMode = False Selection.Copy Sheets("集計").Select Range("V2").Select ActiveSheet.Paste End Sub ※別表の氏名とシート名は必ず一致させております。 何卒、宜しくお願い致します。

関連するQ&A

  • エクセルで参照する別シート名をセルに入力したい

    エクセルで参照する別シート名をセルに入力したいです。 (1) sheet2とsheet3にそれぞれA1:B10の表があります。    A列には氏名がB列には数値が入力してあります。    (同じ表で月度が違います。) (2) vlookup関数を使ってsheet1のA列に氏名を入力して対応する数値を    B列に求めたいです。 (3) この時、sheet1のC1に「sheet2」「sheet3」と入力することで    参照するシートを変えたいのですが、方法が解りません。 そもそも可能かどうかも解らず、悩んでいます。 ご教授お願いいたします。   

  • VBAにて、複数シートからデータを抽出

    エクセルVBAです。複数のシートからの集計、抽出の書き方について教えてください。 1つのファイルに50ほどのシートがあります。 各シートの列数やフォーマットは、同じですが行数は、異なります。 例 sheet1(シート名:集計):集計用   A    B    C       D     1 ※検索キーワードを入れるセルや 2   マクロを登録するボタン用として2行開けてある。 3 番号 氏名  郵便番号  住所  sheet2(シート名:STU)   A    B    C       D      1 番号 氏名  郵便番号  住所  2  1  AB   345    YZ 3  1  CD   678    QS sheet3(シート名:XYZ)   A    B    C       D      1 番号 氏名  郵便番号  住所  2  2  AB   345    YZ 3  2  CD   678    QS 4  3  CD   678    QZ 抽出前は、上記の様なファイルとなっております。 上記では、4列としてますが実際は、23列あります。 また、sheet3までですが、実際は、40~100シート位あります。 sheet1(シート名:集計):集計用   A    B    C       D     1     ※検索キーワード:氏名_CD としマクロを実行する  2       (↑例として氏名でフィルタリングしてますが他の指定項目でも実行したい、複数条件は、無)   3 番号 氏名  郵便番号  住所 4  1  CD   678    QS    (←sheet2(シート名:STU)の3列目) 5  2  CD   678    QS  (←sheet3(シート名:XYZ)の3列目) 6  3  CD   678    QZ  (←sheet3(シート名:XYZ)の4列目) ・  ・  CD    ・      ・ (←sheet4(シート名:・・・)の・列目) ・  ・  CD    ・      ・ (←sheet10(シート名:・・・)の・列目) ・ ・  CD    ・      ・ (←sheet27(シート名:・・・)の・列目) ・  ・  CD    ・      ・ (←sheet27(シート名:・・・)の・列目) ・ ・  CD    ・      ・ (←sheet30(シート名:・・・)の・列目) 上記の様にすべてのシートから氏名:CDでフィルタリングし集計シートに抽出したい。 よろしくお願いいたします。

  • 複数シートの同一セルを抽出する方法

    エクセル2007です。 シート名 学校1・・・学校nのA10セルに校長名が入っています。 シート名 集計の校長名の欄 B列 B2セルに学校1のA10 B3セルに学校2のA10   B(n+1)に学校nのA10 としたいのです。

  • Countifで複数シートを対象範囲にすることはできるか

    表題の件方法ありませんか? できなければあきらめてAccessでやります。 例 シートA、シートBにある「日付」項目(D列2~100) の中で9月17日のレコード数を集計する。。 なお、ひとつのシートでまとめればいいではないかと 思いますが、Excelの限度(65536)を超えてしまうのでできません。シートごとに日付集計の表を作り、 それを3D集計で計算する方法を思い浮かべましたが、 それ以外の迂回手段ありませんか?

  • 複数シートのセルの集計について

    複数のシートに同じ様式の表があり、それにはいくつかの項目があって該当すれば○を記載する、という形になっています。40名ほどに記載してもらったのでシートは40あります。 40シートの表のうち、たとえば「B20のセルに○を入力している人は全部で●●名」という風に別シートで集計したいのですが、セルをどう設定したらいいでしょうか。 調べたところ、複数シートだとcountifは使えないようで…。 色々試したのですがうまくいきませんでした。どなたかご教授ください。

  • エクセル 複数シートの同一セルを別シートへ集計

    エクセルで複数sheetの同一セルを集計sheetへコピーしてきて一覧にし、集計するという作業を行なっています。 1~20のsheet(sheet数sheet名は変動します)を作り、一番右側に集計sheetがあります。 集計sheetのA5へsheet1のF10、A6へsheet2のF10・・・(内容は文字列) 集計sheetのB5へsheet1のG10、B6へsheet2のG10・・・(内容は数値) とコピーしていき、B30にはB5~B29の合計がSUM関数で入っています。 VBAで、集計sheetから左側のsheetの指定セルを一気に集計sheetへコピーしてくる方法はないでしょうか。 ただし集計sheetから左側のsheet21とsheet22は集計に入れたくないという式も教えて頂きたいです。 お時間のある方、ご教授下さい。 または別の質問で参考になるようなものがあればアドレスを教えて下さい。 説明が下手で申し訳ないですが、どうぞよろしくお願いします。

  • ”シート名!セル値”を指定する時

    よろしくお願いします EXCEL2002を使用しています かなりの枚数のシートの集計結果を1シートにまとめたいです a)それぞれのシートの同じ位置に集計したいデータがある b)数式はコピーで入力したい c)シート名に規則性が無いので集計シートのA列に入力 数式='シート名'B1としたい時に シート名にA1の値が入るようにしたいのですが ='"A1"'!$B$1 としたらエラーでした どうすればいいですか?

  • 同一Bookに存在する複数sheetの一定範囲を縦列でコピー

    各先生方 お世話になります。 同一Book(○○月分集計.xls)内にシート名 ”集計” ”Aさん、Bさん、Cさん、Dさん、Eさん、Fさん・・・” が存在しております。 ※アルファベットのシート(人名)は月毎に数量が変動致します。 存在する複数のシートの内、”集計”以外のシートの一定範囲セルを”集計”シートのB3セルから「縦列」にコピーしたく望んでおります。 コピー元の対象範囲は各シート共通で、CB2セル~CJ131セル(列:9列分、行:130行分)です。 コピー元シートのコピーの順序は一切、制約をもちませんが、”集計”シート以外の全てのシートから範囲セルのコピーを行うことを条件としております。 (順序がB、C、E、D、A・・・  A、C、B、E、D・・・  のように都度ランダムに変更されても構いません) お手間を取らせて申し訳ございませんが、どの様なコードの記述にて可能となるのか、ご教授いただきたく宜しくお願い致します。

  • indirect 関数を使った複数シートの範囲指定方法

    エクセルでindirect 関数を使って作成してますが次のように出来ませんので、どなたか教えてください。 質問を検索してましたが見つけることが出来ませんでした。 以前の回答に同内容の回答があればそれを教えていただけるだけでも助かります。 12枚(1年分)の同一シートが、4月から3月まであります。(シート名は、それぞれ4,5,6・・・3と数字のみです) 別の集計シートに各シートの同座標のセルの集計を串刺し計算で行うと、=sum('4:3'!d20)でいいのですが、indirect関数で 別セルにそれぞれ A1=「4」B1=「3」(可変にして)を入力して参照した結果を求めたいのです。 '4:3'の部分を INDIRECT(A1&":"&B1&"!" & D20)) 等色々試しましたがどうしてもうまくいきません。 (#REF!となったりする) 単シートだけで有れば、=SUM(INDIRECT(A1&"!" & D20))で参照できるのですが・・・・ 恐らく、複数シートに設定した時の連続した範囲の「:」の扱い方に問題があるのじゃないかと思うのですがどなたか教えてください。 ちなみに、ピボットテーブルを利用する方法は、想定していません。

  • エクセル2003で、あるシートのAからCの各行のセル1からセル100

    エクセル2003で、あるシートのAからCの各行のセル1からセル100にどんどん氏名を入力をしてゆき(つまり、A1からC100までということ)、それらの中で、ダブり入力をしてしまつた氏名を、D列のセルD1から下の行にどんどん表示をしてゆきたいのですが、、 出来ますでしょうか?

専門家に質問してみよう