• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:エクセルのマクロ記述方法について教えてください。)

エクセルのマクロ記述方法について教えてください

このQ&Aのポイント
  • エクセルのマクロ記述方法について教えてください。シート1には個人別商品購入状況リストがあります。全データは50000行くらいで、商品は10種類あります。各人の購入商品の種類はまちまちです。
  • 個人別商品購入状況リストをシート2に転記する方法を教えてください。シート2では1行に1名の情報を記録します。氏名が同じである間は商品番号の一致するデータのセルの値を取得して転記し、異なる場合は氏名をA列に入力します。
  • 条件分岐とループを使用して、氏名が同じである間は商品番号の一致するデータを転記する方法を教えてください。エクセルのマクロを作成する上での基本的な考え方です。

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

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

No.1です! 同じ人が同じ商品を別店舗で購入する場合がある場合もあるというコトですので・・・ この場合は表の表示方法を工夫する必要があると思います。 そこで、↓の画像のように同一商品でも購入店舗が異なる場合は 行を追加して表示するようにしてみました。 尚、今回も制約があります。 同一人物で購入店舗は複数出ても構いませんが、 同じ人で商品・店舗が重複していない! すなわち、仮に NNNさんが商品「101」を店舗「大阪」で購入した場合は 同じデータは1行しかない!という前提です。 もう一度コードを載せてみます。 ※ 前半部分は前回と一緒で、後半だけ手を加えてみました。 Sub test2() 'この行から Dim i As Long, j As Long, k As Long 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.ClearContents ws1.Columns("A:D").Copy Destination:=ws3.Cells(1, 4) ws3.Columns(5).Copy ws3.Cells(1, 3) ws3.Activate i = ws3.Cells(Rows.Count, 3).End(xlUp).Row Range(ws3.Cells(2, 1), ws3.Cells(i, 1)).Formula = "=IF(D2="""",A1,D2)" ws3.Columns(1).Copy ws3.Cells(1, 4).Select Selection.PasteSpecial Paste:=xlValues Range(ws3.Cells(2, 2), ws3.Cells(i, 2)).Formula = "=IF(COUNTIF(E$2:E2,E2)=1,E2,"""")" ws3.Columns(2).Copy ws3.Cells(1, 2).Select Selection.PasteSpecial Paste:=xlValues Range(ws3.Cells(2, 1), ws3.Cells(i, 1)).Formula = "=IF(B2="""",2,1)" ws3.Columns(1).Copy ws3.Cells(1, 1).Select Selection.PasteSpecial Paste:=xlValues Range(ws3.Cells(2, 1), ws3.Cells(i, 2)).Sort key1:=ws3.Cells(1, 1), order1:=xlAscending ws3.Columns(2).Sort key1:=ws3.Cells(1, 2), order1:=xlAscending ws2.Cells(1, 1) = "氏名" For k = 1 To ws3.Cells(Rows.Count, 2).End(xlUp).Row If WorksheetFunction.CountIf(ws2.Rows(1), ws3.Cells(k, 2)) = 0 Then With ws2.Cells(1, Columns.Count).End(xlToLeft).Offset(, 1) .Value = ws3.Cells(k, 2) .NumberFormatLocal = """商""""品""0" .Offset(, 1) = "店舗" End With End If Next k ws2.Rows(1).HorizontalAlignment = xlCenter For k = 2 To ws3.Cells(Rows.Count, 4).End(xlUp).Row If WorksheetFunction.CountIf(ws2.Columns(1), ws3.Cells(k, 4)) = 0 Then ws2.Cells(Rows.Count, 1).End(xlUp).Offset(1) = ws3.Cells(k, 4) End If i = WorksheetFunction.Match(ws3.Cells(k, 4), ws2.Columns(1), False) j = WorksheetFunction.Match(ws3.Cells(k, 5), ws2.Rows(1), False) If ws2.Cells(i, j + 1) = "" Or ws2.Cells(i, j + 1) = ws3.Cells(k, 7) Then With ws2.Cells(i, j) .Value = ws2.Cells(i, j) + ws3.Cells(k, 6) .Offset(, 1) = ws3.Cells(k, 7) End With ElseIf ws2.Cells(1, j) = ws3.Cells(k, 3) And ws2.Cells(i, j) <> ws3.Cells(k, 7) Then ws2.Rows(i + 1).Insert ws2.Cells(i + 1, 1) = ws3.Cells(k, 4) With ws2.Cells(i + 1, j) .Value = ws3.Cells(k, 6) .Offset(, 1) = ws3.Cells(k, 7) End With End If Next k ws3.Cells.Clear ws2.Columns.AutoFit Application.ScreenUpdating = True ws2.Activate ws2.Cells(1, 1).Select End Sub 'この行まで ※ 今回もじっくり「我慢の子」でPCの前で待ってみてください。 ※ 詳しく検証していませんので、ご希望通りにならなかったらごめんなさいね。m(_ _)m

