- 締切済み
1行を1シートずつに書き出すには
顧客データのシートがあります。 1人分のデータが1行になっていて、300行ほどあります。 顧客1人ずつのデータを1シートごとに分割して、 300シートを書き出したいのですが、 どのようにすればできるでしょうか。 この際、できれば、シート名は顧客名に、 1行は1列に変換して(行列入れ替え)できれば、なお嬉しいのですが… よろしくお願いいたします。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- imogasi
- ベストアンサー率27% (4737/17069)
質問そのままに受け取ってやるとして まずやり方だが (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が必要 ーー 本質問は初心者には難しい問題である。
- zap35
- ベストアンサー率44% (1383/3079)
以下のマクロを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枚作成できるかは定かではありません。ご承知おきください。
お礼
素早い回答をいただき、ありがとうございました。 こちらの方法でも、バッチリ解決しました。
- hal_n
- ベストアンサー率43% (7/16)
実際にどのような形で顧客データが記述されているのか分かりませんが、仮に以下の通りだったとします。 ・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
お礼
素早い回答をいただき、ありがとうございました。 教えていただいた方法で、バッチリ解決しました。
お礼
素早い回答をいただき、ありがとうございました。 ご指摘の通り、VBAは初心者以前です。 印刷や画面表示のためではなく、作業用に分割した300シートが必要だったので、質問させていただきました。 imogasiさんの回答は、私には難しかったです。 ありがとうございました。