回答編集履歴

1 誤字や表現の修正

imihito

imihito score 1522

2018/07/21 20:59  投稿

MyCopyだけで用は足りるのでひとまとめにしてしまって良いと思います。
```vba
'セルの 大体の書式と 値を CopyPaste
Sub MyCopy(ByVal CopyRng As Range, ByVal PasteRng As Range)
   
   Const valueDataType = Excel.XlRangeValueDataType.xlRangeValueXMLSpreadsheet
   
   With CopyRng
       PasteRng.Resize(.Rows.Count, .Columns.Count) _
               .Value(valueDataType) = .Value(valueDataType)
   End With 'CopyRng
   
End Sub
```
---
コピーとペーストで役割を分離させるという事で、以下のコードも考えてみましたが、正直無駄に複雑な感が強いです。
コピーとペーストで役割を分離させるという事で、以下のコードも考えてみました。
正直なところ無駄に複雑な感が強いですが。
```
'コピーした情報
Public Type RangeXmlValue
   XML As String
   RowCount As Long
   ColumnCount As Long
End Type
'コピー相当
Property Get XmlValueOf(ByVal Target As Range) As RangeXmlValue
   With XmlValueOf
       .XML = Target.Value(Excel.XlRangeValueDataType.xlRangeValueXMLSpreadsheet)
       .RowCount = Target.Rows.Count
       .ColumnCount = Target.Columns.Count
   End With 'XmlValueOf
End Property
'ペースト相当
Property Let XmlValueOf(ByVal Target As Range, pasteData As RangeXmlValue)
   Target.Resize(pasteData.RowCount, pasteData.ColumnCount) _
         .Value(Excel.XlRangeValueDataType.xlRangeValueXMLSpreadsheet) _
           = pasteData.XML
End Property
```
コピーした情報はモジュールに持たせたくないので、ユーザー定義型に入れて返す形とします。
コピーとペーストで表記を合わせるためにPropertyプロシージャを使っています。
以下のように使用します。
```vba
'その場でコピペ
XmlValueOf(ActiveCell.Offset(, 1)) = XmlValueOf(ActiveCell)
'コピーしてからペースト
Dim copyData As RangeXmlValue
copyData = XmlValueOf(ActiveCell)
XmlValueOf(ActiveCell.Offset(1)) = copyData
```

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る