新規シートを追加してから貼り付け の続き

先日、配列をシートに貼り付ける際、新規シートを追加してから貼り付けられるようにしてみた。
infoment.hatenablog.com

このマクロには問題があった。例えば配列を「新規シートのA1」に貼り付ける際、引数を渡した時点で「新規シートのA1」は存在しないため、新規シートを追加したのちにセットし直す必要があったのだ。この点について二人の方から、ご指摘・ご助言も頂いた。

そこで、次のとおり作り直すことにした。

  1. 貼り付け先の指定(引数)は、Rangeではなく、Addressとする。
  2. 貼り付け先のシートを指定しない場合、ActiveSheetを貼り付け先とする。
  3. 貼り付け先のシートをシート名で指定した際、当該シートが存在しない場合、同名のシートを新規に作成して貼り付ける。
  4. ついでに、貼り付け後の列幅調整を引数に追加。

以上を踏まえると、↓ こんな感じだ。

' destination As String 貼り付け先アドレス 例.A1
' sheet_name As String 貼り付け先シート名
'   無指定の場合・・・ActiveSheet
'   既存名を指定・・・指定名のシート
'   指定名が無い・・・指定名で新規シートを作成
' paste_type as PasteType テータまたはテーブルを選択
' column_autofit As Boolean 貼り付け後の列幅自動調整
' 配列をシートへ貼り付け。
Public Function PasteArray(destination As String, _
                  Optional sheet_name As String = vbNullString, _
                  Optional paste_type As PasteType = ptRange, _
                  Optional column_autofit As Boolean = False) As ListObject

    Dim Ws As Worksheet
    Dim Sh As Worksheet
        ' シート名の指定がない場合、アクティブシートに貼り付け。
        If sheet_name = vbNullString Then
            Set Sh = ActiveSheet
        ' シート名の指定があって、かつシートが存在する場合、そのシートに貼り付ける。
        ' シート名の指定があって、かつシートが存在しない場合、シートを新規作成する。
        Else
            For Each Ws In Worksheets
                If Ws.Name = sheet_name Then
                    Set Sh = Ws
                    Exit For
                End If
                If Sh Is Nothing Then
                    Sheets.Add After:=Sheets(Sheets.Count)
                    Set Sh = ActiveSheet
                        Sh.Name = sheet_name
                End If
            Next
        End If

    Dim DestinationRange As Range
    On Error Resume Next
    Set DestinationRange = Sh.Range(destination)
    On Error GoTo 0

    If Err.Number <> 0 Then
        MsgBox "貼り付け先のアドレス指定に誤りがあるため、処理を中断します。"
        Exit Function
    End If


    Dim TargetRange As Range
    Set TargetRange = DestinationRange.Resize(rMax - rMin + 1, cMax - cMin+ 1)
        TargetRange = source_array

    If paste_type = ptTable Then
        Dim TableName As String
            TableName = "Table_" & Format(Now, "yyyymmdd_hhmmss")

            ActiveSheet.ListObjects.Add(xlSrcRange, _
                                        TargetRange, _
                                        , _
                                        xlYes).Name = TableName
            Set PasteArray = ActiveSheet.ListObjects(TableName)
    End If

    If column_autofit Then
        TargetRange.EntireColumn.AutoFit
    End If

End Function

暫くこれで運用してみて、何か問題があれば、また改修することにします。

クラスモジュールの全文(最新版)はこちら。
infoment.hatenablog.com

参考まで。