【问题标题】:Select range and copy选择范围并复制
【发布时间】:2019-03-15 22:47:57
【问题描述】:

我正在尝试将数据从一个文件复制到另一个文件。每次下载源文件时范围都会发生变化。 我创建了一个宏以从一个工作簿复制到另一个工作簿,但无法正常工作。

Sub Copy_Method()

Dim lRow As Long
Dim lCol As Long

lRow = Workbooks("Active Dealers with State.xlsx").Worksheets("Active Dealers With State").Cells(Rows.Count, 1).End(xlUp).Row
lCol = Workbooks("Active Dealers with State.xlsx").Worksheets("Active Dealers With State").Cells(1, Columns.Count).End(xlToLeft).Column

Workbooks("Active Dealers with State.xlsx").Worksheets("Active Dealers With State").Range("A4", Cells(lRow, lCol).Select).Copy _
    Workbooks("Working Sheet.xlsx").Worksheets("Active Dealer with State").Range("A4")

End Sub

这里有什么问题?我想将 Active Dealers with State 工作簿中的全部数据复制到工作表文件中。

【问题讨论】:

标签: excel vba


【解决方案1】:

更多变量和更明确的范围/单元格引用应该会有所改善:

Sub Copy_Method()

    Dim lRow As Long
    Dim lCol As Long
    Dim wsSource as worksheet, wsDest as worksheet

    Set wsSource = Workbooks("Active Dealers with State.xlsx").Worksheets("Active Dealers With State")
    Set wsDest = Workbooks("Working Sheet.xlsx").Worksheets("Active Dealer with State")


    lRow = wsSource.Cells(Rows.Count, 1).End(xlUp).Row
    lCol = wsSource.Cells(1, Columns.Count).End(xlToLeft).Column

    'note qualified Cells reference below...
    With wsSource
        .Range(.Range("A4"), .Cells(lRow, lCol)).Copy wsDest.Range("A4")
    End With

End Sub

【讨论】:

  • 在哪一行?
  • 在上面查看我的编辑 - 错过删除额外的 Select
  • 仍然只是第一列,即仅复制 A 列
  • lCol 的值是多少?添加 Debug.Print lRow, lCol 并查看输出内容(在 VB 编辑器的即时窗格中) 在您的问题中,您指出标题位于第一行:如果不是这种情况,那么您需要进行更改...例如lCol = orgWS.Cells(3, Columns.Count).End(xlToLeft).Column
【解决方案2】:

我认为您不应该使用复制/粘贴,因为那样效率很低。您可以将值设置为彼此相等

Sub Copy_Method()
    Dim lRow As Long, lCol As Long
    Dim orgWS As Worksheet, newWS As Worksheet

    Set orgWS = Workbooks("Active Dealers with State.xlsx").Worksheets("Active Dealers With State")
    Set newWS = Workbooks("Working Sheet.xlsx").Worksheets("Active Dealer with State")

    lRow = orgWS.Cells(Rows.Count, 1).End(xlUp).Row
    lCol = orgWS.Cells(1, Columns.Count).End(xlToLeft).Column

    newWS.Range(newWS.Cells(4, 1), newWS.Cells(lRow, lCol)) = orgWS.Range(orgWS.Cells(4, 1), orgWS.Cells(lRow, lCol)).Value
End Sub

【讨论】:

  • 只是第一列被复制,有两列包含其中的值
  • 是第一行的值吗?代码为我遍历每一行和每一列。 lCol 查看第 1 行的最后一列。如果它在不同的行中,那么您只需将 1 更改为您想要的任何列。
  • > "使用复制粘贴与设置值相比效率非常低" - Not necessarily always true
  • 如果行号是动态的,你可以使用这个lCol = orgWS.UsedRange.Columns(orgWS.UsedRange.Columns.Count).Column
  • 内容从A3开始,但第三行是标题部分。因此,数据从 A4 开始,我有多个文件需要从中复制数据。一个文件有 4 列,一个有 10 列,另一个有 2 列。我在有 2 列的代码上尝试了此代码,但只复制了第一列数据(垂直)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-11
  • 1970-01-01
  • 2013-07-07
  • 2011-03-10
相关资源
最近更新 更多