- ベストアンサー
ExcelVBAの転記(1つのひな形へ複数シート)
- ExcelVBAを使って、複数の個別シートから一つのひな形シートにデータを転記する方法についてアドバイスをお願いします。
- 質問者はExcelVBAを学んだばかりで、200ほどの個別シートからデータをひな形シートに転記する方法で苦労しています。
- コードはコピーはできているが、転記先がコピー元になっており、転記する方法がわからないとのことです。アドバイスをお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
ws2.Cells(2, 2).Value = ws1.Cells(2, 13).Value '名前 ws1は i = 2 Set ws1 = wb.Worksheets(i) これだけしかセットしていませんから、いくらループしても転記元はWorksheets(2)のままです。 ws2は ループの中で Set ws2 = wb.Worksheets(i) されてますから、iの値で増えていきますから転記先は変更されています。 ですので、Aを転記したシートばかりが量産されているのだと思います。 同じブックに200のシートを追加したら400になって管理が面倒そうなので、新しく別ブックにデータを転記する方法はどうでしょうか。 元のブックの左端をひな形にしておいてください。 ひな形シートを転記先にコピーしながら転記元の左から2番目のシートから順に転記します。 転記時にシート名を「ひな形」から元のシート名へ変更しています。 最後にひな形だけのシートもコピーします。 ひな形の場所は転記元の転記用.xlsmの左端にあるものとしています。 転記するデータは転記用.xlsmにあるものとします。 Sub SheetCopy() Application.ScreenUpdating = False Dim cnt As Long 'シート数カウント変数 Dim i As Long 'シート用のカウンタ変数 Dim wb As Workbook 'コピー元 Dim wb2 As Workbook Dim ws1 As Worksheet 'コピー元 転記用.xlsm Dim ws2 As Worksheet 'コピー元 ひな形 Dim ws3 As Worksheet 'コピー先 i = 2 Set wb = Workbooks("転記用.xlsm") Set ws2 = wb.Worksheets("ひな形") Set ws1 = wb.Worksheets(i) cnt = wb.Worksheets.Count 'シート数をカウント ws2.Copy 'これだけでひな形シートだけの新しいブックができます Set wb2 = ActiveWorkbook wb2.SaveAs ThisWorkbook.Path & "\転記先.xlsx" 'ブックを保存しています Set ws3 = wb2.Worksheets(1) ws3.Name = ws1.Name '元のシート名をコピー先に適用 For i = 2 To cnt '左端がひな形なので2から Set ws1 = wb.Worksheets(i) Set ws3 = wb2.Worksheets(i - 1) ws3.Name = ws1.Name ws3.Cells(2, 2).Value = ws1.Cells(2, 13).Value '名前 ws3.Cells(3, 2).Value = ws1.Cells(6, 10).Value '住所 ' 以下、同様の転記処理を記述しています。 ws2.Copy after:=wb2.Worksheets(i - 1) Set ws1 = Nothing Set ws3 = Nothing Next i Set ws2 = Nothing Set wb2 = Nothing Set wb = Nothing Application.ScreenUpdating = True End Sub
その他の回答 (2)
- f272
- ベストアンサー率46% (8536/18274)
やりたいことがよくわからん。 > コピーした「ひな形」シートへ対して、1枚のシートを転記。 「ひな形」シートはどこからコピーするのか? その後に「ひな形」シートの1枚目のシートの一部の内容を転記する、ということでよいか? > その後に、新たに「ひな形」シートをコピーして当該シートへ2枚目のシート内容を転記。 その後に「新たに「ひな形」シートをコピー」というのはどういうことか?別の場所にコピーするなら、それはどこか?同じブックの中ならさっきの「ひな形」シートとの関係はどうなるのか?
補足
貴殿からのご回答は結構でございます。
- f272
- ベストアンサー率46% (8536/18274)
こんな感じ? Sub SheetCopy() Dim cnt As Long 'シート数カウント変数 Dim i As Long 'シート用のカウンタ変数 Dim wb As Workbook 'コピー元 Dim ws1 As Worksheet 'コピー元 Dim ws2 As Worksheet 'コピー先 Set wb = Workbooks("転記用.xlsm") cnt = wb.worksheets.Count 'シート数をカウント Set ws2 = wb.Worksheets("ひな形") For i = 1 To cnt Set ws1 = wb.Worksheets(i) if ws1.name <> "ひな形" then ws2.Cells(2, 2).Value = ws1.Cells(2, 13).Value '名前 ws2.Cells(3, 2).Value = ws1.Cells(6, 10).Value '住所 end if Next i End Sub
補足
ご回答ありがとうございます。早速試してみました。 結果はNGでした。ひな形シートへデータが転記されたのみとなります。私の説明が悪かったことが起因しております。 実現したいことは、コピーした「ひな形」シートへ対して、1枚のシートを転記。その後に、新たに「ひな形」シートをコピーして当該シートへ2枚目のシート内容を転記。これを、約200シートについて行いたいという内容となります(1ファイルに、シート数が約200増えることになるかと拝察いたします)。 コピーした「ひな形」シートに対して機械的に名前を付けることができれば、シートオブジェクトに対して転記の命令文を記述できるかと思うのですが、その方法がわからず現在に至っております。コピーされた「ひな形」シートを指定する方法がわかっておりません。 どうぞ、お知恵の拝借をお願い申し上げます。
お礼
ご丁寧なご回答をいただきまして、ありがとうございました。 おっしゃる通り、意図しない挙動をしておりましたが、暖かいご指導のおかげで理解いたしました。また、実現したかった動作となり、感謝しております。 繰り返しとはなりますが、本当にありがとうございました。