silvermoon7
質問者

お礼

さっそく要望におこたえいただき、ありがとうございます! このマクロを動かしてみましたが、うまくいきそうです。さいわい「同一人物で異なる店舗」のデータ数が限られているので、リスト完成後に2行データを検索して合体させればいいですね。 劇的に操作が簡単になりました。 重ねて、ありがとうございました!!

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

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

こんばんは! Sheet1のデータは2行目以降にあるとします。 前提条件として 同一人物が商品を購入する場合、必ず同じ店舗での購入!とします。 (同一人物で複数行に同じ商品があっても構いませんが、必ず同じ店舗での購入) 尚、Sheet3を作業用のSheetとして使用していますので、Sheet3は全く使用していない!とします。 Alt+F11キー → 画面左側の「This Workbook」をダブルクリック → VBE画面に ↓のコードをコピー&ペーストしてマクロを実行してみてください。 (Alt+F8キー → マクロ → マクロ実行です) Sub test() 'この行から Dim i As Long, j As Long, k As Long 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.ClearContents ws1.Columns("A:D").Copy Destination:=ws3.Cells(1, 4) ws3.Columns(5).Copy ws3.Cells(1, 3) ws3.Activate i = ws3.Cells(Rows.Count, 3).End(xlUp).Row Range(ws3.Cells(2, 1), ws3.Cells(i, 1)).Formula = "=IF(D2="""",A1,D2)" ws3.Columns(1).Copy ws3.Cells(1, 4).Select Selection.PasteSpecial Paste:=xlValues Range(ws3.Cells(2, 2), ws3.Cells(i, 2)).Formula = "=IF(COUNTIF(E$2:E2,E2)=1,E2,"""")" ws3.Columns(2).Copy ws3.Cells(1, 2).Select Selection.PasteSpecial Paste:=xlValues Range(ws3.Cells(2, 1), ws3.Cells(i, 1)).Formula = "=IF(B2="""",2,1)" ws3.Columns(1).Copy ws3.Cells(1, 1).Select Selection.PasteSpecial Paste:=xlValues Range(ws3.Cells(2, 1), ws3.Cells(i, 2)).Sort key1:=ws3.Cells(1, 1), order1:=xlAscending ws3.Columns(2).Sort key1:=ws3.Cells(1, 2), order1:=xlAscending ws2.Cells(1, 1) = "氏名" For k = 1 To ws3.Cells(Rows.Count, 2).End(xlUp).Row If WorksheetFunction.CountIf(ws2.Rows(1), ws3.Cells(k, 2)) = 0 Then With ws2.Cells(1, Columns.Count).End(xlToLeft).Offset(, 1) .Value = ws3.Cells(k, 2) .NumberFormatLocal = """商""""品""0" .Offset(, 1) = "店舗" End With End If Next k ws2.Rows(1).HorizontalAlignment = xlCenter For k = 2 To ws3.Cells(Rows.Count, 4).End(xlUp).Row If WorksheetFunction.CountIf(ws2.Columns(1), ws3.Cells(k, 4)) = 0 Then ws2.Cells(Rows.Count, 1).End(xlUp).Offset(1) = ws3.Cells(k, 4) End If i = WorksheetFunction.Match(ws3.Cells(k, 4), ws2.Columns(1), False) j = WorksheetFunction.Match(ws3.Cells(k, 5), ws2.Rows(1), False) With ws2.Cells(i, j) .Value = ws2.Cells(i, j) + ws3.Cells(k, 6) .Offset(, 1) = ws3.Cells(k, 7) End With Next k ws3.Cells.Clear ws2.Columns.AutoFit Application.ScreenUpdating = True ws2.Activate ws2.Cells(1, 1).Select End Sub 'この行まで ※ データが5万行程度あるというコトなので、かなりの時間を要します。 PCの前で腕組みしてじっくり待ってください。m(_ _)m

