こんにちは。KenKen_SP です。
VBA ならこんな感じで、それなりに実現できると思います。しかし、行/列の幅を書き
換えるわけですから、貼り付け先にはご注意を。
【使い方】
0. VBE の標準モジュールに下記ソースコードをコピペ
-->この方法が分からない場合は補足します
1. マクロ[SetShortcutKeys] を実行
2. セル範囲を [Ctrl]+[c] でコピー
3. 貼り付け先のセルを選択
4. [Ctrl]+[Shift]+[v] で貼り付け
-->通常通りの貼り付けは [Ctrl]+[v]のまま
【補 足】
マクロ[SetShortcutKeys]を実行することで設定したショートカットキーは、
マクロ[DestoryShortcutKeys]を実行することで、破棄できます。
'【以下ソースコード】
Option Explicit
' コピー元を参照するモジュールレベルのオブジェクト変数
Private mrngSource As Range
' ショートカットキー割り当て
Sub SetShortcutKeys()
With Application
.OnKey "^c", "CopyAllElements" '[Ctrl]+[c]
.OnKey "^+v", "PasteAllElements" '[Ctrl]+[Shift]+[v]
End With
End Sub
' ショートカットキー復元
Sub DestoryShortcutKeys()
With Application
.OnKey "^c" '[Ctrl]+[c]
.OnKey "^+v" '[Ctrl]+[Shift]+[v]
End With
End Sub
' コピー
Private Sub CopyAllElements()
On Error GoTo ERROR_HANDLER
Selection.Copy
If UCase$(TypeName(Selection)) = "RANGE" Then
Set mrngSource = Selection
Else
Set mrngSource = Nothing
End If
Exit Sub
ERROR_HANDLER:
MsgBox Err.Description, vbExclamation
Set mrngSource = Nothing
End Sub
' ペースト
Private Sub PasteAllElements()
Dim sngCellHeight() As Single
Dim lngRowsCount As Long
Dim i As Long
On Error GoTo ERROR_HANDLER
' 通常貼り付け
ActiveSheet.Paste
' モジュールレベル変数からコピー元を参照できたら以下の処理を行う
If Not mrngSource Is Nothing Then
' 行幅を取得
lngRowsCount = mrngSource.Rows.Count
ReDim sngCellHeight(lngRowsCount - 1)
For i = 0 To lngRowsCount - 1
sngCellHeight(i) = mrngSource.Cells(i + 1, 1).RowHeight
Next i
Application.ScreenUpdating = False
' 行/列幅の調整
With Selection.Cells(1, 1)
' 列幅
.PasteSpecial Paste:=xlPasteColumnWidths
' 行幅
For i = 0 To lngRowsCount - 1
.Offset(i).RowHeight = sngCellHeight(i)
Next i
End With
End If
Exit Sub
ERROR_HANDLER:
If Err.Number <> 1004 Then
MsgBox Err.Description, vbExclamation
End If
End Sub
お礼
ありがとうございました。 できました。