【问题标题】:excel vba select multiple columns in a loopexcel vba循环选择多列
【发布时间】:2017-03-21 00:22:38
【问题描述】:

编辑:我只有 28,000 列,你们都说对了,它们不能全部放在一个工作表中。我只用部分数据测试我的代码,还没有意识到它并不适合

我有 28,000 列数据。我正在尝试复制特定的列 5,12,19,26...(即对于 i=1:4000,列号 = 7*(i-1) + 5)。我最初的想法如下,但问题是在循环的每次迭代之后,前一列被取消选择。所以下面的代码不会复制预期的数据。

For i = 1 To 4000
    DataSheet.Columns(7 * (i - 1) + 5).Select
Next i

Selection.Copy
ResultsSheet.Paste

我考虑过下面的替代方案(可行,但速度很慢),但我希望我可以编写一些执行速度更快的东西(部分问题是代码选择目标工作表并单独粘贴每一列,基本上翻了两番步骤数类似于第一个解决方案)。

For i = 1 To nSymbols
    DataSheet.Columns(7 * (i - 1) + 5).Copy
    ResultsSheet.Select
    Columns(i+1).Select        
    ActiveSheet.Paste
Next i

关于如何使这段代码运行(更快)的任何想法?

【问题讨论】:

  • 请提供您正在使用的 Excel 版本。我的 Excel 2016 每个工作表只有 16,384 列,而不是“32,000 列数据”或其他任何内容。

标签: excel vba for-loop multiple-columns execution-time


【解决方案1】:

使用 Union 并将您的 For ... Next 递增 7,每次递增。

dim c as long, rng as range

with worksheets("sheet1")
    set rng = intersect(.columns(5), .usedrange)
    for c = 12 to 4000 step 7
        set rng = UNION(rng,  intersect(.columns(c), .usedrange))
    next c
end with

debug.print rng.address(0, 0)
rng.copy destination:=ResultsSheet.cells(2, 1)

我添加了与 UsedRange 相交以减少完整的列引用。由于联合范围,此复制和粘贴会导致复制、选择性粘贴、值和格式。

【讨论】:

  • 我猜不是to 4000,而是7*(4000-1)+5 所以to 27998?
  • 是的,我刚刚在重读时发现了这一点。对于工会来说可能很大,但我现在正在检查。
  • @CallumDA - 我会等待 OP 进一步解释。我的 Excel 2016 每个工作表只有 16,384 列。
  • 我会试一试,然后告诉你结果如何
猜你喜欢
  • 2010-12-22
  • 2021-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-26
  • 2023-03-29
相关资源
最近更新 更多