ExcelVBAで複数条件で抽出して表を作成する方法

このQ&Aのポイント
  • ExcelVBAを使用して複数の条件に一致するデータを抽出し、表を作成する方法を教えてください。
  • 処理前のデータの並び順と処理後の並び順が異なります。処理後は地域ごとに表を作成し、広域ごとにシートを分けます。
  • 処理前のデータには地域コード、性別コード、年代コード、疾患コードがあります。これらの条件で抽出し、表を作成する方法を教えてください。
回答を見る
  • ベストアンサー

ExcelVBAで複数条件で抽出して表を作成

ExcelVBAで複数条件一致の時の抽出法方を教えて下さい。 ここで教えていただいたコードがあるのですが、質問の仕方が悪かったのか、意図した結果が得られず、改変もできなかったので再質問です。よろしくお願い致します。 質問をすることは会社の許諾を得ているのですが、会社のPCからは制限がかかっており投稿できないのでスマホからです。なるべく伝わりやすいよう努めますが、力不足なときはお許し下さい。 Excelのオートフィルタ機能でもよいとも思ったのですが、処理数が100を越えるため、VBAを検討することにしました。 (1)処理前の並び順と、VBAで処理した後の並び順は異なります。 処理前:コードの昇順 処理後:地域ごとに表を作成し、更に広域ごとに表を掲載するシートを分ける (2)処理前の表は数字しか並んでいません。全てコード化しています。 (3)処理前はいくつもの地域の男女の値が表になっていますが、 ・地域コード ・性別コード ・年代コード ・疾患コード で抽出して、表を作る方法を教えて下さい。1つの地域を抽出する方法で良いのでお願い致します。 後は表を配置する場所と地域コードを指定して、自力で頑張ります。 <元データ> ---|-A-|-B-|-C-|-D-|-E-|-F-|-G-| 列|地域| 性 | 年 | 21 | 22 | 23| 24 | 01| 201 | 1 | 40 | 1 | 2 | 3 | 4 | 02| 201 | 1 | 50 | 2 | 4 | 2 | 1 | 03| 201 | 1 | 55 | 3 | 0 | 0 | 7 | 04| 201 | 1 | 65 | 2 | 1 | 1 | 6 | 05| 201 | 1 | 80 | 1 | 2 | 4 | 1 | 06| 201 | 1 | 95 | 7 | 5 | 4 | 3 | 07| 201 | 2 | 45 | 0 | 3 | 3 | 0 | 08| 201 | 2 | 60 | 4 | 2 | 2 | 6 | 09| 201 | 2 | 70 | 1 | 2 | 3 | 4 | 10| 201 | 2 | 75 | 3 | 6 | 0 | 3 | 11| 201 | 2 | 85 | 5 | 2 | 4 | 2 | 12| 201 | 2 |100| 2 | 2 | 1 | 0 | 13| 202 | 1 | 40 | 1 | 2 | 3 | 4 | 14| 202 | 1 | 45 | 3 | 5 | 2 | 7 | 15| 202 | 1 | 55 | 1 | 2 | 3 | 2 | …続く ・A列は地域コードです。 ・B列は性別コードです。男性が「1」女性が「2」です。 ・C列は年代コードです。 40/45/50/55/60/65/70/75/80/85/90/95/100 という形に40から100まで5歳刻みです。 ・D列~G列は疾病コードです。 <希望> ・元データの年代は値がないと表示がありません。ですが、出力される表には全ての年代を表示させるのが希望です。 <処理後の表> VBA実行後は、以下のような表が1つ作成できることが希望です。教えていただいたコードを元に、配置場所を変更できるようになっていると大変ありがたいです。 01| 201 |----| 21 | 22 | 23 | 24 |合計| 02|男性 | 40 | 1 | 2 | 3 | 4 | 10 | 03|男性 | 45 |-----|-----|-----|----| 0 | 04|男性 | 50 | 2 | 4 | 2 | 1 | 9 | 05|男性 | 55 | 3 | 0 | 0 | 7 | 10 | 06|男性 | 60 |-----|-----|-----|----| 0 | 07|男性 | 65 | 2 | 1 | 1 | 6 | 10 | 08|男性 | 70 |-----|-----|-----|----| 0 | 09|男性 | 75 |-----|-----|-----|----| 0 | 10|男性 | 80 | 1 | 2 | 4 | 1 | 8 | 11|男性 | 85 |-----|-----|-----|----| 0 | 12|男性 | 90 |-----|-----|-----|----| 0 | 13|男性 | 95 | 7 | 5 | 4 | 3 | 19 | 14|男性 |100|-----|-----|-----|----| 0 | 15|男性 |合計| 16 | 14 | 14 | 22| 66 | 16|女性 | 40 |-----|-----|-----|----| 0 | 17|女性 | 45 | 0 | 3 | 3 | 0 | 6 | 18|女性 | 50 |-----|-----|-----|-----| 0 | 19|女性 | 55 |-----|-----|-----|-----| 0 | 20|女性 | 60 | 4 | 2 | 2 | 6 | 14 | 21|女性 | 65 |-----|-----|-----|-----| 0 | 22|女性 | 70 | 1 | 2 | 3 | 4 | 10 | 23|女性 | 75 | 3 | 6 | 0 | 3 | 12 | 24|女性 | 80 |-----|-----|-----|-----| 0 | 25|女性 | 85 | 5 | 2 | 4 | 2 | 13 | 26|女性 | 90 |-----|-----|-----|-----| 0 | 27|女性 | 95 |-----|-----|-----|-----| 0 | 28|女性 |100| 2 | 2 | 1 | 0 | 5 | 29|女性 |合計| 15 | 17 | 13 | 15 | 60 | こんな表にしたいです。 縦横のそれぞれの合計が出せると素敵です。 お知恵を拝借したく、何卒、よろしくお願い致します。

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

  • ベストアンサー
  • end-u
  • ベストアンサー率79% (496/625)
