Excel VBA用Copy方法進行復制粘貼,往往會導致粘貼的數據沒有了行高和列寬。那么,當我們要進行復制粘貼時,如何保證粘貼的數據保留原有的格式(包括行高列寬都不能變)。
筆者以一個模板設計為例進行說明。
模板表如圖1 所示。

圖1
根據模板表生成表格的效果如圖2所示。

圖2
使用Copy方法復制粘貼,代碼如下所示:
Sub Copy復制粘貼困惑()
Dim x As Integer
With Sheet2
'清空數據
.UsedRange.Clear
'恢復標准列寬
.Columns.ColumnWidth = .StandardWidth
'恢復標准行高
.Rows.RowHeight = .StandardHeight
End With
For x = 1 To 30 Step 15
'復制大標題區
Sheet1.Rows("3:4").Copy Sheet2.Rows(x)
'小標題區
'橫向復制1份/縱向復制4份---粘貼份數由擴展區域Resize(1, 12)決定
Sheet1.Range("B5:D5").Copy Sheet2.Cells(x + 2, "B").Resize(1, 12)
'正文區
'橫向復制5份/縱向復制4份---粘貼份數由擴展區域Resize(10, 12)決定
Sheet1.Range("B6:D7").Copy Sheet2.Cells(x + 3, "B").Resize(10, 12)
Next x
End Sub
運行代碼效果如圖3所示。

圖3
粘貼時為了保證行高和列寬一同被復制,可以先整行使用Copy方法進行復制粘貼,這樣就可以保證行高一同被復制;使用PasteSpecial方法選擇性粘貼,參數Paste設置為xlPasteColumnWidths即可保證列寬一同被復制,參數Paste設置為xlPasteFormats則只粘貼格式而不粘貼數據。
為了能一次性復制多份,粘貼區域的選擇很重要,粘貼區域的行數=樣本區域行數×橫向份數,粘貼區域的列數=樣本區域列數×縱向份數。比如示例中正文區樣本為2行3列,現需要橫向5份/縱向4份共20份粘貼正文區,則粘貼區域應為2行×5份=10行、3列×4份=12列,即10行12列的區域,所以示例粘貼區域為.Cells(x + 3, "B").Resize(10, 12)。如果粘貼區域設置不當將會出現不可意料的效果,請自行測試。
好了,按照上述方法將代碼修改成如下所示,運行后即可得到如圖2所示效果。
Sub 復制全部格式包括行高列寬()
Dim x As Integer
With Sheet2
'清空數據
.UsedRange.Clear
'恢復標准列寬
.Columns.ColumnWidth = .StandardWidth
'恢復標准行高
.Rows.RowHeight = .StandardHeight
End With
For x = 1 To 30 Step 15
'復制大標題區
Sheet1.Rows("3:4").Copy Sheet2.Rows(x)
'小標題區
'復制行高
Sheet1.Rows(5).Copy Sheet2.Rows(x + 2)
'縱向復制4份
Sheet1.Range("B5:D5").Copy Sheet2.Cells(x + 2, "B").Resize(1, 12)
'正文區
'橫向復制行高5份
Sheet1.Rows("6:7").Copy
Sheet2.Rows(x + 3 & ":" & x + 12).PasteSpecial xlPasteFormats '選擇性粘貼格式
'橫向復制5份/縱向復制4份
Sheet1.Range("B6:D7").Copy
With Sheet2.Cells(x + 3, "B").Resize(10, 12)
.PasteSpecial xlPasteFormats '選擇性粘貼格式
.PasteSpecial xlPasteColumnWidths '選擇性粘貼列寬
End With
Next x
End Sub