将一个动态范围集合复制到另一个工作簿

时间:2018-01-25 08:04:12

标签: vba excel-vba excel

所以我有这个代码将打开几个csv工作簿(让我们称之为“源文件”)列在“RefData”表中,然后将其内容复制到目标文件。

我有这个代码工作,但我对它的编码方式并没有留下深刻的印象。我相信有更好的方法。

Private Sub OpenDL()

    Dim i As Integer

    Dim wrk As Workbook
    Dim this As Workbook
    lastrow = Sheets("RefData").Cells(Rows.Count, 1).End(xlUp).Row
    Set wrk = ThisWorkbook
    Sheets("RefData").Select

For i = 1 To lastrow

    'open workbook
    On Error Resume Next
    Sheets(Sheets("RefData").Cells(i, 1).Value).Select

    Workbooks.Open Filename:=Application.ActiveWorkbook.Path & "\" & "HistoricalPrices_" & Sheets("RefData").Cells(i, 1).Value & ".csv"

    'copy Date, Open, High, Low, Close & Volume
    Range("A1:" & Range("F1048576").End(xlUp).Address).Select
    Selection.Copy
    wrk.Activate
    Sheets(Sheets("RefData").Cells(i, 1).Value).Select
    Range("A1").Select
    ActiveSheet.Paste


    'close csv file
    Application.DisplayAlerts = False
    Workbooks("HistoricalPrices_" & Sheets("RefData").Cells(i, 1).Value & ".csv").Close
    Application.DisplayAlerts = True

Next i


End Sub

我编码的方式是这样的:

  1. 基于refdata列A中的列表,宏将打开源 文件。宏必须选择A1到F + lastrow。
  2. RefData表格的屏幕截图

    enter image description here

    1. 然后它将复制它。
    2. 接下来它将关闭源文件。
    3. 将其粘贴到目标文件的正确表单中。请注意 Refdata列中列出的每个项目都有自己的工作表。
    4. 宏结束。
    5. 我的问题是有一种简单的方法可以消除步骤2和3,它会手动选择范围然后复制它吗?

      我有一个想法,不确定它是否可行。它是这样的:

      sourcefile.sheets(sheets("refdata").cells(i,1).value).range("A1:F" & lastrow of the destination file).value **=** destinationfile.activesheets.range("A1:F" & lastrow of the destination file).value
      

      类似的东西:

      目标文件的值> Sheet(Refdata).cells(I,1)>范围(A1到F(x)等于源文件>活动表格>范围A1到F(x)的值

      其中x =源文件的最后一行?

      我不确定这是否可行。任何帮助表示赞赏

1 个答案:

答案 0 :(得分:1)

wsDest.Range("A1:" & Range("F1048576").End(xlUp).Address).value = wsOrgn.Range("A1:" & Range("F1048576").End(xlUp).Address).value

但是,您需要声明并设置wsDest(目标工作表)和wsOrgn(原始工作表)。你可以从:

开始
Dim wsDest As Worksheet, wsOrgn As Worksheet

并根据流程的流程设置Worksheet

'before you open the source, set the destination first
Set wsDest = wrk.Sheets(Sheets("RefData").Cells(i, 1).value)

'codes
'...

'once the source file opened and active on the sheet.
Set wsOrgn = ActiveSheet
'Transfer info from source to destination sheet
wsDest.Range("A1:" & Range("F1048576").End(xlUp).Address).value = wsOrgn.Range("A1:" & Range("F1048576").End(xlUp).Address).value
通过从原点获取最后一行并在RangewsDest上使用它,可以更准确地

wsOrgn

P.S。 LOL那些PSE股票。