回答No.3

やりたい事と少し方向性が違うかもしれませんが、PivotTableを使ったアプローチ。 1)ActiveWorkbookに対して処理を行う。 2)ActiveWorkbookに「元データ」という名前のシートがあり、データはそのA1セルが起点。 3)A列は空白セルがない連続データであり、データ行数をA列の個数で判断できる。 4)1行目は空白セルがない連続データであり、データ列数を1行目の個数で判断できる。 5)A1:C1セルに "地域","性","年" という項目名がある。 以上を前提条件とします。 Sub Macro1()   Dim pt As PivotTable   Dim i As Long   With ActiveWorkbook     .Names.Add Name:="database", RefersToR1C1:="=INDEX(元データ!R1,COUNTA(元データ!R1)):INDEX(元データ!C1,COUNTA(元データ!C1))"     Set pt = .PivotCaches.Add(SourceType:=xlDatabase, SourceData:="database").CreatePivotTable("")   End With   pt.AddFields RowFields:=Array("性", "年"), ColumnFields:="データ", PageFields:="地域"   For i = 4 To Range("database").Columns.Count     pt.AddDataField pt.PivotFields(i), , xlSum   Next   With pt.PivotFields("性")     .PivotItems("1").Caption = "男性"     .PivotItems("2").Caption = "女性"     .ShowAllItems = True   End With   pt.PivotFields("年").ShowAllItems = True End Sub

minminwamidori
質問者

お礼

地域コードが選択できることに気づきませんでした(^_^;)スミマセン…ちょっと手間ですが、形式を指定して貼付で「値だけ」にして地道に表をレイアウトしていきたいと思います。ちょっと急ぎなので、この回答が今の私に一番良さそうです。発想の転換でした!ありがとうございました!

minminwamidori
質問者

補足

ありがとうございます。ですが、全ての合計を出したいのではなく、1つの地域コードを指定して、表を作成したいのです。ピポットテーブルは検討しましたが、100近くある地域コードについてそれぞれやるのには不向きと思い止めた経緯があります。

その他の回答 (3)

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.4

