• ベストアンサー

Excelでの帳票作成

Excelで以下のようなシートがあります。 --------------------------- A列  B列 C列 D列 1 Name1 11111 2222 3333 2 Name1 44444 5555 6666 3 Name1 77777 8888 9999 4 Name2 aaaaa bbbb cccc 5 Name2 ddddd eeee ffff 6 Name3 ggggg hhhh iiii --------------------------- これを元に以下のようなシートを別々に作成したいです。 <シート1> Name1 11111 3333 Name1 44444 6666 Name1 77777 9999 <シート2> Name2 aaaaa cccc Name2 ddddd ffff <シート3> Name3 ggggg iiii つまり、元のシートのA列の内容(Name1,Name2,Name3)毎にシートを 作成し、A列、B列、C列をコピーしたいです。 上記のシート作成をマクロで自動化したいのですが、どのように行えばよいでしょうか? (VBAでも可) 以上、よろしくお願いします。

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.6

こんにちは。Wendy02です。 何度か、同じものは作っていたのですが、今回は、最初からアドイン変更可能なマクロを作ってみました。つまり、アクティブブックですから、必ずしも、マクロは、同じブックになくても可能です。新規ブックにデータを写して、実行しても可能です。 ただし、今の段階では、一番左端のシート(一般的には、Sheet1ですが、名前は関係がありません)のA1 からデータがあることになっています。ですから、もしも、そうでない場合は、「Set rng = sh1.Range("A1").CurrentRegion 」の部分を、「Set rng = ActiveCell.CurrentRegion 」としてください。また、項目行はあることを条件として作られています。 なお、追加がある場合は、そのまま実行してしまってください。最初からやり直して、上書きされます。 注意:データはSheet2(左端から2番目のシート) から入れてしまっていますから、もしも、データがある場合は、上書きされてしまいます。 Sub SplitData2Sheets() 'アドイン変更可  Dim sh1 As Worksheet  Dim rng As Range  Dim Acwb As Workbook 'アクティブブック対象    Dim i As Integer  Dim j As Integer    On Error GoTo EndLine  Set Acwb = ActiveWorkbook    Set sh1 = Acwb.Worksheets(1) 'ソースになるシート  sh1.Activate '通常は不要ですが、ActiveCell とした場合に必要になる  Set rng = sh1.Range("A1").CurrentRegion 'データの左上端  If rng.Rows.Count < 2 Then    MsgBox "データが不足しているか、データの場所が違うかもしれません。", vbInformation    GoTo EndLine  End If  If sh1.AutoFilterMode = True Then   sh1.AutoFilterMode = False  End If  Application.ScreenUpdating = False  With rng   'ユニークデータの抽出   rng.Columns(1).AdvancedFilter _       Action:=xlFilterCopy, _       CopyToRange:=Range("IV1"), _       Unique:=True      'ユニークデータ数(項目行を含める=シートの数+1)   j = sh1.Range("IV1", sh1.Range("IV65536").End(xlUp)).Count   If j > Acwb.Worksheets.Count Then    Acwb.Worksheets.Add After:=Acwb.Worksheets(Acwb.Worksheets.Count), Count:=(j - Acwb.Worksheets.Count)   End If   '項目行があるので、2行目   'シート2 から-もしも、他のシートからの場合は、上記のj に数を足す   For i = 2 To j    .AutoFilter    .AutoFilter Field:=1, Criteria1:=CStr(sh1.Cells(i, 256).Value)    If .SpecialCells(xlCellTypeVisible).Count > 1 Then     .Rows(1).Copy Acwb.Worksheets(i).Range("A1")     .Offset(1).Resize(.Count - 1).Copy Acwb.Worksheets(i).Range("A2")     Acwb.Worksheets(i).Name = CStr(sh1.Cells(i, 256).Value)    End If   Next i  End With  Application.ScreenUpdating = True EndLine:  If Err.Number > 0 Then    MsgBox Err.Number & " : " & Err.Description  End If  With sh1   .AutoFilterMode = False   .Range("IV1", sh1.Range("IV65536").End(xlUp)).Clear   .Select  End With  Set rng = Nothing  Set sh1 = Nothing  Set Acwb = Nothing   End Sub

