excel 复制已使用范围的更有效/更优雅的方式

w51jfk4q  于 2022-12-05  发布在  其他
关注(0)|答案(2)|浏览(130)

我试图将某些列从一个工作表复制到另一个工作表(大约15)。
我目前的方法不太理想(我认为)。

Sheets(2).Range("A:A").Value = Sheets(1).Range("C:C").Value
Sheets(2).Range("C:C").Value = Sheets(1).Range("G:G").Value
Sheets(2).Range("D:D").Value = Sheets(1).Range("T:T").Value

它看起来是重复的,更重要的是,它复制了整个列,这会由于加载空行直到工作表的末尾而减慢进程。
我试图找出最好的方法来复制列 * 只是 * 到最后使用的列。
这是我目前的想法,但是第二个工作表中的空单元格被填充了 not available 错误值,这违背了目的。

lastRow = Sheets(1).Range("C" & Sheets(1).Rows.Count).End(xlUp).Row

Sheets(2).Range("A:A").Value = Sheets(1).Range("C1:C" & lastRow).Value

有什么我可能不知道的功能吗?谢谢!
(And是的,这必须在VBA中完成。请询问我的老板😃。)

yquaqz18

yquaqz181#

由于源范围较小,因此必须调整目标范围的大小。

Sub copyData()

Dim arrColumns(1, 2) As String
'mapping source column : target column
arrColumns(0, 0) = "C": arrColumns(1, 0) = "A"
arrColumns(0, 1) = "G": arrColumns(1, 1) = "C"
arrColumns(0, 2) = "I": arrColumns(1, 2) = "D"

With ThisWorkbook
    Dim wsSource As Worksheet: Set wsSource = .Worksheets(1)
    Dim wsTarget As Worksheet: Set wsTarget = .Worksheets(2)
End With

Dim lastRow As Long
With wsSource
    lastRow = .Range("C" & .Rows.Count).End(xlUp).Row
End With

'now we can do the copying
Dim i As Long
For i = 0 To UBound(arrColumns, 2)
    wsTarget.Columns(arrColumns(1, i)).Resize(lastRow).Value = wsSource.Columns(arrColumns(0, i)).Resize(lastRow).Value
Next

End Sub

此外,我喜欢在这样一个sub的开头有Map数组。如果你的老板想复制另一列-或复制一个到另一个目标列,这是更容易处理。

pcww981p

pcww981p2#

简单地说,也许这对你有用:

Sub test()
Dim i As Long
Dim SourceArray As Variant
Dim DestinyArray As Variant
Dim lastRow As Long

'all ranges must be same size to work so all of them will use same lastRow

SourceArray = Array("A1:A", "C1:C", "D1:D")
DestinyArray = Array("C1:C", "G1:G", "T1:T")

lastRow = Sheets(1).Range("C" & Sheets(1).Rows.Count).End(xlUp).Row

For i = LBound(SourceArray) To UBound(SourceArray) Step 1
    Sheets(2).Range(DestinyArray(i) & lastRow).Value = Sheets(1).Range(SourceArray(i) & lastRow).Value
Next i

Erase SourceArray
Erase DestinyArray

End Sub

如果你需要复制更多的列,很容易更新,但是记住,这个代码将总是复制相同数量的单元格,所以如果你复制不同大小的范围,那么它将不起作用。

相关问题