質問: Worksheets("Eチーム").Cells(Rows.Count, "A").End(xlUp).Row + 1 Worksheets("入力").Range("D3:ag3").copy Destination:=Worksheets("Eチーム").Range("A" & n) End If Next i End Sub ``` ### 試したこと rowやcells("d"&i:"AG"&i)等試しましたが、コンパイルエラーが出ます。 ### 補足情報(言語/FW/ツール等のバージョンなど) office365
回答: まずynakanoさん提示のCurrentRegionについての補足になりますが、これは入力されているデータ範囲を自動で特定してくれる便利な機能です。 便利な機能ではありますが、自動選択される範囲は指定セルを含む、空セルで囲まれた範囲、という仕様上の制約があります。 今回のデータシートが、例えば先頭行が見出し項目で空白なく埋められており、通し番号の列や必須項目の列があるため空行は存在しない、という状況なら問題なく取得できます。 ``` A列 B列 C列 D列 E列 F列 ========================== No. Q1 Q2 Q3 Q4 Q5 1 A1 A2 A4 A5 2 A1 A4 3 A4 A5 4 A1 A2 A5 5 A1 A2 A4 A5 ``` ⇒A1セルの指定により、A1:F6のセル範囲が取得できます。 しかし、見出し行がなく、5項目中の3項目目でたまたま未入力が連続したデータなどでは、2項目目までしか範囲選択されなくなる可能性もありますのでご注意ください。 ``` A列 B列 C列 D列 E列 F列 ========================== 1 A1 A2 A4 A5 2 A1 A4 3 A4 A5 4 A1 A2 A5 5 A1 A2 A4 A5 ``` ⇒A1セルの指定により、A1:C5のセル範囲しか取得されません。 上記のような制約があることから、私は「データが存在する範囲」の最終行を取得する場合の操作として.End(xlUp)をお勧めしています。 ``` 'C列の最終データ行までループ処理 For i = 1 To Sheets("入力").Cells(Sheets("入力").Rows.Count, "C").End(xlUp).Row '・・・(中略) Next ``` 補足ですが、.End(xlUp)も「指定した列の中で最下行の入力セルが取得できる」というだけで、「シート内の最終データ行」が取得できるわけではありません。 今回は必須項目と思われるチーム名の列がありますので、この列の.End(xlUp)で最終データを探せばよいと思います。 確実に目的のデータ範囲が取得できることがわかっているようでしたら、CurrentRegionを利用してもよいでしょう。 目的のデータ範囲が取得できるよう、データ範囲の選択方法を検討してください。 追記 私が動作確認したソースです。 ynakanoさん提示のソースに少し手を加えた内容です。 ``` Dim shtRead As Worksheet Set shtRead = Sheets("入力") Dim iReadRow As Integer Dim iWriteRow As Integer Dim strShtName As String '入力シートのデータをループ処理 For iReadRow = 3 To shtRead.Cells(Rows.Count, 3).End(xlUp).Row Select Case shtRead.Cells(iReadRow, 3).Value Case "1.Aチーム" strShtName = "Aチーム" Case "2.Bチーム" strShtName = "Bチーム" Case "3.Cチーム" strShtName = "Cチーム" Case "4.Dチーム" strShtName = "Dチーム" Case "5.Eチーム" strShtName = "Eチーム" Case Else strShtName = "" End Select 'シート名が取得できたらコピーを行う If strShtName <> "" Then '出力シートの最終行+1を取得 iWriteRow = Sheets(strShtName).Cells(Rows.Count, 1).End(xlUp).Row + 1 '入力シートから出力シートへコピー shtRead.Range(shtRead.Cells(iReadRow, 3), shtRead.Cells(iReadRow, 33)).Copy Destination:=Sheets(strShtName).Cells(iWriteRow, 1) End If Next ```