VBA专题02:使用代码进行复制操作
学习Excel技术,关注微信公众号:
excelperfect
在Excel工作表中,复制粘贴是最常用的操作之一。在已经输入的数据中,找到并复制想要的数据,然后粘贴到指定的地方,是再自然不过的操作了。或者从工作表的一个单元格区域复制到同一工作表中另外的单元格区域,或者从工作表的一个单元格区域复制到另一工作表中的单元格区域,甚至从工作表的一个单元格区域复制到不同工作簿中的工作表单元格区域。那么,如何使用VBA代码来实现复制粘贴操作呢?本文将介绍常用的一些代码。
直接赋值
如下图1所示,使用代码:
Range("D1:E2").Value= Range("A1:B2").Value
将单元格区域A1:B2中的值直接复制到单元格D1:E2中。
图1
使用Copy方法
也可以使用Copy方法,将单元格区域A1:B2中的值复制到以单元格D1开头的单元格区域中:
Range("A1:B2").CopyRange("D1")
图2
使用数组
如下图3所示,将工作表Sheet4的列A中内容为“完美Excel”的行复制到工作表Sheet5中。
图3
可以使用下面的代码:
Sub CopyDataByArray()
Dim arr As Variant
Dim i As Long
Dim j As Long
Dim row As Long
row = 1
arr =Sheet4.Range("A1").CurrentRegion.Value
For i = LBound(arr) To UBound(arr)
If arr(i, 1) = "完美Excel" Then
For j = LBound(arr, 2) ToUBound(arr, 2)
Sheet5.Cells(row, j).Value =arr(i, j)
Next j
row = row + 1
End If
Next i
End Sub
代码中,将工作表Sheet4中的数据存储到数组中。然后,判断数组中第1维的值是否为“完美Excel”并复制到工作表Sheet5中。注意,数组变量必须声明为Variant型。
使用For循环
使用For循环,也可以实现上图3的结果。代码如下:
Sub CopyDataByFor()
Dim rng As Range
Dim i As Long
Dim j As Long
Dim row As Long
Set rng = Sheet4.Range("A1").CurrentRegion
row = 1
For i = 1 To rng.Rows.Count
If rng(i, 1).Value = "完美Excel" Then
For j = 1 To rng.Columns.Count
Sheet5.Cells(row, j).Value =rng(i, j).Value
Next j
row = row + 1
End If
Next i
End Sub
使用自动筛选
使用自动筛选,不必使用很多次循环,也能实现上图3所示的结果。代码如下:
Sub CopyDataByAutoFilter()
Dim rng As Range
Set rng = Sheet4.Range("A1").CurrentRegion
'删除已存在的筛选
rng.AutoFilter
'应用自动筛选
rng.AutoFilter Field:=1, Criteria1:="完美Excel"
'复制数据
Sheet4.Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible).Copy
Sheet5.Range("A1").PasteSpecialxlPasteValues
'删除筛选
rng.AutoFilter
End Sub
使用高级筛选
高级筛选能够直接将满足条件的数据复制到指定的位置,但需要先指定条件。如下图4所示,工作表Sheet10中的单元格区域A1:B7为数据区域,单元格区域D1:D2为筛选条件,需要筛选出名称为“完美Excel”的数据至工作表Sheet11中。
图4
代码如下:
Sub CopyDataByAdvancedFilter()
Dim wksData As Worksheet
Dim wksFilter As Worksheet
Dim rngData As Range
Dim rngCriteria As Range
Set wksData =ThisWorkbook.Worksheets("Sheet10")
Set wksFilter =ThisWorkbook.Worksheets("Sheet11")
'清空要放置复制数据的工作表
wksFilter.Cells.Clear
'删除已存在的筛选
If wksData.FilterMode = True Then
wksData.ShowAllData
End If
'获取数据区域
Set rngData =wksData.Range("A1").CurrentRegion
'条件区域
Set rngCriteria =wksData.Range("D1:D2")
'筛选并获取满足条件的数据
rngData.AdvancedFilterAction:=xlFilterCopy, _
CriteriaRange:=rngCriteria, _
CopyToRange:=wksFilter.Range("A1")
End Sub
运行代码后的结果如下图5所示。
图5
高级筛选还可以处理多个条件,对于同一行中的条件关系为“AND”,对于不同行中的条件关系为“OR”。
提示
1. 在使用VBA代码进行复制操作时,我们不需要先选择想要复制的数据,也不需要选择或激活数据所在的工作表。
2. 在不同的工作表之间复制,或者在不同的工作簿之间复制时,在前面加上相应的工作表或工作簿名称。
3. 在复制前关闭Excel的某些功能,可以加速复制操作。一般,在复制代码前,使用下面的代码关闭相关的功能:
Application.Calculation =xlCalculationManual
Application.DisplayStatusBar =False
Application.EnableEvents =False
Application.ScreenUpdating =False
在复制代码完成后,再恢复相关的功能:
Application.Calculation =xlCalculationAutomatic
Application.DisplayStatusBar =True
Application.EnableEvents = True
Application.ScreenUpdating =True