gatyapin23
質問者

お礼

ご回答ありがとうございます。 こちらも試させて頂いたのですが、希望通りに動きました! フィルターを使って、このようなことができるとは知りませんでした。 このマクロだと、A列の値が万一バラバラに入っていても大丈夫ですね。 本当に助かりました。ありがとうございます。

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

その他の回答 (5)

  • ham_kamo
  • ベストアンサー率55% (659/1197)
回答No.5

No.3です。 1行目からデータが入力されると処理がちょっとややこしくなり、そのつもりでマクロを書いたのですが、1行目はタイトル行なのですね? それを踏まえて、マクロを修正しました。2行目からデータを走査し、シートを追加したときに新しいシートの1行目に元データのシートと同じタイトルをつけるようにしました。 作成するシートにタイトル行が不要であれば、下のマクロの「'2行目から転記」とコメントがある行を rownum = 1 と修正して、それ以下3行を削除してください。 Sub 帳票作成()   Dim S As Worksheet   Dim CS As Worksheet   Dim rownum As Integer   Dim r As Range   Set S = Worksheets("Sheet1")   For Each r In S.Range("A2", S.Range("A65535").End(xlUp))     If r.Value <> r.Offset(-1, 0).Value Then       Set CS = Worksheets.Add(After:=Worksheets(Worksheets.Count))       CS.Name = r.Value       rownum = 2 '2行目から転記       CS.Range("A1") = S.Range("A1") 'タイトル行コピー       CS.Range("B1") = S.Range("B1") 'タイトル行コピー       CS.Range("C1") = S.Range("D1") 'タイトル行コピー     End If     CS.Cells(rownum, 1) = r.Value     CS.Cells(rownum, 2) = r.Offset(0, 1).Value     CS.Cells(rownum, 3) = r.Offset(0, 3).Value     rownum = rownum + 1   Next End Sub

gatyapin23
質問者

お礼

わざわざ修正していただき、ありがとうございました。 試してみましたが、希望通りの動きでした。 本当に助かりました。ありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

こんにちは。 探せば、そっくり同じようなコードは出てくるような気がします。 こういう処理は、考え方はいろいろあっても、マクロ(VBA)に限るかと思います。AutoFilter を使用して、コピーしていきます。 ただ、いくつか問題があります。 以下のように1行目から使われてしまうと、マクロですと、難しくなります。仮にでもよいので、項目行が必要です。 --------------------------- A列  B列 C列 D列 1 Name1 11111 2222 3333  ←ここに項目行(フィールド)がありません。 2 Name1 44444 5555 6666 3 Name1 77777 8888 9999 4 Name2 aaaaa bbbb cccc 5 Name2 ddddd eeee ffff 6 Name3 ggggg hhhh iiii --------------------------- また、追加処理をするのかどうか、という問題もありますね。 <シート1> ←シート1ということはないと思います。 Name1 11111 3333 Name1 44444 6666 Name1 77777 9999 *** ←ここに追加が加わるかどうか。 シート1は、ソース(元のデータ)用に使います。 ソースに、データを追加していって、それを振り分ける必要があるのか、ということです。また、追加の場合は、データの重複を許すのか、ということもありますね。 >元のシートのA列の内容(Name1,Name2,Name3)毎にシートを作成し、 とありますが、100も200も作るというわけには行きません。私自身の経験では、データ量にもよりますが、一般的な使用範囲としては、40枚前後が限界ではないか、と思っています。 マクロを専門に書く側では、もう少し情報がないと、思ったようにはいかないと思います。

gatyapin23
質問者

補足

