【Excel VBA】結合セルを作りながら貼り付ける

ソフトウェア開発をしていると、Excel方眼紙というものに出くわすことがある。ありがちな特徴は…
セルが結合されていて、貼り付けに苦労する。
ページ内のタイトルやページ番号をヘッダーとフッター機能を使わず、セルに書かれてあったりするため、改ページまで考慮しないといけなかったりする。

そこで、直接的な解決方法ではないが、コピーしたセルをもとに、貼り付け先に結合セルを作りながら貼り付けるマクロを作成した。
マクロを実行後に作成された結合セルを、手動でExcel方眼紙に対してコピペしていただきたい。

Option Explicit

Public Sub PasteMergedCell()

    Dim src As Range
    Set src = Application.InputBox(Prompt:="変換したいセルを選択してください。", Type:=8)

    Dim dst As Range
    Set dst = Application.InputBox(Prompt:="出力先セル(左上の1セル)を選択してください。", Type:=8)
    
    'マージするセルの大きさ(行数)
    Dim mergeCellRowLength As Integer
    mergeCellRowLength = Application.InputBox(Prompt:="出力先で1行当たりマージするセル数を入力してください。", Type:=1)
    
    'マージするセルの大きさ(列数)
    Dim mergeCellColArray As Variant
    Dim mergeCellColLengthInfo As String
    mergeCellColLengthInfo = Application.InputBox(Prompt:="出力先の列ごとにマージするセル数をカンマ区切りで入力してください。", Type:=2)
    mergeCellColArray = Split(mergeCellColLengthInfo, ",")
        
    Dim srcStartRow As Integer  'コピー開始行
    Dim srcStartCol As Integer  'コピー開始列
    srcStartRow = src.row
    srcStartCol = src.Column
    
    Dim pasteStartRow As Integer    '貼り付け開始行
    Dim pasteStartCol As Integer    '貼り付け開始列
    pasteStartRow = dst.row
    pasteStartCol = dst.Column
        
    Dim pasteTargetRow As Integer   '貼り付け行
    pasteTargetRow = pasteStartRow  '開始行で初期化
    
    Dim pasteTargetCol As Integer   '貼り付け列
    pasteTargetCol = pasteStartCol  '開始列で初期化
    
    '全行ループ
    Dim row As Integer  '現在行
    For row = srcStartRow To srcStartRow + src.Rows.Count - 1
        '変換元を取得
        Dim srcCell As Range
        
        '変換元のある1行の中で最大の行数を取得する
        Dim maxLineCountPerSrcLine As Integer
        maxLineCountPerSrcLine = 0
        
        Dim col As Integer  '現在列
        For col = srcStartCol To srcStartCol + src.Columns.Count - 1
        
            Set srcCell = ActiveSheet.Cells(row, col)   '現在セル

            '変換元の行数を取得
            Dim srcLineCount As Integer
            srcLineCount = UBound(Split(srcCell.Text, vbLf)) + 1    '(セル内改行を取得する)
            
            '貼り付け先の論理行数を算出
            Dim dstLogicalLineCount As Integer
            If srcLineCount < mergeCellRowLength Then
                dstLogicalLineCount = 1
            Else
                dstLogicalLineCount = srcLineCount / mergeCellRowLength
                
                If srcLineCount Mod mergeCellRowLength > 0 Then
                    dstLogicalLineCount = dstLogicalLineCount + 1
                End If
            End If
            
            '貼り付け先の物理行数を算出
            Dim dstPysicalLineCount As Integer
            dstPysicalLineCount = dstLogicalLineCount * mergeCellRowLength
            
            '最大行数を取得する
            If dstPysicalLineCount > maxLineCountPerSrcLine Then
                maxLineCountPerSrcLine = dstPysicalLineCount
            End If
        Next col

        '貼り付け先を作成
        Dim mergeCellColArrayIndex As Integer
        mergeCellColArrayIndex = 0
        
        '1行内の列を貼り付ける
        For col = srcStartCol To srcStartCol + src.Columns.Count - 1
            Set srcCell = ActiveSheet.Cells(row, col)
            
            Dim mergeColLength As Integer
            mergeColLength = mergeCellColArray(mergeCellColArrayIndex)
            
            'セルを結合する
            Dim pasteArea As Range
            Set pasteArea = Range(ActiveSheet.Cells(pasteTargetRow, pasteTargetCol), ActiveSheet.Cells(pasteTargetRow + maxLineCountPerSrcLine - 1, pasteTargetCol + mergeColLength - 1))
            pasteArea.UnMerge   'セルの結合を解除
            
            Application.DisplayAlerts = False  '--- 確認メッセージを非表示
            pasteArea.Merge
            Application.DisplayAlerts = True   '--- 確認メッセージを表示
   
            pasteArea.Value = srcCell.Text
            
            '次の列へ進む
            pasteTargetCol = pasteTargetCol + mergeColLength
            mergeCellColArrayIndex = mergeCellColArrayIndex + 1
        Next col
        
        '貼り付け先を次へ進める
        pasteTargetCol = pasteStartCol
        pasteTargetRow = pasteTargetRow + maxLineCountPerSrcLine
        
    Next row
    
End Sub