Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 使用带有表和循环的数组_Arrays_Vba_Excel_For Loop - Fatal编程技术网

Arrays 使用带有表和循环的数组

Arrays 使用带有表和循环的数组,arrays,vba,excel,for-loop,Arrays,Vba,Excel,For Loop,我很抱歉,如果已经有人问过这类问题,我找不到我需要的答案,而且我对VBA很陌生 我试图通过在两个工作簿之间移动的索引匹配,将一些值从一个表匹配到另一个表。为了正确地执行此操作,我使用了两个循环。但是当我的代码只有几千行时,它的速度非常慢。我可以用数组或其他东西来改进它吗 Dim mainWB As Workbook Dim mainWS As Worksheet Set mainWB = ActiveWorkbook Set mainWS = mainWB.Sheets(1) Dim Ro

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

我试图通过在两个工作簿之间移动的索引匹配,将一些值从一个表匹配到另一个表。为了正确地执行此操作,我使用了两个循环。但是当我的代码只有几千行时,它的速度非常慢。我可以用数组或其他东西来改进它吗

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个IndexMatch。在这本手册和另外两本手册之间,但我想我会把它拿出来让它更清晰


非常感谢你的帮助

如果要有效地定义范围,可以使用第一列和最后一列以及行地址并创建范围对象。 请参见此处的示例:

然后,您可以执行以下操作: RangemyRange.SpecialCellsxlCellTypeBlanks.FormulaR1C1=LongFormula 它可以有效地用公式替换所有空白单元格,而无需执行所有循环

将这些步骤与注释中提到的项目结合起来,例如避免。选择

总结:

避免使用。选择

在处理对象时尽可能与一起使用

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


使用“特殊单元格”方法在公式中设置此范围内的空格。

第一件事是您应该删除。选择“这是一种非常糟糕的做法,并且总是会降低代码的速度。”。有许多教程介绍如何避免使用。选择。也请考虑并考虑在您的代码开始切换到手动计算模式,最后切换到自动,参见避免。选择例如CysS10+A,7 +I.选择ActueCel.Frimule1C1可以编写为CysS10+A,7 + I.公式1C1。另外,在处理对象时使用With语句,例如不使用。select I从166处理时间下降到41秒,然后是26秒,使用手动计算,谢谢!这已经起到了很大的作用,但是.SpecialCellsxlCellTypeBlanks对我来说不起作用,因为工作表是受保护的。并使用RangemyRange.FormulaR1C1=。。。如果没有特殊的电池,结果比我的两个循环还要慢。我做错了什么吗?使用.SpecialCells方法得到了什么错误消息?运行时错误1004:您不能在受保护的工作表上使用此命令。[…]1你知道这张表的密码吗?2你想用长公式达到什么目的?您是否可以提供示例输入和预期输出?不,我没有密码。公式是从另一个表索引匹配中获取某些内容,然后在第一个单词是单词的情况下,将其转换为第三个表索引匹配。