ご回答ありがとうございます。 情報が不足していて申し訳ありませんでした。 >以下のように1行目から使われてしまうと、マクロですと、難しくなります。仮にでもよいので、項目行が必要です。 実際のシートには1行目に項目名があります。 ><シート1> ←シート1ということはないと思います。 済みません。ご指摘の通りシート名はA列の内容(Name1など)にしたいです。 >ソースに、データを追加していって、それを振り分ける必要があるのか、ということです。また、追加の場合は、データの重複を許すのか、ということもありますね。 基本的にソースに追加することありません。ある時点で凍結したソースを元に質問内容のシートを追加していきたいと考えています。 データについては重複を許しています。 >私自身の経験では、データ量にもよりますが、一般的な使用範囲としては、40枚前後が限界ではないか、と思っています。 最大で20個くらいですので、なんとかなる範囲なのですね。 上記を踏まえ、AutoFilterを使用しての実現方法をお教えいただけたらと思います。 よろしくお願い致します。

全文を見る
すると、全ての回答が全文表示されます。
  • ham_kamo
  • ベストアンサー率55% (659/1197)
回答No.3

こんな感じでしょうか。 マクロの中の"Sheet1"という部分は、実際に元となるシートの名前に置きかえてください。 Sub 帳票作成()   Dim S As Worksheet   Dim CS As Worksheet   Dim rownum As Integer   Dim r As Range   Set S = Worksheets("Sheet1")   For Each r In S.Range("A1", S.Range("A65535").End(xlUp))     If r.Row = 1 Then       Set CS = Worksheets.Add(After:=Worksheets(Worksheets.Count))       CS.Name = r.Value       rownum = 1     ElseIf r.Value <> r.Offset(-1, 0).Value Then       Set CS = Worksheets.Add(After:=Worksheets(Worksheets.Count))       CS.Name = r.Value       rownum = 1     End If     CS.Cells(rownum, 1) = r.Value     CS.Cells(rownum, 2) = r.Offset(0, 1).Value     CS.Cells(rownum, 3) = r.Offset(0, 3).Value     rownum = rownum + 1   Next End Sub

gatyapin23
質問者

補足

ご回答ありがとうございます。 行とその上の行を比較して、差異があれば新たにシートを作るのですね! 大変勉強になりました。 これから、別件で席をはずすので、戻ってから試してみたいと思います。 結果はそのときご報告させて頂きます。

全文を見る
すると、全ての回答が全文表示されます。
  • Cupper
  • ベストアンサー率32% (2123/6444)
回答No.2

マクロを使う必要はあるのでしょうか 元のシートは1つだけで、それを簡単に振り分けたいのであればマクロを作成するまでもなく、オートフィルタで十分です。 また、同じような元シートがたくさんある、振り分ける項目が多数あるなど、その振分けに困っているのであれば手順を記録する自動記録マクロで十分事足りると思います。 ●以下手順 オートフィルタを設定 A列で表示する項目を選択 [ツール]→[マクロ]→[新しいマクロの記録]  A列からC列を選択  [編集]→[ジャンプ]→[セル選択]→「可視セル」のラジオボタンをクリック→[OK]  [編集]→[コピー] [ツール]→[マクロ]→[記録終了] 貼り付けたいシートを選択 [編集]→[貼り付け] あとはA列のオートフィルタで表示する項目を選択した後に、 記録したマクロを実行して 貼り付けたいシートを選んで貼り付けを行うだけです。 元のシートが1つだけの場合はマクロの記録を行わなければOK。 完全自動化させたいのであれば、記録されたマクロを見ながら修正を行えば可能です。

gatyapin23
質問者

補足

