日本語名

部品_範囲コピー_値

英語名

CopyRange_Values

URL

https://feelcodelab.com/vba_parts/copyrange_values/

用途

・指定した範囲(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_Values
  (範囲設定部品で、コピー元の範囲と、コピー先の左上セルを作ってから、渡す)

依存関係(シート)

・特になし(マッピング表等は不要)

引数

vSrcRng     : コピー元の範囲(Range)。範囲設定部品などで作った、Set 済みの範囲
vDstTopLeft : コピー先の左上のセル(Range)。範囲設定_固定で、1 セルとして作った範囲

戻り値

Boolean : コピーできた場合は True、実行時にできなかった場合は False

戻り値の型

Boolean

コード全文

Function 部品_範囲コピー_値( _
        ByVal vSrcRng As Range, _
        ByVal vDstTopLeft As Range) As Boolean

    部品_範囲コピー_値 = f_CopyRange_Values(vSrcRng, vDstTopLeft)

End Function

Function f_CopyRange_Values( _
        ByVal vSrcRng As Range, _
        ByVal vDstTopLeft As Range) As Boolean

    Dim dstLastRow As Long
    Dim dstLastCol As Long
    Dim wsDst As Worksheet

    f_CopyRange_Values = False

    If vSrcRng Is Nothing Then
        Err.Raise vbObjectError + 1014, "f_CopyRange_Values", _
                  "コピー元(vSrcRng)が設定されていません(Nothing)。"
    End If

    If vDstTopLeft Is Nothing Then
        Err.Raise vbObjectError + 1014, "f_CopyRange_Values", _
                  "コピー先(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_Values", _
                  "コピー先が、シートの上限(" & vDstTopLeft.Worksheet.Rows.Count & "行・" & _
                  vDstTopLeft.Worksheet.Columns.Count & "列)を超えます" & _
                  "(コピー先の終了行=" & dstLastRow & "、終了列=" & dstLastCol & ")。"
    End If

    On Error GoTo ErrHandler

    Set wsDst = vDstTopLeft.Worksheet
    wsDst.Range(wsDst.Cells(vDstTopLeft.Row, vDstTopLeft.Column), _
                wsDst.Cells(dstLastRow, dstLastCol)).Value = vSrcRng.Value

    f_CopyRange_Values = True
    Exit Function

ErrHandler:
    Debug.Print "f_CopyRange_Values: " & Err.Number & " " & Err.Description
    f_CopyRange_Values = 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 を表示する)

BASファイル(ダウンロード)

CopyRange_Values.bas

バージョン

1.0

更新日

2026-10-29