在没有剪贴板

时间:2016-02-29 14:07:00

标签: excel vba excel-vba

我一直在努力优化我的一些编码,并设法削减和加速它。然而,有些东西仍然很笨重(我还是一个菜鸟)。背景故事是我的代码是打开源文件和目标文件,复制大量可变长度的数据,关闭源代码然后执行大量操作,最后保存目标文件。

我喜欢的其中一件事就是尽可能直接复制数据而不使用剪贴板,激活工作簿,选择工作表(无论如何都可以打包到我目前拥有的更高效的代码中)

Windows("SOURCE.xlsm").Activate
Sheets("Data").Select
Range("A2:AX10").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
Windows("TARGET.xlsm").Activate
Range("A2").Select
ActiveSheet.Paste
Application.CutCopyMode = False

是否可以在SOURCE文件数据表中进行选择(A2:AX10并一直到最后一行),并直接将其复制到TARGET文件 - 数据表单元格A2而不使用剪贴板。

我使用A2:AX10然后选择下来的原因是因为我在整个数据集中有很多空白单元格,这样我获得了整个数据。

我希望能够选择并将其用作此行中的范围

Workbooks(“SOURCE”).Worksheets("Data").Range(“A2:AX10 & ALLTHEWAYDOWN”).Copy _Workbooks(“TARGET”).Worksheets("Data").Range(“A2")

我试图解决这个问题,但我最终没有得到理想的结果。当我尝试选择并设置为范围然后尝试复制范围与活动工作簿和直接复制模式我得到1004错误。

是否可以优化此块并使其工作。它会改善我的很多VBA。

谢谢,

2 个答案:

答案 0 :(得分:1)

你需要这样的东西:

With Workbooks("SOURCE.xlsm").Sheets("Data")
    .Range("A2:AX10", .Range("A2:AX10").End(xlDown)).Copy Workbooks("TARGET.xlsm").ActiveSheet.Range("A2")
End With

您也可以使用CurrentRegion而不是End(xlDown

答案 1 :(得分:1)

您可以设置一个范围的值(您想要粘贴值的范围)等于源范围的值(您之前复制的范围)。

last_row = .Range("A" & .Rows.Count).End(xlUp).Row

此代码将新范围的值设置为等于原始范围。它可以防止激活工作表或工作簿,同时还可以将数据复制到范围而无需填充剪贴板。

我还建议您使用var ScopeMixin = { // init method is a special one which can initialize // the mixin when it's loaded to the tag and is not // accessible from the tag its mixed in init: function() { this.scope = this.getScope(); }, getScope: function() { var root = this while (root.parent) { root = root.parent } return root.opts.scope || root._riot_id } } 查找数据的最后一行。虽然您确实需要确保在已知包含连续数据的列上使用它。