ご回答ありがとうございます。 実は元ファイルがかなり多くあり、またA列の内容も(フィルタをかける数)も多くひとつひとつ手作業ですることは難しい状況です。 仕様的には、別のあるファイルに作業するファイルのリストを作成、ボタンクリックでそのリストファイルすべてに対して質問内容を実行したいと考えています。 ファイルリストからファイルオープンさせたりすることは簡単なのですが、ファイルを開いた後、質問内容のように「自動的にA列の内容毎に、シートを作成する方法」がわかりません。 A列の内容(Name1など)もシートによって違うので、"Name1"など内容を指定しての抽出もできません。 なお、A列はその内容毎に上からまとまっていいます。 (Name1の行が連続してあり、Name2の後でまたName1が現れることはない) 初心者で徐々にステップアップしていくことが一番だとは承知しておりますが、月曜日にはある程度目処を立てないといけない状況ですので、アドバイスの方、よろしくお願い致します。

全文を見る
すると、全ての回答が全文表示されます。
  • popesyu
  • ベストアンサー率36% (1782/4883)
回答No.1

オートフィルタを有効にして、D列を非表示にしてしまえば、わざわざマクロに頼らなくても実現可能だと思いますが。 マクロだとワンクリックですみますが、オートフィルタならスリークリックかかるというぐらいの差しかないです。 どうしても別シートにする必要があるのなら、その作業をマクロの自動記録で保存して、そのまま実行するだけでも出来ますし。 具体的にコードのどういう部分が分からないというレベルでも無さそうですし、初心者さんであればあるほど、いきなりサンプルコードを提示してもらうのではなく、今現在の知識で出来るところからコツコツとやるべきかと。

gatyapin23
質問者

補足

ご回答ありがとうございます。 実は元ファイルがかなり多くあり、またA列の内容も(フィルタをかける数)も多くひとつひとつ手作業ですることは難しい状況です。 仕様的には、別のあるファイルに作業するファイルのリストを作成、ボタンクリックでそのリストファイルすべてに対して質問内容を実行したいと考えています。 ファイルリストからファイルオープンさせたりすることは簡単なのですが、ファイルを開いた後、質問内容のように「自動的にA列の内容毎に、シートを作成する方法」がわかりません。 A列の内容(Name1など)もシートによって違うので、"Name1"など内容を指定しての抽出もできません。 なお、A列はその内容毎に上からまとまっていいます。 (Name1の行が連続してあり、Name2の後でまたName1が現れることはない) 初心者で徐々にステップアップしていくことが一番だとは承知しておりますが、月曜日にはある程度目処を立てないといけない状況ですので、アドバイスの方、よろしくお願い致します。

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