No.1.2です。 たびたびごめんなさい。 各地域ごとで男女別の合計が必要なのですね! 前回は単に総合計だけでしたので、無視して↓のコードにしてください。 今回もSheet3を作業用のSheetとして使用しています。 Sheet1のデータは2行目以降にあるとします。 Sub Sample2() Dim i As Long, j As Long, k As Long, endRow As Long Dim c As Range, myRange As Range, wS1 As Worksheet, wS2 As Worksheet Set wS1 = Worksheets("Sheet1") Set wS2 = Worksheets("Sheet2") Application.ScreenUpdating = False endRow = wS1.Cells(Rows.Count, "A").End(xlUp).Row wS2.Cells.Clear With Worksheets("Sheet3") wS1.Range("A:A").AdvancedFilter Action:=xlFilterInPlace, unique:=True wS1.Range("A:A").SpecialCells(xlCellTypeVisible).Copy .Range("A1") wS1.ShowAllData wS1.Range("B1").Resize(, 6).Copy .Range("C1") .Range("I1") = "合計" .Range("A1").Sort key1:=.Range("A1"), order1:=xlAscending, Header:=xlYes For k = 2 To 14 .Cells(k, "B") = (k - 2) * 5 + 40 Next k .Cells(15, "D") = "合計" Set myRange = .Range("C2:H14") For i = 2 To .Cells(Rows.Count, "A").End(xlUp).Row .Range("C1") = .Cells(i, "A") wS1.Range("A1").AutoFilter field:=1, Criteria1:=.Cells(i, "A") wS1.Range("A1").AutoFilter field:=2, Criteria1:="1" .Range("C15") = .Cells(i, "A") & "男性" Range(wS1.Cells(1, "A"), wS1.Cells(endRow, "G")).SpecialCells(xlCellTypeVisible).Copy .Range("J1") For k = 2 To 14 Set c = .Range("L:L").Find(what:=.Cells(k, "B"), LookIn:=xlValues, lookat:=xlWhole) If Not c Is Nothing Then .Cells(c.Row, "K").Resize(, 6).Copy .Cells(k, "C") Else .Cells(k, "C") = 1 .Cells(k, "D") = .Cells(k, "B") End If Next k With .Range("I2:I14") .Formula = "=SUM(E2:H2)" .Value = .Value End With With .Range("E15:I15") .Formula = "=SUM(E2:E14)" .Value = .Value End With .Range("C1:I15").Copy wS2.Cells(Rows.Count, "A").End(xlUp).Offset(1) .Range("J1:P14").ClearContents myRange.ClearContents wS1.Range("A1").AutoFilter field:=1, Criteria1:=.Cells(i, "A") wS1.Range("A1").AutoFilter field:=2, Criteria1:="2" .Range("C15") = .Cells(i, "A") & "女性" Range(wS1.Cells(1, "A"), wS1.Cells(endRow, "G")).SpecialCells(xlCellTypeVisible).Copy .Range("J1") For k = 2 To 14 Set c = .Range("L:L").Find(what:=.Cells(k, "B"), LookIn:=xlValues, lookat:=xlWhole) If Not c Is Nothing Then .Cells(c.Row, "K").Resize(, 6).Copy .Cells(k, "C") Else .Cells(k, "C") = 2 .Cells(k, "D") = .Cells(k, "B") End If Next k With .Range("I2:I14") .Formula = "=SUM(E2:H2)" .Value = .Value End With With .Range("E15:I15") .Formula = "=SUM(E2:E14)" .Value = .Value End With .Range("C2:I15").Copy wS2.Cells(Rows.Count, "A").End(xlUp).Offset(1) .Range("J1:P14").ClearContents myRange.ClearContents Next i wS1.AutoFilterMode = False .Cells.Clear End With With wS2.Range("A:A") .Replace what:=1, replacement:="男性", lookat:=xlWhole .Replace what:=2, replacement:="女性", lookat:=xlWhole End With With wS2 .Rows(1).Delete .Range("A1").CurrentRegion.Borders.LineStyle = xlContinuous .Columns.AutoFit End With Application.ScreenUpdating = True wS2.Select MsgBox "処理完了" End Sub ※ すべての地域を羅列するようにしていますので、 時間を要すると思います。m(_ _)m

