本帖最后由 liu-aguang 于 2014-11-24 10:15 编辑
ak47ok 发表于 2014-11-23 11:29
感谢老师的指导
通过试验,用上述代码我的电脑能同时运算40列、22万行的数据,效果还是比之前循环的速度 ... - Sub Macro1() '右区域数据行数必须在8行以上,否则会出错.
- Dim arr, ar1, ar2, n&, z%, i&, j%, sumR&, m%, k%
- Sheets(1).Activate
- Range("b1").CurrentRegion.Offset(2).ClearContents '清除左区域第3行以下数据
- ar1 = Range(Range("b1"), Range("as1").End(xlToLeft)) '左区域第1行B1单元格开始赋值给数组ar1
- ar2 = Range(Range("aw1"), Range("iv1").End(xlToLeft)) '右区域第1行AW1单元格开始赋值给数组ar2
- sumR = Range("au1").CurrentRegion.Rows.Count - 2 '右区域除了1-2行的数据区域行总数
- n = Int(sumR / 4): m = sumR Mod 4 '右区域数据分为4段处理,每段有n行,余数为m行.
- For z = 0 To 3 '循环四次,每次处理n行数据
- k = IIf(z = 3, m + n, n) '当循环到第四次时(最后一次),最后要处理行数为m+n行
- arr = Range("aw3").Offset(z * n).Resize(k, UBound(ar2, 2)) '每次要处理的数据赋值给数组arr,注意是从AW3单元格开始的.
- For i = 1 To UBound(arr) '该双循环是对数组arr处理,与原来的处理方式一样.
- For j = 1 To UBound(arr, 2)
- If InStr(ar2(1, j), "反") = 0 Then
- arr(i, j) = IIf(arr(i, j) > ar1(1, j), 1, 0)
- Else
- arr(i, j) = IIf(arr(i, j) < ar1(1, j), 1, 0)
- End If
- Next
- Next
- Range("b" & Rows.Count).End(xlUp).Offset(1).Resize(UBound(arr), UBound(arr, 2)) = arr '分别把每次处理后的结果写入左区域.
- Next
- End Sub
复制代码 |