• 締切済み

1行を1シートずつに書き出すには

顧客データのシートがあります。 1人分のデータが1行になっていて、300行ほどあります。 顧客1人ずつのデータを1シートごとに分割して、 300シートを書き出したいのですが、 どのようにすればできるでしょうか。 この際、できれば、シート名は顧客名に、 1行は1列に変換して(行列入れ替え)できれば、なお嬉しいのですが… よろしくお願いいたします。

みんなの回答

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

質問そのままに受け取ってやるとして まずやり方だが (1)VBAでもできる(質問者はVBAの経験あるのかな) 多分無いのでしょう。既出回答も役に立つのかな。 (2)関数でもできる(ちょっと手間だが) 下記に説明してみる。 ーー しかし、根本論として 多分質問者はシステムの素人で、自分の考えでこういう質問をしているように思えてならない。 なぜなら今までシステムにかかわったものは、エクセル300行のレコードを300シートなぞにしません。 1行データでー>1画面に組み立てー>1枚印刷ー>300回繰り返し といったパターンでやってきたからです。 1人を指定して表示するときも、人に割り当てたコードで検索ー>その人のデータ行を見つけるー画面に(見やすく編集して)表示 別の人の指定がでたなら、内容(コード)を変えて同様作業をプログラムで繰り返す とすることが多い。 ーー 関数では (1)原データ(表の)の各行に連続番号を振る ーー (2)1シートを(見本的に)作る。 標題や見出しや書式や様式(フォーマット)を好みのものに 作る (3)そして 関数式を入れる。それは (4)(1)の連番で引くVLOOKUP関数を用いて、原データ表の各列の項目を(2)のフォーマットの中の該当のセルに入れる。 (5)各シートで連番を入れるセル(同一位置であること、下記例ではG1)を決めておく。 (6)シートを300枚コピー 手間だが1->2->4->8・・ と操作でコピーする方法はある。10回ぐらいで300シートを越える。 (7)各シートの(5)のセル(下記例ではG1)に1,2,3、・・を入れる。 これで各シートの内容は元のデータの各行を反映するはず。 VBAを使えば(6)や(7)は自動化できるので、より楽になる。 簡略例 Sheet1の表データ 連番 氏名 住所 以下項目数が多数あっても良い。 1 山田  調布市 2 鈴木  千葉市 3 田中  横浜市 ーー Sheet2以下の 各シートのフォーマット   社員カード  連番 ZZZ(G1セルと仮定) 氏名  XXXX 住所  YYYY XXXXのセルの式 =VLOOKUP($G$1,Sheet1!$A$1:$C$300,2,FALSE) yyyyのセルの式 =VLOOKUP($G$1,Sheet1!$A$1:$C$300,3,FALSE) 例では氏名、住所だけに簡略化したが、項目の数だけ式をセットすることになる。!$A$1:$C$300の部分は変わるが。 シート名を各氏名にするのは関数では絶対できない。 VBAが必要 ーー 本質問は初心者には難しい問題である。

Kids21
質問者

お礼

素早い回答をいただき、ありがとうございました。 ご指摘の通り、VBAは初心者以前です。 印刷や画面表示のためではなく、作業用に分割した300シートが必要だったので、質問させていただきました。 imogasiさんの回答は、私には難しかったです。 ありがとうございました。

  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.2

以下のマクロをALT+F11でVBE画面を開き、左上のVBA Projectでシート名を右クリックし「挿入」→「標準モジュール」で表示される画面に貼り付けて下さい。マクロの実行はワークシート画面に戻ってALT+F8でマクロ一覧を開き、マクロ名を選択して「実行」ボタンです。 ただシートを追加したのではシート名がわかりにくいので、10行目をコメントでなくすれば(行先頭の「'」を削除すれば)元のシートのA列の値をシート名にするようにしました(各行で重複がある場合はエラーになりますのでNG。もし) Sub Macro2() Dim orgWs As Worksheet Dim idx As Long   Set orgWs = ActiveSheet   Application.ScreenUpdating = False   For idx = 1 To Range("A65536").End(xlUp).Row     Worksheets.Add after:=Sheets(Worksheets.Count)     orgWs.Rows(idx).Copy     Range("A1").PasteSpecial Paste:=xlPasteAll, Transpose:=True '    ActiveSheet.Name = orgWs.Cells(idx, "A").Value 'シート名をA列の値にする。B列の値にするなら"B"に変更。   Next idx   orgWs.Activate   Application.CutCopyMode = False   Application.ScreenUpdating = True End Sub なおブック内の最大シート枚数はメモリ容量に依存しますので、質問者さまのPCで300枚作成できるかは定かではありません。ご承知おきください。

Kids21
質問者

お礼

素早い回答をいただき、ありがとうございました。 こちらの方法でも、バッチリ解決しました。

  • hal_n
  • ベストアンサー率43% (7/16)
回答No.1

実際にどのような形で顧客データが記述されているのか分かりませんが、仮に以下の通りだったとします。 ・1行目は見出し行で、2行目からデータが始まる ・1列目からデータが始まる 以下のコードを標準モジュールに記述し実行してみてください。 Sub DeployToSheets()  Dim srcSheet As Worksheet  Dim destSheet As Worksheet  Dim lastSheet As Worksheet    Set srcSheet = ActiveSheet  Set lastSheet = srcSheet    Dim i As Integer  Dim j As Integer  For i = 2 To srcSheet.UsedRange.Rows.Count   Set destSheet = Worksheets.Add(after:=lastSheet)      '●●●の部分に顧客名の列を記入(C列なら3)   destSheet.Name = srcSheet.Cells(i, ●●●).Value       For j = 2 To srcSheet.UsedRange.Columns.Count    destSheet.Cells(j - 1, 1) = srcSheet.Cells(i, j).Value   Next      Set lastSheet = destSheet  Next End Sub

Kids21
質問者

お礼

素早い回答をいただき、ありがとうございました。 教えていただいた方法で、バッチリ解決しました。

関連するQ&A