minminwamidori
質問者

お礼

ありがとうございます。せっかく書いていただきましたが、表しか作成されませんでした(;_;)それと、表を羅列したいのではなく、地域コードを指定して1つだけ表を作りたいのです。総数を出したいのは書いていただいたとおり希望ですが、それはどうにかなるので、1つの地域コードを指定して表を出力するにはどうしたらいいのか教えて下さい_(._.)_

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.2

続けて・・・後半部分です。 wS3.Range("B1:H14").Copy wS2.Cells(Rows.Count, "A").End(xlUp).Offset(1) myRange.ClearContents wS3.Range("I:O").Clear .AutoFilter field:=2, Criteria1:=2 endRow = wS1.Cells(Rows.Count, "A").End(xlUp).Row Range(wS1.Cells(1, "A"), wS1.Cells(endRow, "G")).Copy wS3.Range("I1") For k = 2 To 14 Set c = wS3.Range("K:K").Find(what:=wS3.Cells(k, "A"), LookIn:=xlValues, lookat:=xlWhole) If Not c Is Nothing Then wS3.Cells(c.Row, "J").Resize(, 6).Copy wS3.Cells(k, "B") Else With wS3.Cells(k, "B") .Value = 2 .Offset(, 1) = wS3.Cells(k, "A") End With End If Next k With wS3.Range("H2").Resize(13) .Formula = "=SUM(D2:G2)" .Value = .Value End With wS3.Range("B2:H14").Copy wS2.Cells(Rows.Count, "A").End(xlUp).Offset(1) myRange.ClearContents wS3.Range("I:O").Clear End With Next i wS1.AutoFilterMode = False wS3.Cells.Clear With wS2 .Rows(1).Delete endRow = .Cells(Rows.Count, "A").End(xlUp).Row .Cells(endRow, "A").Offset(1) = "合計" Set c = Range(.Cells(1, "A"), .Cells(endRow, "A")) For k = 3 To 7 Set myRange = Range(.Cells(1, k), .Cells(endRow, k)) .Cells(endRow + 1, k) = WorksheetFunction.SumIf(c, 1, myRange) + _ WorksheetFunction.SumIf(c, 2, myRange) Next k .Range("A1").CurrentRegion.Borders.LineStyle = xlContinuous .Range("A:A").Replace what:=1, replacement:="男性", lookat:=xlWhole .Range("A:A").Replace what:=2, replacement:="女性", lookat:=xlWhole End With Application.ScreenUpdating = True wS2.Select MsgBox "処理完了" End Sub じっくり考えればもっと簡単になるかもしれませんが、 とりあえずはこの程度で・・・m(_ _)m

minminwamidori
質問者

お礼

ありがとうございます。試してみたのですが、表はきれいにできるのですが、結果は抽出されませんでした。それと、表は地域コード1つだけで作りたいので、羅列はしなくてよいのです。説明が下手で申し訳ありません_(._.)_1つだけで出力するにはどうしたらよいか、教えていただけますと幸いです。

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.1

