Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.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
Excel 如何循环VBA代码以运行每列值(20000个单元格),而不使其变慢_Excel_Vba_Loops_Range - Fatal编程技术网

Excel 如何循环VBA代码以运行每列值(20000个单元格),而不使其变慢

Excel 如何循环VBA代码以运行每列值(20000个单元格),而不使其变慢,excel,vba,loops,range,Excel,Vba,Loops,Range,我编写了一个VBA代码,其中有一个if-then语句,表示工作簿1中的特定单元格值是否等于工作簿2中的特定单元格值,工作簿2中同一行中的另一个单元格是否等于特定值,然后返回工作簿1特定范围中的单词True,否则返回False 例如,如果工作簿1列A2中的名称Apple存在于工作簿2列范围B中,并且如果在工作簿2中,列C中的“Type”=Fruit,则在工作簿1单元格H2:I2中返回True,否则返回False 我所要做的是让它在每个单元格中循环,就像我用当前代码尝试的那样,我的宏会冻结并说“没有

我编写了一个VBA代码,其中有一个if-then语句,表示工作簿1中的特定单元格值是否等于工作簿2中的特定单元格值,工作簿2中同一行中的另一个单元格是否等于特定值,然后返回工作簿1特定范围中的单词
True
,否则返回
False

例如,如果工作簿1列
A2
中的名称Apple存在于工作簿2列范围B中,并且如果在工作簿2中,列C中的
“Type”=Fruit
,则在工作簿1单元格
H2:I2
中返回True,否则返回
False

我所要做的是让它在每个单元格中循环,就像我用当前代码尝试的那样,我的宏会冻结并说“没有响应”。在工作簿1中,有20000多个可能的单元格,而在工作簿2中,有40000多个可能的单元格,所以我想知道这是否是原因

同样在
Sheet1.Range(“H2:I2”).Value=“True”
行中,我希望
(“H2:I2”)
始终更改,以便例如,如果我引用单元格E3,该范围必须更改为
H3:I3
E4
将更改为
H4:I4
,依此类推

有什么建议吗?谢谢

这是我的代码:

子工作表_Change()
暗淡的关键单元格作为范围
将表1调整为工作表
将图纸2调整为工作表
Dim单元格已更改为整数
Dim路径,文件为字符串
最后一排一样长
变暗最后一行1的长度
我想我会坚持多久
Set Sheet1=此工作簿。工作表(“数据”)编辑工作表文件1
设置关键单元格=范围(“E:E”)
Set Sheet2=工作簿(“Data.xlsx”)。工作表(“MyData”)“文件2的编辑表
LastRow=Sheet2.单元格(Rows.Count,“A”).结束(xlUp).行
Lastrow2=Sheet1.Cells(Rows.Count,“A”).End(xlUp).Row
对于i=1到最后一行
对于j=1到最后一行
如果Sheet1.Range(“E2”和j).Value=Sheet2.Range(“C”和i).Value,Sheet2.Range(“F”和i).Value=“LAX”,则
表1.范围(“H2:I2”).Value=“真”
其他:表1.范围(“H2:I2”).Value=“False”
退出
如果结束
下一个j
接下来我
端接头
**编辑 谢谢你关于制作数组的建议,但我以前从未制作过数组。在第一个工作簿1中执行循环后,如何将数组粘贴回工作簿1中?作为参考,我的工作簿1有12列20000多行。

VBA不使用。因此,您需要在构建
If
语句时牢记这一点。如果“外部”条件的计算结果更经常为False,因此跳到下一个循环迭代,而不是执行下一个比较,那么分解条件是值得的。例如,假设表2中F列的大多数值都是而不是“LAX”,可能值得尝试以下方法:

If Sheet2.Range("F" & i).Value = "LAX" Then
    If Sheet1.Range("E2" & j).Value = Sheet2.Range("C" & i).Value Then
        Sheet1.Range("H2:I2").Value = "True"
        ' [...]

在循环之前添加
Application.screenUpdate=false
,在循环之后添加
Application.screenUpdate=true
,然后使用数组,然后将数据放回工作表。将大大提高速度。为了加快速度,而不是每次命中都写入输出,您可以将所有这些读取到一个数组中,然后一次性写入此数组。特别是对于大量的操作,这确实减少了繁重的写操作。也不要声明没有使用的变量,例如:
keycell
如果
j=10
then
(“E2”&j)
=>E210。一定是这样吗?