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

このQ&Aのポイント
  • ExcelVBAを使用して、指定のルールに基づいて行を追加する方法について教えてください。
  • ある表において、特定の条件を満たさない行を取得し、追加するExcelVBAのコードを作成したいです。
  • ExcelVBAを使って、表の欠損データを補完する方法について教えてください。
回答を見る
  • ベストアンサー

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列追加して、年代別合計と男性と女性の総数 以上なのですが、お助けいただけますと幸いです。 よろしくお願い致します。

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

  • ベストアンサー
  • watabe007
  • ベストアンサー率62% (476/760)
回答No.1

1行目は項目名(性別、年代、数、数2、数3) データは2行目からとしています。 参考に Sub Test()   Dim myDic As Object   Dim LastRow As Long   Dim Str As Variant   Dim i As Long, j As Long   Set myDic = CreateObject("Scripting.Dictionary")   LastRow = Cells(Rows.Count, "A").End(xlUp).Row   For i = 2 To LastRow     Str = Cells(i, "A").Value & ";" & Cells(i, "B").Value     myDic(Str) = Empty   Next   For i = 1 To 2     For j = 40 To 100 Step 5       Str = i & ";" & j       If Not myDic.Exists(Str) Then         LastRow = LastRow + 1         Cells(LastRow, "A").Value = i         Cells(LastRow, "B").Value = j         Cells(LastRow, "C").Resize(, 3).Value = 0       End If     Next   Next   Range("F2:F" & LastRow + 2).FormulaR1C1 = "=SUM(RC[-3]:RC[-1])"   With Cells(LastRow + 1, "A")     .Value = 1     .Offset(, 1).Value = "男性計"     .Offset(, 2).Resize(, 4).FormulaR1C1 = "=SUM(R[-13]C:R[-1]C)"   End With   With Cells(LastRow + 2, "A")     .Value = 2     .Offset(, 1).Value = "女性計"     .Offset(, 2).Resize(, 4).FormulaR1C1 = "=SUM(R[-13]C:R[-1]C)"   End With   Range("A2:F" & LastRow + 2).Sort _   Key1:=Range("A2"), Order1:=xlAscending, _   Key2:=Range("B2"), Order2:=xlAscending, _   Header:=xlNo   Set myDic = Nothing End Sub

minminwamidori
質問者

お礼

遅くなりまして申し訳ありませんでした。ありがとうございました。