こんばんは! Sheet1のデータをSheet2に表示するようにしています。、 Sheet見出し上には3つSheetがあり、Sheet3は使用していない状態にしておいてください。 Sheet1は1行目が項目行でデータは2行目以降にあるとします。 ↓のコードを標準モジュールにコピー&ペーストしてマクロを実行してみてください。 ただ、ダラダラと長いコードになってしまいましたので、 2回に分けて投稿します。 まず前半部分 Sub Sample1() Dim i As Long, k As Long, endRow As Long Dim c As Range, myRange As Range Dim wS1 As Worksheet, wS2 As Worksheet, wS3 As Worksheet Set wS1 = Worksheets("Sheet1") Set wS2 = Worksheets("Sheet2") Set wS3 = Worksheets("Sheet3") Application.ScreenUpdating = False wS2.Cells.Clear wS1.Range("B1").Resize(, 6).Copy wS3.Range("B1") wS3.Range("H1") = "合計" For i = 2 To 14 wS3.Cells(i, "A") = 40 + (i - 2) * 5 Next i Set myRange = wS3.Range("B2:H14") wS1.Range("A:A").AdvancedFilter Action:=xlFilterInPlace, unique:=True endRow = wS1.Cells(Rows.Count, "A").End(xlUp).Row Range(wS1.Cells(2, "A"), wS1.Cells(endRow, "A")).Copy wS3.Range("A16") wS1.ShowAllData For i = 16 To wS3.Cells(Rows.Count, "A").End(xlUp).Row wS3.Range("B1") = wS3.Cells(i, "A") With wS1.Range("A1") .AutoFilter field:=1, Criteria1:=wS3.Cells(i, "A") .AutoFilter field:=2, Criteria1:=1 endRow = wS1.Cells(Rows.Count, "A").End(xlUp).Row Range(wS1.Cells(1, "A"), wS1.Cells(endRow, "G")).Copy wS3.Range("I1") For k = 2 To 14 Set c = wS3.Range("K:K").Find(what:=wS3.Cells(k, "A"), LookIn:=xlValues, lookat:=xlWhole) If Not c Is Nothing Then wS3.Cells(c.Row, "J").Resize(, 6).Copy wS3.Cells(k, "B") Else With wS3.Cells(k, "B") .Value = 1 .Offset(, 1) = wS3.Cells(k, "A") End With End If Next k With wS3.Range("H2").Resize(13) .Formula = "=SUM(D2:G2)" .Value = .Value End With

