部品_範囲コピー
CopyRange
https://feelcodelab.com/vba_parts/copyrange/
・指定した範囲(Range)を、コピー先の左上セルを起点にして、値・数式・書式のすべてをコピーする ・コピー元とコピー先は、範囲設定部品(SetRange_Fixed / SetRange_VariableRows)で作った Range を、そのまま渡す ・コピー先のブック・シートは、コピー先の Range が持っているので、ブックを別に指定する必要はない ★ この部品は Sub(プロシージャ)ではなく「Function(関数)」で、成功/失敗を Boolean で返す
土台
処理
範囲
★【最重要】この部品は Function(関数)であり、戻り値(Boolean)を返す
→ コピーできた場合は True、実行時にできなかった場合は False(この場合は、エラーでは止まらない)
→ 呼び出し側は、必ず戻り値を確認してから後続処理を行い、メッセージも呼び出し側で表示する
(False のときは、MsgBox のあとに Exit Sub まで書く)
★【最重要】コピー元(vSrcRng)とコピー先(vDstTopLeft)は、どちらも Set 済みの Range を渡す
→ コピー先は、コピーを始める左上の 1 セルを、範囲設定_固定で作って渡す
(例:Set dst = 部品_範囲設定_固定(wbDst, "転記先", 3, 1, 3, 1))
→ コピー先に複数セルの範囲を渡した場合は、その左上の 1 セルだけを使う
・コピー先の範囲の大きさは、コピー元と同じ行数・列数になる(コピー先では指定しない)
・コピーされるのは「値・数式・書式のすべて」(罫線・色・表示形式・入力規則なども、コピー先に反映される)。数式の相対参照は、コピー先の位置に合わせて、ずれる
・コピー先に、すでに入っている値は、上書きされる(確認なし)。残したいセルが、コピー先に
含まれていないか、呼び出し側で確認する
・複数の領域(離れたセルの集まり)の範囲は、対象外
・設定の誤りは、False ではなく、原因を示すエラーで止まる(Err.Raise)
- コピー元(vSrcRng)が Nothing(vbObjectError + 1014)
- コピー先(vDstTopLeft)が Nothing(vbObjectError + 1014)
- コピー先が、シートの上限(行数・列数)を超える(vbObjectError + 1009)
・Offset / Find / Resize / With は禁止・なし(土台の部品。他の部品を参照しない。単独で使用可能) ・組み合わせ:f_SetRange_Fixed / f_SetRange_VariableRows → f_CopyRange (範囲設定部品で、コピー元の範囲と、コピー先の左上セルを作ってから、渡す)
・特になし(マッピング表等は不要)
vSrcRng : コピー元の範囲(Range)。範囲設定部品などで作った、Set 済みの範囲 vDstTopLeft : コピー先の左上のセル(Range)。範囲設定_固定で、1 セルとして作った範囲
Boolean : コピーできた場合は True、実行時にできなかった場合は False
Boolean
Function 部品_範囲コピー( _
ByVal vSrcRng As Range, _
ByVal vDstTopLeft As Range) As Boolean
部品_範囲コピー = f_CopyRange(vSrcRng, vDstTopLeft)
End Function
Function f_CopyRange( _
ByVal vSrcRng As Range, _
ByVal vDstTopLeft As Range) As Boolean
Dim dstLastRow As Long
Dim dstLastCol As Long
f_CopyRange = False
If vSrcRng Is Nothing Then
Err.Raise vbObjectError + 1014, "f_CopyRange", _
"コピー元(vSrcRng)が設定されていません(Nothing)。"
End If
If vDstTopLeft Is Nothing Then
Err.Raise vbObjectError + 1014, "f_CopyRange", _
"コピー先(vDstTopLeft)が設定されていません(Nothing)。"
End If
dstLastRow = vDstTopLeft.Row + vSrcRng.Rows.Count - 1
dstLastCol = vDstTopLeft.Column + vSrcRng.Columns.Count - 1
If dstLastRow > vDstTopLeft.Worksheet.Rows.Count Or dstLastCol > vDstTopLeft.Worksheet.Columns.Count Then
Err.Raise vbObjectError + 1009, "f_CopyRange", _
"コピー先が、シートの上限(" & vDstTopLeft.Worksheet.Rows.Count & "行・" & _
vDstTopLeft.Worksheet.Columns.Count & "列)を超えます" & _
"(コピー先の終了行=" & dstLastRow & "、終了列=" & dstLastCol & ")。"
End If
On Error GoTo ErrHandler
vSrcRng.Copy Destination:=vDstTopLeft.Cells(1, 1)
Application.CutCopyMode = False
f_CopyRange = True
Exit Function
ErrHandler:
Debug.Print "f_CopyRange: " & Err.Number & " " & Err.Description
f_CopyRange = False
End Function<例1:転記元の表を、転記先へコピーする>
Dim src As Range
Dim dst As Range
Set src = 部品_範囲設定_行可変(ThisWorkbook, "転記元", 3, 1, 4, 1) '3行目から、1列目の最終行まで(A-D列)
If src Is Nothing Then
MsgBox "データがありません"
Exit Sub
End If
Set dst = 部品_範囲設定_固定(ThisWorkbook, "転記先", 3, 1, 3, 1) '左上の1セル(A3)
If 部品_範囲コピー(src, dst) = False Then
MsgBox "コピーに失敗しました(シートの保護などを確認してください)"
Exit Sub
End If
<例2:開いたファイルへコピーする>
Dim wbDst As Workbook
If 部品_ファイルを開く("E:\TEST\テンプレート.xlsx") = False Then Exit Sub
Set wbDst = ActiveWorkbook '開いた直後に控える
Set src = 部品_範囲設定_固定(ThisWorkbook, "入力", 2, 1, 10, 4)
Set dst = 部品_範囲設定_固定(wbDst, "帳票", 3, 1, 3, 1)
If 部品_範囲コピー(src, dst) = False Then MsgBox "コピーに失敗しました": Exit Sub
<例3:数式が入った範囲をコピーする>
数式は、コピー先でも数式のまま入り、相対参照がずれる(結果の値だけがほしいときは、部品_範囲コピー_値 を使う)
※ コピー元・コピー先が Nothing の場合や、コピー先がシートの上限を超える場合は、
False ではなく、原因を示すエラーで止まる(起点の On Error で受けて、Err.Description を表示する) 1.0
2026-10-29