関連するQ&A

  • 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 | こんな表にしたいです。 縦横のそれぞれの合計が出せると素敵です。 お知恵を拝借したく、何卒、よろしくお願い致します。

  • 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の元データの年代は、地域によっては、該当なしだと無い年代もあります。 今回は投稿のためわかりやすければ…と思い、空白セルにハイフンを入れましたが実際は入っていません。 ややこしくて申し訳ありませんが助けていただきたく、お願い致します。

  • 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」になってしまいますか? 質問が多くて申し訳ございません。

  • ExcelVBA 表に空白があれば行単位で詰めたい

    初心者です。 ExcelVBA2007で、A3:G15の表があります。(さらに実際は横にも同じようにI3:O3にもさらに下にも同じような表がいくつかあります) この表は、行ごとに1セットになっています。(例えばA3に分類、B3に商品名・・・G3に数のように) この表の所々に空欄があるのですが、一つの表の中の行がすべて空欄であれば上に詰めていきたいと思っていますがうまくいきません。後、D列には数式が入っているのですが処理がかわってくるのでしょうか?(今後数式を入れない方向に変えようかとも思っています) どうすればよいでしょうか? もしよかったら、同じ表に対する繰り返し処理のスマートな表記があれば教えていただければありがたいです。 申し訳ございませんが、ご教授よろしくお願いいたします。

  • Excelvbaの構文

    はじめまして最近Excelvbaを勉強し始めた初心者です。 早速質問なんですが例えば↓ 東京 150 200 大阪 230 100 大阪 100  50 大阪 100 300 福岡 250 300 沖縄 500 100 こんな表があるとします。 大阪のように同じ名前が連続した時に↓ 東京 150 200 大阪 230 100 大阪 100  50 大阪 100 300 小計 430 450 福岡 250 300 沖縄 500 100 このように大阪の下に小計欄を作成して 合計を求めたいのですが、 連続する可能性のある言葉は把握しています(複数あり) Excelvbaで出来ますか? 僕なりに考えてみたんですが無理でした・・・ どなたか詳しい方、知恵を貸して下さい。 お願いいたします。

  • ExcelVBAを使って、行の削除と削除した行の分だけ残りの行を上につめるプログラムを作りたいのですが...

    ExcelVBAを使って、行の削除と削除した行の分だけ残りの行を上につめるプログラムを作りたいのですが... 例えば、 A 1 ○ ------- B 2 ○ ------- C 3 × ------- D 4 ○ ------- E 5 × ------- F 6 × という表があったとして、コマンドボタンをクリックすると×がついている行を削除して、 A 1 ○ ------- B 2 ○ ------- D 4 ○ という風に×のあった行をつめるようなプログラムを組みたいです。 私が作ったのはループをまわす中で×を見つけるとその、下の行のセルを各々ひとつ上に上げていくというプログラムです。これだとひとつのセルごとに処理していくのでデータが多いとボタンを押してから処理が終わるまでに時間がかかってしまいます。 行をまとめて消して、その下の行を上に持ち上げる方法だと処理が早くなりそうなのですがそのプログラムがイマイチわかりません。 お分かりになるかたがいらっしゃれば、ご教授お願いします。  

  • 【Excel】年齢・人数・性別を年代・性別毎に集計したい

    業務上にて集計していたのですが、自分の知っている範囲で処理できず困っています。 まず以下のテーブルが前提にあります。 *********************************** 年齢    人数    性別コード 18     2      0 22     3      0 22     2      1 35     2      0 *********************************** ※性別コード 0が男性 1が女性です。 これを以下の表にまとめたいと思っています。 *****************************    10代 20代 30代・・・ 男性  2  3   2 女性  0  2   0 ***************************** SUMPRODUCT関数でやってみたのですが、年齢別に人数が数える方法が分かりませんでした。よろしくご指導願います。

  • Excelvba表に空白行があれば上に詰める重い

    いつもお世話になっております。 列がD列からK列で、行が4行目から23行までの表があります。 その表で1行まるまる空白の時(4行目にには数式が入っていますがそれは除く) 上の行に詰めるようにしてあります。行はそのまま空白のまま残して、値のみ上に詰めるようにしています。 このような表が同じ列に4か所×3=12か所あるので、今はそれぞれ下のコードの行、列を変更して処理しています。 上の表と下のの表の間隔は、上が4~23行までで、下は30~49、と6行間隔です。結合セルも間にあるため5行空きがあります。 列と列の間隔は、左側から、D列~K列、続いて、N列~U列と続きます。2列空きがあります。 家で試した時は一応問題なく動いたのですが、 会社でした時フリーズしてしまい、うまくいきませんでした。 その後、家でしてもなぜかうまく動作しなくなりました。 12の表は多いのかと思い、1つで試してもだめになりました。 同じような作りの別のファイルは動いています。 念のため、新しいファイルにコピーし直してやりましたが、駄目でした。 コードもあまり良くないのかもしれません。 一応家ではVISTAの2007で試し、会社は7(32ビット)の2013です。 もう少し負担が少なくなるようなやり方があればと思っています。 もう少し、いいやり方があればお手数ですが、ご教授ください。 よろしくお願いいたします。 Sub 表の空白行は上に詰める() Dim i As Integer, x As Integer, y As Integer, CSUM As Integer Dim flag As Boolean Application.ScreenUpdating = False flag = 0 '1回だけの処理で使うフラグ For x = 22 To 4 Step -1 '23行→4行まで処理をします。 CSUM = 0 '列の文字数を数える変数CSUMを用意し、初期値0とします。 For y = 4 To 11 'D列→K列まで処理をします。 CSUM = CSUM + Len(Cells(x, y)) 'CSUMにセル(x,y)の文字数を足します。 Next '列処理繰り返し If CSUM = 0 Then Range(Cells(x + 1, 4), Cells(23, 11)).Copy '空白行の1行下から23行目までをコピー Cells(x, 4).PasteSpecial '空白行の1列目のセルを基点として貼り付け If flag = 0 Then '23行目の値クリア処理 1回だけの処理 Cells(23, 5) = 1 '23行目がすっからかんのときエラーになるので、暫定入力 Range(Cells(23, 4), Cells(23, 11)).SpecialCells(xlCellTypeConstants).ClearContents End If '1回だけの処理 ここまで flag = 1 '1回だけの処理させないためフラグ値変更 End If Application.CutCopyMode = False Next '行処理繰り返し End Sub

  • Excel 性別毎の年代別件数の求め方

    Excelで、性別毎の年代別件数を求めたいのですが、良い方法が見つかりません。 皆様のお力をお貸し下さい。 業務で、お客様の統計を採るよう命じられました。 A列に性別(女性or男性)、B列に年齢(18~99)が入力されています。 性別はCOUNTIF関数を使い、女性と男性の件数を出しました。 年齢はFREQUENCY関数を使い、年代(10代~90代)別に件数を出しました。 今度は、性別毎に年代別件数を求めるよう指示されたのですが 一日考えても良い方法が見つかりません。 どのようにすれば、性別毎の年代別件数を求めることが出来るのでしょうか? 利用月毎に複数のファイルに分かれており、集計用のファイルを作成し 全てのファイルの合計を集計するよう指示されています。 (利用月毎のファイルは12ヶ月分あります・・・) Sheet1に性別と年齢を入力し、Sheet2でCOUNTIF関数、FREQUENCY関数を組み集計しています。 良いお知恵がありましたら、どうぞ御教授下さい。

  • エクセルで。ある言葉(文字列)のあるセルの数を合計して表示する関数

    …はあるでしょうか。例えば、名簿をエクセルで作っていて、性別 男、女 という風になっていて、男性の合計、女性の合計を表示するみたいな表です。わかりにくい説明ですみません。

専門家に質問してみよう