関連するQ&A

  • ExcelVBAで一定ルールでの行追加

    いつもお世話になっています。 ExcelVBAについて教えて下さい。 以下のような表があったとします。 --|--A--|--B----|--C--|--D--|--E--| -||-性別-|-年代-|-数1-|-数2-|-数3-| 1|---1--|--40--|---5--|--0--|--3--| 2|---1--|--55--|---0--|--1--|--0--| 3|---1--|--60--|---2--|--1--|--0--| 4|---1--|--70--|---3--|--0--|--2--| 5|---1--|--90--|---0--|--1--|--1--| 6|---1--|-100--|---1--|--1--|--0--| 7|---2--|--45--|---4--|--2--|--1--| 8|---2--|--50--|---0--|--3--|--5--| 性別はコード別で、年代は40から100までが5才刻みですが、数(集計された結果)が無い年代は行がありません。 表は元々与えられた物なのですが別に使用するので、数が無くてもすべての年代が入っている表に作り替えたいと思っています。縦横の合計値も同時に出すのと、こういった表を100近く処理しないといけないので、表ごとに抜けている年代を確認して挿入…というのは手間がかかり、また複数のファイルを処理するのでVBAでやった方がよいと思いましたが、自分で書いてみてもうまくいきませんでした。 実現させたい形は以下の通りです。 ・男性  40/45/50/55/60/65/70/75/80/85/90/95/100  ・男性の40から100までの年代ができたら、  100の下に男性の数(縦)の合計値  ・男性の合計の下に、男性と同様に女性  ・女性の100の下に女性の合計値  ・数3の横列に1列追加して、年代別合計と男性と女性の総数 以上なのですが、お助けいただけますと幸いです。 よろしくお願い致します。

  • ExcelVBAでの検索結果抽出方法

    ExcelVBAで教えて下さい。 A | B | C | D | E |F| 地域コード| 性別コード|年代|野球|サッカー|テニス| 201| 1 | 40 | 5 | - | 1| 201| 2 | 55 | 6 | 1 | 3| というような表が1万行近くあります。 これを「地域別の表」にして、なおかつ「男女別」「スポーツ別」にして、人数を表にしたいと思っています。 表のイメージはこんな感じです。 ーー| 201 | 野球|サッカー|テニス| 男性| 40 | 5 | - | 1 | … 女性| 55 | 6 | 1 | 3 | 年代は40、45と5才刻みで100歳までで、男女は1と2のコードで表します。 クロスのところにはいっているのは人数です。 Sheet1が元データなので、Sheet2に表を作りたいです。表はどうにか作れるので、 ・地域コード ・性別コード ・スポーツ に、一致した場合に別シートにコピーできるコードを教えていただけるとありがたいです。 Sheet1の元データの年代は、地域によっては、該当なしだと無い年代もあります。 今回は投稿のためわかりやすければ…と思い、空白セルにハイフンを入れましたが実際は入っていません。 ややこしくて申し訳ありませんが助けていただきたく、お願い致します。

  • 同じ様式の表の複数シートから行ごと抽出

    A2:K12の範囲に表がある全く同じ様式のシートが複数あります。 特定の条件が満たされた行を全て別シートに抽出したいです。 1列目と2列目とX列目(これは集計のA1セルに入った値を参照)が空白でない行を全て抽出したいです。1列目と2列目は1行目から順番に埋まっているのですが、X列目は空白になっているものと空白でないものが混在しています。 たとえば、Xが10列目のときは、Aさん、Bさん、Cさん、Dさん、Eさんの行が抽出されるようにしたいです。 VBAのコードを自力で書けないので、よろしくお願いします。

  • 集計表作成のマクロについて

    月末在庫の集計表を作成しています。 月末在庫を抽出すると、次のように表示されます。 ・B列 商品コード ・D列 商品名称 ・E列 デポコード ・F列 デポ名称 ・G列 数量 なお、3桁のデポコードのうち、右がBであれば「出荷止め品(B在庫)」そうであければ「通常品(A在庫)」です。 これらの情報を元に、商品ごと倉庫ごとの「通常品」「出荷止め品」の在庫数量を一覧にしたいと思っています。 ●一覧表作成の流れは次のように考えています。 1.抽出されたデータを「通常品」「出荷止め品」に分ける。(完了) 2.抽出されたデータの「(1)全てのリスト」(完了)「(2)通常品リスト」(×)「(3)出荷止め品リスト」(×)を作成する。 3.新しいシートを作成して、縦軸に(1)の商品コードと商品名称を抽出 4.横軸に(2)のデポコード・名称とその数量を抽出して小計を入れる。 5.「4」の小計欄の右から(3)のデポコード・名称とその数量を抽出して小計を入れる。 6.「4」と「5」の小計を足した「合計」を入れる。 7.倉庫ごとの合計数量を投入する。 8.罫線を設定する。   ⅰ 全体を実線で囲む。   ⅱ 縦線を実線にする。   ⅲ 小計欄の左右は二重線にする。   ⅳ 倉庫ごとの合計欄の上を二重線にする。 ここで問題が発生しています。「2」の(2)と(3)がうまく行きません。 「A在庫」も「B在庫」も抽出されたデータをもとに作成しています。 「デポコード」の右側1文字が「B」であれば「A在庫」の場合は「0」を表示「B在庫」の場合は「デポコード」「数量」など、必要な情報を抽出するようにしています。 「A在庫」「B在庫」のそれぞれの情報が抽出されても、「0」の欄が あると、エラーが出てしまいます。 分けた「A在庫」「B在庫」の「商品コード」「商品名称」「デポコード」「デポ名称」をリストとして表示するにはどうしたらよいのか、教えていただけませんか? また、他に在庫状況を把握するよい案があったら教えていただけると助かります。 ちなみに、現在のVBAは以下のように記入しています。 VBA初心者のため上の流れの「4」と「5」の辺りもよくわかっていません。何か参考になるサイトがあれば、教えていただけると助かります。 なお、現在のVBAも添付したいのですが、2000字を超えてしまうので ここでは載せていません。

  • 複数の表を切り替えて抽出する方法について(Excel)

    エクセルで、複数の表を切り替えて抽出する方法を色々考えてみました。はじめは、Lookup関数を使いましたが、特定の文字に対となるものを抽出するにはIndex関数とMatch関数の組み合わせがいいことが分かりました。しかし、複数の表を切り替えるとなると、やっぱり、If関数の階層化となってしまいます。名前の定義を使って切り替えようかとも思いましたが、途方にくれてしまいました。ユーザー関数の方がいいのかも??って感じで、考えがまとまりません。どなたか?詳しい方、お知恵を拝借できないでしょうか?宜しくお願いします。イメージとしては、 =選択抽出(表の名前,検索列名前,検索文字列,抽出列名前)ってな感じで、表の名前を変更することにより任意の表を選べ、検索列名前、を変更することにより表の中の任意の列を選べる、(抽出も同じ)てな感じで、任意の表の任意の列を検索し、任意の列から抽出するってな、万能なユーザー関数を模索しています。 ヒントだけでもいいので、拝借お願い致します。 (イメージは、エクセルの名前定義を使う方法が正しいものとしての仮定での話です)宜しくお願い致します。

  • ExcelVBA複数条件一致後別シートに結果表示

    初めて質問させていただきます。VBAとマクロを勉強中なのですが、数値だけのcsvデータ(3万行くらい)をマクロで処理するように指示されて困っています。 ●ファイルの内容(概要) <Sheet1> A列:性別(男性:1、女性:2でコード化) B列:死因コード(数値5~6桁) C列:年齢 D列:市町村(3桁でコード化「201」等) <Sheet2> ・「セルA1」に表にしたい市町村コードをあらかじめ入力しておく ・セルB1~セルEC1まで死因コード ・セルA2~セルA132まで年齢0~130 ・セル範囲B2~EC132に市町村1の男性の値が入る ・セルB133~セルEC133まで死因コード ・セルA134~A264まで年齢0~130 ・セル範囲B134~EC264に市町村1の女性の値が入る Sheet2にはあらかじめ表を作成しておき、行と列の値を参照してSheet1で一致する値が、列と行が交わるところの空白セルに入力した市町村コードと一致していることもふるいにかけられ、表で結果としてカウントされるときには男女別に分かれるようにしたいのですが可能でしょうか? ややこしくて申し訳ありません。繰り返しあらかじめ作成された表にカウント結果を入力させる記述はヒントを頂ければ頑張ります。 なので、4つの条件に一致した場合にカウントして別シートに返すにはどうしたらいいのか助けていただけますと幸いです。 それと、シート1の最終行は決まっていません。

  • Excelの複数表の計算方法について

    Excelの関数を利用した計算について、教えてください。 シート1と2に、並び順が違う、以下のような表があります。 社員番号と氏名、売上の列があり、30人程ずつ、横に4つの表が並んでいるような形です。(合計約120人の表) シート3に、シート1と2の各人の売上を合計したものを出したいと考えています。 並び順が違うため、串刺し演算などはできません。 また、並び順を揃えたり、表を縦に繋げることも考えていません。 (他のシートに影響するため) SUMIFをやってみましたが、表が横に並んでいるためか、うまくいきませんでした。 思いついたのは、VLOOKUPでしたが、やはりうまくいきません。 手作業で計算式(例:=あ+い)を入れることはできますが、間違って足しても分からないため、関数を利用したいと思います。 何か方法があれば、と質問いたします。 何卒よろしくお願いします。

  • ExcelVBA表の見出しを付ける方法について

    ExcelVBAで複数の表に、同じ見出し行を入れる方法を教えて下さい。 ExcelのSheet1に数字だけで構成された表があります。それぞれ意味があり、例えば「4列は市町村コード」「5列は性別」「17列は年齢」「20列は疾病コード」という感じです。 VBAで市町村・男女別で、年齢と疾病コードに一致した場合にカウントする場合の表は回答をいただき作成できました。 ですが50以上×男女分の表を作るのに疾病コードを  Range("C3,C136").Value = 14500  Range("D3,D136").Value = 14510 と、していると、入力間違えも発生しかねないですし、きりがなく、他に良い方法があればご教授いただけましたらと思います。 疾病コードの数字は連番ではないためコピーができません。 疾病コードは「132」あります。 よろしくお願い致します。

  • 【エクセル】表から条件にあったデータを別のシートに抽出する関数

    エクセルの表である条件にあてはまる行(複数の列を指定したい)を、 別シートに順番に抽出されるような関数を教えてください。 元の表を編集するので、自動的に反映されるように関数で作成したいと思っています。できれば、抽出後のソートやフィルタオプションは避けたいです。 シート1のコード(A列)が100番台のもの、200番台のもの、300番台のものの、それぞれ食品名(B列)と総量(D列)を、シート2~シート4に別表として抽出したいです。 食材の注文をするのに、業者別にしなければいけませんが、量が多くて毎回大変なんです。お助けください。 【シート1】 元データ    A     B        C       D 1 コード  食品名    一人分分量   総量 2 101    牛肉      30      150 3 201    じゃが芋    80      400 4 202    玉葱      40      200 5 203    人参      20      100 6 301    しょうゆ    6       30 7 302    砂糖      4       20 【シート2】 コード100番台   A     B   1 牛肉   150 【シート3】 コード200番台   A     B       1 じゃが芋 400 2 玉葱   200 3 人参   100 【シート4】 コード300番台   A     B  1 しょうゆ 30 2 砂糖   20 無謀な事をやろうとしているのかもしれませんが、どなたかアドバイスをください。 よろしくお願い致します。

  • ExcelVBAのコピーもしくは集計方法

    ExcelVBAについて質問させて下さい。 いくつもの区分に分かれたデータが以下のように並んでいます。(区分は80程度あります) A   | B | C | D | E | F | G | H | ------------------------------------------- 1 | 行ラベル | 11 | 12 | 13 | 14 | 15 | 21 | 22 | ------------------------------------------- 2 | 123456 | | | | | | | | ------------------------------------------- 3 |(性別:男)1| | | | | | | | ------------------------------------------- 4 | (年代)40 | 1 | 5 | | | | | | ------------------------------------------- 5 | (年代)45 | | | | 2 | | | | ------------------------------------------- 6 | (年代)50 | ------------------------------------------- … 16| (年代)100| 1 | 2 | 3 | 2 | 1 | | | ------------------------------------------- 17|(性別:女)2| ------------------------------------------- 18|(年代)40 | ------------------------------------------- … 30|(年代)100| ------------------------------------------- 31| 234567 | ------------------------------------------- 32|(性別:男)1| ------------------------------------------- 33| (年代)40| … ・「123456」「234567」は区分コードです。 ・( )を含めた文字は、実際の表にはありません。 ・区分ごとに「男」と「女」があり、それぞれ「40」から5才刻みで「100」まで年代があります。 ・行ラベル「11」「12」はあるデータ名を数値化したものです。  (1)区分コード  (2)性別  (3)行ラベル  (4)年代 以上の4つの条件が集約された表です。 ・この表は別にデータがあったのではなく、これを与えられました。マクロなどで加工していません。 ・年代は数値が入っていない場合には、行が無い場合があります。40代は何も数値がないので、45から始まるなど。 この表を使って何をしたいかというと、行ラベルの「12」「13」「14」「15」だけに絞り別シートに抽出し、区分コード別に表を作りたいのです。表を作成するときには、抜けている年代もきちんと入れて。例え値が0でも。 以前、ここでの質問で複数条件で一致した場合の集計方法を教えていただきましたので、A列をコピーして、「区分コード」「性別コード」を次のコードが出てくるまでコピーできれば同じことができると考えました。 ですが、次のコードが出てくるまでのコピーのコードの記述方法、列をコピーするので区分コードの行では、性別コードの部分もコピーして上書きしてしまう方法が分かりませんでした。 一番は、こんなややこしい表の集計方法を教えていただけましたら幸いですが、もしくは、次の値が出てくるまで同じもののコピーの繰り返しと特定の文字は無視して上書きの方法を教えて下さい。 例えばなのですが、「123456」がある列に対して、「1を空白にする」という置換を行ったら「23456」になってしまいますか? 質問が多くて申し訳ございません。