0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

VBA_転記処理

Last updated at Posted at 2023-09-28

やること

VBAにて、パラメータシートから取得した転記情報を使用し、ワークブック間で転記を行う関数を作成します。

転記方法について

Paste/PasteSpecial

セルB1:B3の内容をセルD1に貼り付ける場合、転記方法は下記の(1)と(2)の方法があります。
image.png

(1)
    Range("B1:B3").Copy '対象範囲をコピー
    Range("D1").Select  '貼り付け先を選択
    ActiveSheet.Paste   'アクティブシートに貼り付け(セルD1)
(2)
    Range("B1:B3").Copy       '対象範囲をコピー
    Range("D1").PasteSpecial  '指定セルに貼り付け

実行結果は(1)と(2)それぞれ同じで、書式や数式を含む全貼付けされます。
image.png

異なる点
(1)ではPasteメソッド、(2)ではPasteSpecialメソッドを使用しています。
また、RangeオブジェクトにはPasteメソッドが無いため、下記のコードではエラーとなります。
Rangeオブジェクトを使用する時はPasteSpecialメソッドである必要があります。(Cellsも同様)

(1)*
    Range("B1:B3").Copy
    Range("D1").Paste

PasteSpecialメソッドについて
PasteSpecialメソッドでは、先程のように何も指定しないと全貼付けになります。
任意オプションを指定することで、貼り付ける際の細かい操作が可能です。
(形式を選択して貼り付け(Ctrl + Alt + V)のようなもの)
image.png
オプションについて
・Paste:貼り付け形式の指定(参照:XlPasteType

名称 説明
xlPasteAll -4104 すべて貼り付け
xlPasteFormats -4122 書式を貼り付け
xlPasteFormulas -4123 数式を貼り付け
xlPasteValues -4163 値のみ貼り付け   

xlPasteValues(-4163)と指定した場合の結果
image.png
・Operation:貼り付け対象セルに対して、コピーした値と演算する場合に指定。
・SkipBlanks:コピー範囲に含まれる空白セルを貼り付けずにスキップする場合、Trueを指定。
・Transpose:貼り付ける際、行と列を入れ替える場合はTrueを指定。

同ブック、別シート間での転記

コピー時、貼付け時はワークブックオブジェクトを指定しない場合、アクティブシートを操作対象とします。

    Dim wks1 As Worksheet
    Dim wks2 As Worksheet
    
    Set wks1 = ThisWorkbook.Worksheets("test1")
    Set wks2 = ThisWorkbook.Worksheets("test2")
    
    wks1.Range("B1:B3").Copy
    wks2.Range("A1").PasteSpecial

サンプル

関数_fncCopyAndPaste

パラメータシートの内容を配列に格納したものを使用し、関数にしました。
受け取ったワークシートオブジェクト間で転記をします。
下図はパラメータシートのイメージです。
image.png

fncCopyAndPaste
Function fncCopyAndPaste( _
    ByVal wksInp As Worksheet, _
    ByVal strInpColMin As String, _
    ByVal lngInpRowMin As Long, _
    ByVal strInpColMax As String, _
    ByVal lngInpRowMax As Long, _
    ByVal wksOut As Worksheet, _
    ByVal strOutCol As String, _
    ByVal lngOutRow As Long, _
    ByVal intPasteOption As Integer, _
    ByRef strMsgPrompt As String _
    )
    
    '変数定義
    Dim intRet As Integer
    Dim rngInp As Range
    Dim rngOut As Range
    
    '初期設定
    On Error GoTo Err01
    
    '最下行取得
    If 0 = lngInpRowMax Then
        lngInpRowMax = wksInp.Cells(Rows.Count, 1).End(xlUp).Row
    End If
    
    '入力範囲取得
    Set rngInp = wksInp.Range(strInpColMin & lngInpRowMin, strInpColMax & lngInpRowMax)
    
    '出力範囲取得
    Set rngOut = wksOut.Range(strOutCol & lngOutRow)
    
    '転記
    rngInp.Copy
    rngOut.PasteSpecial Paste:=intPasteOption
    Application.CutCopyMode = False
    
    '終了
    fncCopyAndPaste = 0
    Exit Function
    
Err01:
    intRet = Err.Number
    fncCopyAndPaste = intRet
    strMsgPrompt = "エラー番号:" & intRet & vbCrLf & _
                   "エラー内容:" & Err.Description
                    
End Function

呼び出し元

前回作成した配列作成関数の戻り値と組み合わせ、ループ処理にしました。

呼び出し元
    '配列「入力ファイル一覧」ループ
    For intInpCnt = 0 To UBound(arrInp, 1)
    
        '入力ファイル設定
        strInpID = arrInp(intInpCnt, 0)
        strInpWkb = arrInp(intInpCnt, 3)
        strInpWks = arrInp(intInpCnt, 4)
        
        '入力ファイルを開く
        Set wkbInp = Workbooks.Open(strInpWkb)
        Set wksInp = wkbInp.Worksheets(strInpWks)
        
        '出力ファイルを開く
        Set wkbOut = Workbooks.Open(strOutWkb)
        Set wksOut = wkbOut.Worksheets(strOutWks)
        
        '配列「転記」ループ
        For intCopyCnt = 0 To UBound(GvarListCopy, 1)
        
            If strInpID = GvarListCopy(intCopyCnt, 0) Then
                
                '転記情報取得
                strInpCopyColMin = GvarListCopy(intCopyCnt, 5)
                strInpCopyColMax = GvarListCopy(intCopyCnt, 6)
                lngInpCopyRowMin = GvarListCopy(intCopyCnt, 7)
                lngInpCopyRowMax = GvarListCopy(intCopyCnt, 8)
                strOutCopyColMin = GvarListCopy(intCopyCnt, 14)
                lngOutCopyRowMin = GvarListCopy(intCopyCnt, 15)
                intPasteOption = GvarListCopy(intCopyCnt, 16)
                
                '転記
                RintRet = fncCopyAndPaste(wksInp, _
                                          strInpCopyColMin, _
                                          lngInpCopyRowMin, _
                                          strInpCopyColMax, _
                                          lngInpCopyRowMax, _
                                          wksOut, _
                                          strOutCopyColMin, _
                                          lngOutCopyRowMin, _
                                          intPasteOption, _
                                          RstrMsgPrompt)
                '処理結果確認
                If 0 <> RintRet Then
                    Exit Function
                End If
                
            End If
        Next intCopyCnt
        
        '入力ファイルを保存せずに閉じる
        Application.DisplayAlerts = False
        wkbInp.Close savechanges:=False
        Application.DisplayAlerts = True
        
        '出力ファイルを保存して閉じる
        wksOut.Cells(1, 1).Select
        wkbOut.Close savechanges:=True
        
    Next intInpCnt

参考:
https://learn.microsoft.com/ja-jp/office/vba/api/excel.range.pastespecial?f1url=%3FappId%3DDev11IDEF1%26l%3Dja-JP%26k%3Dk(vbaxl10.chm144238)%3Bk(TargetFrameworkMoniker-Office.Version%3Dv16)%26rd%3Dtrue

エンジニアファーストの会社 株式会社CRE-CO S.K

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?