silvermoon7
質問者

お礼

tomさん、早速ありがとうございます。素晴らしいです!試してみたらちゃんと処理できました!  ただ、前提条件の店舗については、必ずしも常に同じ店舗とは限らないので、その場合は一旦準備として、購入個数と店舗のセルを"&"で繋げて、一つのセルにまとめ、マクロ処理した後で分離する、という作業をやればいいでしょうか?  

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • EXCEL97のマクロ処理について

    EXCEL97のマクロ処理について教えてください。 下記のシート例のようなシート(アクセスのクロス集計のようなもの)を最初に複数範囲指定(アクティブ)します。その後にその範囲指定したなかで項目が1~5まで全て同じモノだけを統一して、種類で存在するものも統一させます。一つ目のものに種類1がなくても同一のものに種類1があれば統一後のデータは種類1の列に"1"がつくようにします。ちなみに種類はその時によりどれだけ存在するかわからないのが前提です。削除するデータは回路Noが大きいものを消すようにします。下がそのデータの例です。 =============== エクセルシート例 =================================== 回路No  項目1 項目2 項目3 項目4 項目5 種類1 種類2 種類3 ... 1      AAA  BBB  CCC   DDD  EEE   1        1 1      FFF  DDD  UUU   DDD  OOO       1    1 1      UUU  PPP  TTT   DDD  EEE   1   1 2      AAA  BBB  CCC   DDD  EEE       1    1 2      XXX  QQQ  SSS   NNN  MMM   1   1                ↓ マクロ処理後 回路No  項目1 項目2 項目3 項目4 項目5 種類1 種類2 種類3 ... 1      AAA  BBB  CCC   DDD  EEE   1   1    1 1      FFF  DDD  UUU   DDD  OOO       1    1 1      UUU  PPP  TTT   DDD  EEE   1   1 2      XXX  QQQ  SSS   NNN  MMM   1   1 ================================================================== シート選択後ボタンによりマクロ処理されるように考えています。どうか宜しくお願い致します。

  • EXCELのマクロについて教えてください。

    初心者です。 「商品コード」と「販売個数」から成る表があるとします。 「販売個数」が10個以上の商品について、当該「商品コード」の内容を別のシートに転記できるようにしたいと思っています。 どのようなマクロを書けばよいか教えてください。 宜しくお願いします。

  • エクセル2007 マクロについて教えてください。

    2種類のファイルがあります。 ファイルA   販売データ ファイルB   商品ごとの詳細表 ファイルAには、商品ID、販売日時、販売個数が入力されています。  商品ID  販売日時   販売個数   ABAB  2010/06/05    10   ABAB  2010/06/07     8  ABAB  2010/06/12     2  CDCD  2010/06/06    15  CDCD  2010/06/09     4  EFEF   2010/06/01    8  GHGH  2010/06/12    14  GHGH  2010/06/15     2 ファイルBは各商品IDごとに1枚のシートに商品情報が記入されています。 シートAの販売日時と販売個数をそれぞれのシートにマクロで転記させていきたいと思ってます。 「商品IDが変わったら、次のシートへ移動」という命令文を教えてください。 お願いします。

  • エクセルでのマクロを教えて

    下記のようなものをみたすマクロは組めますか? ファイルにシートが何種類かあります。 sheet1には各店の集計データーがあります。 その中にA列には集計の項目名がAZ列まであり 1行目には店舗名が10種類あります。 sheet2からはsheet名をsheet1に記入されている1行目にしている店舗名にしてあります。 またA列には集計の項目名がありますが sheet1にある項目と全く同じではなく 項目は少なくなっています。 また、sheet2からの店舗名にはsheet1の集計表にはない 店舗名もあります。 このsheet1のデーターをもとに sheet2の1行目の項目と一致する項目の値や数字を sheet1からコピーするというものです。 よろしくお願いします。

  • エクセルで集計

    エクセルで集計 シート1に1つの列に各支店名、2つ目の列に各商品名、3つ目の列に商品個数がランダム入力されているデータをシート2に自動で整理し集計したいのですが、2つの列の集計は関数SUMIFできるのですが、例えば、「各支店の商品個数の集計」など、「各支店の各商品の個数の集計」などの3つの列の集計方法を分かる方、いましたら教えてください。宜しくお願いします。

  • エクセルのマクロでどうすればいいか悩んでいます

    エクセルのマクロでどうすればいいか悩んでいます  毎月月初めに年間のデータシートから前月の競馬の成績をまとめて別のファイルに転記していこうと思っています 問題は1月分のデータをどうやって判断ささせるかで いま考えてるのは 月初めと月終わりに印の代わりとなる物例えば◯とかを入力しておいて その範囲だけ転記しようと思っているのですが a~j;列までデータがあるので range(a10000) Selection.End(xlUp).Select でデータの最終行を求めるところまではできてますが そこからk列を選択する構文はどう書けばいいかわからなくて困っています わかりにくくすいませんがお願いします

  • 急!!Excel VBA 転記マクロを教えて下さい

    Excel VBA超初心者です、 急ぎ作らなければならない資料があり、ご助力願います。 次の様な転記するアクションをコマンドボタンに設定したいです。 Sheet1の列A(先頭セルA2)に入力したデータを、 追加した(入力間違い等を除き、保存した)データ分だけ Sheet2の列B(先頭セルB3)の最終行から転記させていく。 列Aに入力したデータは、並び替えをするので (この分は、今回のVBAに含みません。入力・転記後、Sheet1で普通に並び替えをします。) 列Aと列Bのデータの順番が異なる。 以上です。 どうぞ宜しくお願いします。

  • 複数のシート上にある同一のテーブルから今日の売上を集計したい

    こんにちは。 複数の店舗を抱えており、店舗ごとにシート一枚で様々なデータをまとめてます。 A1~G1まで、No.、販売日、商品コード、商品名、定価、販売個数、販売価格となっているときに、それぞれの店舗で今日売り上げたデータを同じテーブル形式(No.、販売日、商品コード、商品名、定価、販売個数、販売価格)で別シートに転記するには何か方法がありますか?並ぶ順番とかはどうでもよく、単に今日の売上品目と販売個数&金額がわかればいいのですが。

  • エクセルやスプレッドシートの式

    エクセルやスプレッドシートの式について教えてください。 シート1にデータを入力していて、 シート2に「シート1のC列のデータを転記」 シート3に「シート1のD列のデータを転記」 シート4に「シート1のE列のデータを転記」 シート5に「シート1のF列のデータを転記」というように、 シートごとに呼び出す列を1列ずつずらしたデータを作りたいと考えています。 シート2については、手入力で作り終えたのですが、 シート3以降は「シート2をコピーして、その数式の中のCの部分を自動でDに書き換える」ようにすることは可能でしょうか? それともひとつひとつ、CをDに書き換えなくてはならないでしょうか? シートごとでもかまいませんので、一括で指定できる方法があれば教えてください。 よろしくお願いいたします。

  • エクセル マクロ VBA

    エクセルのマクロについて質問です。 『集計』というブックの『集計開始』というシートに     A列    B列     C列 1行目 見出し  見出し   見出し      (商品名)  (支店)  (個数)         2行目 コメント  空白     空白   3行目 空白   空白     空白 4行目 商品名  支店     個数  5行目 空白   空白     空白 6行目 空白   空白   コメント1 7行目 空白   空白     空白 8行目 空白   空白   コメント2 9行目以降    上記のデータ(見出しを除く)の繰り返し というデータが入っています。 B列の中に『AAA』という文字が含まれていたら、そのセルを空白に置換し、 含まれていなかったら、そこで処理がとまったりエラーが出たりしないで次のステッップへ進み、 C列の中に『B』という文字が含まれていたら、そのセルを空白に置換し、 含まれていなかったら、そこで処理がとまったりエラーが出たりしないで次のステッップへ進み、 (今は、手作業で編集→置換→検索する文字列の中に『B*』と入力し、 置換後の文字列を空白にしてすべて置換ということをやっています。)                            ABC列(データーの入っている行まで)の空白を含む行を一括削除し、 以下のような形にしたいのです。     A列    B列     C列 1行目 見出し  見出し   見出し      (商品名)  (支店)  (個数)         2行目 商品名  支店     個数  3行目 商品名  支店     個数          ・         ・ このようにするマクロ文はどのようになりますでしょうか?

専門家に質問してみよう