関連するQ&A

  • Excelでの値の比較

    エクセルにおいて、sheet2のA列とB列をsheet1のA列とB列を比較して、一致した場合sheet2のD列に下記のような結果を示すようにしたいのですが、どうやってD列に関数を組めばよいのか分からないので教えてください! 【sheet1】 A列 B列 C列 1行 001 AAAA 部品1 2行 002 BBBB 部品2 3行 003 CCCC 部品3 4行 004 DDDD 部品4 5行 005 EEEE 部品5 6行 006 FFFF 部品6 7行 007 GGGG 部品7 【sheet2】 A列 B列 C列 D列←この列に関数で○か×をつける 1行 001 AAAA 部品1 ○←sheet1にあるので○ 2行 008 HHHH 部品8 ×←sheet1にないので× 3行 004 DDDD 部品4 ○ 4行 009 IIII 部品9 × 5行 005 EEEE 部品5 ○ 6行 002 BBBB 部品2 ○ 7行 010 HHHH 部品10 ×

  • Excelで

    2002/1/2 鈴木 AAAA 2002/1/5 佐藤 BBBB 2002/1/12 井本 CCCC 2002/1/20 田中 DDDD 2003/3/3 佐藤 EEEE 2003/3/12 井本 FFFF 2003/3/15 鈴木 GGGG 2003/4/2 田中 HHHH 2004/2/6 井本 IIII 2004/5/12 佐藤 JJJJ といったデータから 鈴木 2003/3/15 GGGG 佐藤 2004/5/12 JJJJ 井本 2004/2/6 IIII 田中 2003/4/2 HHHH のように、その人の最も最近のデータだけを 表示したいのですが、どなたか教えてください。 宜しくお願いします。

  • Excelデータ比較

    エクセルにおいて、sheet2のA列、B列、C列をsheet1のA列、B列、C列と比較して、一致した場合sheet2のD列に書かれている納入先企業名を下記のように自動入力したいのですが、どうやってsheet2のD列に関数を組めばよいのか分からないので教えてください! 【sheet1】 A列 B列 C列 D列 1行 001 AAAA 部品1 A社 2行 002 BBBB 部品2 B社 3行 003 CCCC 部品3 C社 4行 004 DDDD 部品4 D社 5行 005 EEEE 部品5 E社 6行 006 FFFF 部品6 F社 7行 007 GGGG 部品7 G社 【sheet2】 A列 B列 C列 D列←この列に取引先企業が入るようにする 1行 001 AAAA 部品1 A社←sheet1にあるのでA社と入る 2行 008 HHHH 部品8 #N/A←sheet1にないので#N/Aとなる 3行 004 DDDD 部品4 D社 4行 009 IIII 部品9 #N/A 5行 005 EEEE 部品5 E社 6行 002 BBBB 部品2 B社 7行 010 HHHH 部品10 #N/A

  • CREATE VIEWについて

    2つのテーブル(basecodeとaddcode)からVIEWを作りたいのですが、 そのVIEWについてご教授いただきたく。 <TABLE名:basecode> ---------------------- no name area code ---------------------- 1 aaaa 2 102 2 bbbb 4 103 3 cccc 4 203 4 gggg 3 303 5 eeee 3 101 6 ffff 5 104 7 hhhh 1 115 ---------------------- <TABLE名:addcode> ----------------------------------------- base anum bnum cnum dnum dmy no ----------------------------------------- bbbb 1 1 1 1 aaa 2 cccc 12 13 10 2 aaa 3 cccc 12 13 10 0 aaa 3 cccc 12 13 10 5 aaa 3 dddd 12 15 3 1 aaa 3 dddd 12 15 3 3 aaa 3 dddd 12 15 3 4 aaa 3 eeee 10 3 12 1 aaa 5 eeee 10 3 12 2 aaa 5 eeee 10 3 12 3 aaa 5 eeee 10 3 12 4 aaa 5 eeee 13 12 15 3 aaa 5 eeee 13 12 15 0 aaa 5 eeee 13 12 15 1 aaa 5 eeee 13 12 15 2 aaa 5 hhhh 4 3 11 0 aaa 7 hhhh 4 3 11 2 aaa 7 hhhh 4 3 13 2 aaa 7 kkkk 0 0 0 0 aaa 9 ----------------------------------------- VIEWの抽出は以下の通り。  basecodeのno  basecodeのname  basecodeのcode  addcodeのbase  addcodeのanum  addcodeのbnum  addcodeのcnum  addcodeのdnum VIEWの作成条件としては以下の通り。 <条件> TABLE名:basecodeとaddcodeのnoが存在し、かつ、 baseaddのnoが複数あり、baseが同じものは以下で判断  ・anumとbnumとcnumが同一であればその中のdnumが最小であるレコードを抽出  ・anumとbnumとcnumが異なれば別々に抽出 上記より、以下のように抽出したい。 <TABLE名:basecodeview> ----------------------------------------------- no name code base anum bnum cnum dnum ----------------------------------------------- 2 bbbb 103 bbbb 1 1 1 1 3 cccc 203 cccc 12 13 10 0 3 cccc 203 dddd 12 15 3 1 5 eeee 101 eeee 10 3 12 1 5 eeee 101 eeee 13 12 15 0 7 hhhh 115 hhhh 4 3 11 0 7 hhhh 115 hhhh 4 3 13 2 ----------------------------------------------- よろしくお願いします。

  • エクセルで教えて下さい。

    エクセルで教えて下さい。 オートフィルタ、ピボットテーブル以外で関数などで教えて下さい。 A列に大量の文字列があり重複したりしてます。 そこで、 B列にはA列にある大量の文字列を重複なしで表示させたいと思ってます。 例えば A列 B列 AAAA AAAA BBBB BBBB AAAA CCCC CCCC DDDD DDDD EEEE DDDD FFFF EEEE FFFF EEEE AAAA みたいな感じです。A列は編集可能でQQQQを追加すれば自動でB列にも表示させたいです。 このようなことを簡単にできますでしょうか? 宜しくお願いします。

  • htmlで以下のような番号を振ることはできるのでしょうか?

    htmlで以下のような番号を振ることはできるのでしょうか? Wordのアウトラインのような番号を振りたいのです。 ネットで検索したのですが、なかなか解決策が見つからなかったので、どなたかご存知の方がいらっしゃいましたら教えていただきたいと思います。よろしくお願いいたします。 <作成したい番号> 1.AAAAA 1.1 aaaa 1.2 bbbb 1.3 cccc 2.BBBBB 2.1 dddd 2.2 eeee 3.CCCCC 3.1 ffff 3.2 gggg 3.3 hhhh <現状のタグ> <ol> <li>AAAAA <ol><li>aaaa</li><li>bbbb</li><li>cccc</li></ol> </li> <li>BBBBB <ol><li>dddd</li><li>eeee</li></ol> </li> <li>CCCCC <ol><li>ffff</li><li>gggg</li><li>hhhh</li></ol> </li> </ol>

    • ベストアンサー
    • HTML
  • VBScript(vbs)での行の取得について

    あるテキストの中に空行をはさんで文字列がある時に"ABCD"の文字列を含む場合はABCDを含むひとまとまりだけを取得したいのですがその方法について教えてください。 [テキスト] AAAA BBBB CCCC DDDD EEEE ABCD FFFF GGGG HHHH [取得したい部分] DDDD EEEE ABCD FFFF

  • wordの段落を通番で振りなおしたい

    word2003で段落を設定した文書があるんですが、番号を振りなおしてつけているため、以下のようになっております。 1.aaaa 2.bbbb 3.cccc 1.dddd 2.eeee 1.ffff 2.gggg 3.hhhh これを以下のような通しの段落番号に変換することは可能でしょうか? 1.aaaa 2.bbbb 3.cccc 4.dddd 5.eeee 6.ffff 7.gggg 8.hhhh 各段落の1.を”自動的に番号を振る”を選択すればできると思いますが、数が多いため簡単な方法を探しております。 よろしくお願いいたします。

  • SQLの書き方について教えてください。

    accessについて。 シートの中に列名name、列名friendnameがあります。 name,friendname aaaa,bbbb bbbb,cccc cccc,aaaa dddd,aaaa eeee,bbbb ffff,eeee ほしいデータは aaaa,bbbb,cccc bbbb,cccc,aaaa cccc,aaaa,bbbb dddd,aaaa,bbbb eeee,bbbb,cccc ffff,eeee,bbbb と友達の友達の名前がほしいのです。 SQLの書き方を教えてください。 よろしくお願いします。

  • 【Excel】 特定の文字でセルを分けたい

    こんにちは。 1 aaa\bbb\ccc 2 aaa\bbb\ccc\ddd 3 eeee\ffff\gggg 4 eeee\ffff\gggg\hhhh 上のようにディレクトリ表示されているA列を \で列を分けたいのです。 階層は列によって異なります。 1行目は Aにaaa Bにbbb Cにccc という形です。 どのような方法があるでしょうか。 よろしくお願いいたします。

このQ&Aのポイント
  • Win10からWin11へのデータ移行方法について教えてください。
  • Win10pcからWin11pcへのデータ移行にはどのような手順が必要ですか?
  • Win10pcからWin11pcへのデータ移行のためのツールやソフトウェアはありますか?
回答を見る

専門家に質問してみよう