【问题标题】:Using an Array with table and loop使用带有表和循环的数组
【发布时间】:2018-03-15 11:46:15
【问题描述】:

很抱歉,如果已经有人问过这类问题,我找不到所需的答案,而且我对 VBA 还是很陌生。

我正在尝试通过在两个工作簿之间移动的索引匹配将一个表中的一些值匹配到另一个表。为了正确地做到这一点,我使用了两个循环 For To。但是当涉及到几千行时,我的代码真的很慢。我可以用数组或其他东西改进它吗?

Dim mainWB  As Workbook
Dim mainWS  As Worksheet
Set mainWB = ActiveWorkbook
Set mainWS = mainWB.Sheets(1)

Dim RowsToProcess As Long
RowsToProcess = mainWS.Range("C" & Rows.Count).End(xlUp).Row

Dim lastCol As Long
lastCol = mainWS.Cells(10, Columns.Count).End(xlToLeft).Column

Range(Cells(11, 8), Cells(RowsToProcess, lastCol)).Select
Selection.NumberFormat = "General"

For i = 1 To lastCol
    For a = 1 To RowsToProcess
        If Workbooks("template.xls").Sheets("#").Cells(10 + a, 7 + i).Value <> vbNullString Then
            Cells(10 + a, 7 + i).Select
            ActiveCell.FormulaR1C1 = _
                "= "Long Formula" "
        End If
    Next
Next

对于我的长公式。它基本上是在做 2 Index(Match. between this Workbook and 2 others,但我想我会把它拿出来让它更清楚

非常感谢您的帮助!

【问题讨论】:

  • 第一件事是你应该摆脱.Select 这是一个非常糟糕的做法,总是会减慢你的代码。有很多教程如何避免使用.Select。另请查看Application.ScreenUpdating Property (Excel),并考虑在代码开头切换到手动计算模式,最后切换回自动,请参见Application.Calculation Property (Excel)
  • 避免。选择例如Cells(10 + a, 7 + i).Select ActiveCell.FormulaR1C1 可以写成 Cells(10 + a, 7 + i).FormulaR1C1。此外,在处理对象时使用 With 语句,例如ozgrid.com/VBA/SpeedingUpVBACode.htm
  • 没有 .select 我从 166 处理时间下降到 41 秒,然后是手动计算的 26 秒谢谢!

标签: arrays vba excel for-loop


【解决方案1】:

如果您正在有效地定义一个范围,您可以使用第一列和最后一列和行地址并创建一个范围对象。 在此处查看示例:Dynamic ranges

然后你可以这样做: Range(myRange).SpecialCells(xlCellTypeBlanks).FormulaR1C1 = "LongFormula" 它可以有效地用您的公式替换所有空白单元格,而无需执行所有循环。

将这些步骤与 cmets 中提到的项目结合起来,例如避免 .select。

总结:

避免使用 .select

在处理对象时尽可能使用 WITH

获取第一个单元格地址和最后一个单元格地址并创建您的范围对象

使用特殊单元格方法将此范围内的空白设置为您的公式。

【讨论】:

  • 这已经帮了很多忙,但是 .SpecialCells(xlCellTypeBlanks) 对我没有用,因为工作表受到保护。并且使用 Range(myRange).FormulaR1C1 = ... 没有 SpecialCells 最终比我的 2 个循环还要慢。我是不是做错了什么?
  • 您使用 .SpecialCells 方法收到什么错误消息?
  • 运行时错误 1004:您不能在受保护的工作表上使用此命令。 [...]
  • 1) 你知道工作表的密码吗? 2)你想用长公式实现什么?您可以提供示例输入和预期输出吗?
  • 不,我没有密码。该公式是从另一张纸(索引匹配匹配)中获取某些内容,然后通过第三张纸(索引匹配匹配)将其翻译,以防第一个单词是一个单词。
猜你喜欢
  • 2015-06-01
  • 2022-01-04
  • 2017-05-12
  • 1970-01-01
  • 2022-01-18
  • 2017-03-04
  • 2016-08-06
  • 2017-07-16
  • 1970-01-01
相关资源
最近更新 更多