[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『別シートへ項目ごとに転記』(みみ)
以前にもご質問させていただきましたが、解決していないため再度質問させてください。 下記コードは、B列の項目ごとにシートを作成するマクロとなります。 VBについては素人となりますので、ネットから調べ引用していますが、 (Sheet1)と同じ列・行の幅、またページレイアウトまで同じように別シートを 作成するにはどうしたらいいかご教示いただけないでしょうか? シート数は、100を超えるので、1シートごとレイアウト変更を行うことは困難です。 ご教示ください。 あくまで素人なので質問不足もあるかもわかりませんが、よろしくお願いします。
Sub test1()
Dim i As Long
Dim lastRow As Long
Dim mySh As Worksheet
Dim myFlg As Boolean
Dim myRow As Long
Dim myKey As String
lastRow = Worksheets("Sheet1").Range("A" & Rows.Count).End(xlUp).Row
For i = 2 To lastRow
'----振り分け先のシートが存在するか否かをチェック
For Each mySh In Worksheets
myFlg = False
myKey = Worksheets("Sheet1").Range("B" & i).Value
If mySh.Name = myKey Then
myFlg = True
mySh.Cells.Delete
Exit For
End If
Next mySh
'----振り分け先のシートがなかったらシートを追加する
If myFlg = False Then
ActiveWorkbook.Worksheets.Add(after:=Worksheets(Worksheets.Count)).Name = myKey
End If
'----列見出しをコピー&貼り付け
Worksheets("Sheet1").Range("A1:Q1").Copy Worksheets(myKey).Range("A1")
Next i
'----データを転記する
For i = 2 To lastRow
myKey = Worksheets("Sheet1").Range("B" & i).Value
If myKey <> "" Then
myRow = Worksheets(myKey).Range("A" & Rows.Count).End(xlUp).Row + 1
Worksheets("Sheet1").Range("A" & i & ":P" & i).Copy _
Worksheets(myKey).Range("A" & myRow & ":P" & myRow)
End If
Next i
End Sub
< 使用 Excel:Excel2016、使用 OS:Windows10 >
ここで、新規シートを追加していますが、Sheet1をコピーするようにしてはどうでしょうか。
(マナ) 2020/06/15(月) 20:15
早速の回答ありがとうございます。 できれば、コードの修正もご教示いただけたら助かります。 (みみ) 2020/06/15(月) 20:31
シート名の変更は、
Worksheets(Worksheets.Count)).Name = myKey
で可能でしょうし…
(もこな2) 2020/06/15(月) 21:16
こんばんは! 単純にSheet1と同じシートを100個作るだけなら ↓このコードでもそうなりますね(^^; 後は、名前ですね。。。 それとシートを100個というのは頂けないですね。。。仕様を見直した方がいいと思います。 最近のパソコンはそんなことはないのでしょうけど、、メモリーを食うのですね。 まぁ、、、一例です。。。応用して頂けると助かります。。。
Option Explicit
Sub Macro1()
Dim i As Long
For i = 1 To 100
Sheets("Sheet1").Copy Before:=Sheets(2)
Next
End Sub
(SoulMan) 2020/06/15(月) 21:36
>以前にもご質問させていただきましたが、解決していない
前トピックは↓ですかね
[[20200601145018]] 『項目を指定し、シートに分割する』(みみ)
件のトピックをみると別に内容が変わってないようですし、別トピックにする必要なかったんじゃないですかね。
もちろん、トピックを変えてはダメとは言いませんが、それならそれで、ちゃんと元トピックの話を終わらせるのが筋ではないでしょうか?
過去ログを探すために、(みみ)というニックネームで調べてみたら、件のトピックのほかにも、回答者からのキャッチボールを返してないものがゴロゴロみつかるのですよね。。。
そうなると、どうせ回答をつけても、また放置するんだろうなんて思っちゃっても答えたくなくなったりします。
無論、そうは感じない回答者さんも大勢いらっしゃるでしょうから困ることはないと思いますが、たまには回答するほうのことも気遣ってほしいなぁなんて思った次第です。
■以下本題■
本トピックの質問については、実際にステップ実行で研究していただくとして、シートの存在チェックについて、提示された方法以外にも存在しないシートを取得しようとするとエラーが発生するのを利用する方法もありますよ。
それを踏まえて別案。
Sub 別案()
Dim SH As Worksheet
Dim i As Long
Stop ' ← ブレークポイントの代わり
With Worksheets("Sheet1")
For i = 2 To .Range("A" & .Rows.Count).End(xlUp).Row
'▼オブジェクト変数「SH」をリセットしてから、シートをセットしようとしてみる
Set SH = Nothing
On Error Resume Next
Set SH = Worksheets(.Cells(i, "B").Value)
On Error GoTo 0
'▼シートが存在せず、セットが失敗して初期値の「Nothing」のままになっているときだけ処理する
If SH Is Nothing Then
'// コピーしてシートの末尾に挿入【★ここを研究】
Worksheets("Sheet1").Copy after:=Worksheets(Worksheets.Count)
'// シートの末尾(に挿入された)シートを変数にセット
Set SH = Worksheets(Worksheets.Count)
SH.Name = .Cells(i, "B").Value
'----コピーしたシートの見出し行以外をクリア
SH.UsedRange.Offset(1).ClearContents
End If
'▼無条件で処理する
.Range("A" & i & ":P" & i).Copy SH.Range("A" & .Rows.Count).End(xlUp).Offset(1)
Next i
End With
End Sub
(もこな2 ) 2020/06/15(月) 23:32
(もこな2 )さん ご意見をいただいたとおり、親切にご回答いただいているにも関わらず。、 大変失礼をいたしました。
今後は十分注意し、回答者の立場にたちたいと思います。
ご回答いただいた内容ですが、やはり私の能力では、上手くいきませんでした。 一から出直します。 すいませんでした。 (みみ) 2020/06/16(火) 07:43
とりあえず考えられることとしては
・「Sheet1」というシートがない
・参照したセルの値が""だったorシート名に使えない文字が含まれていたために、シートの作成に失敗した
なんてことが思いつきますが、ステップ実行して自己検証はしているでしょうから、そんなことだったらすぐに気づけるので違いますよね?
まぁ↓のように仰ってますし、追加の情報がないとよくわからないので考えるのはこの辺にしておきます。
>一から出直します。
ちなみに、結局ほかのトピックは放置するんでしょうか?
遅ればせながらでも結果を報告するのが、答えてくれた人への礼儀じゃないですかね・・・
(もこな2 ) 2020/06/16(火) 22:14
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.