lansnode 发表于 2018-3-22 14:07 
如果要运行速度提升要用数组运算替换掉单元格运算
出结果后再复制到单元格上
我查了数组运算的原理,大概明白了思路,不过一时想不到我的问题能把哪个部分作为数组,能稍微帮我看一下吗?下面是新的代码,虽然能够解决问题,但是做完整个计算要几十个小时,还是觉得必须优化。
Sub dummyvariables()
Dim i, j, n, a, b, c
For j = 2 To 6519 '列数
For n = 2 To 446 'dummy variable的行
a = 0 'rank单元格1的个数,前80
b = 0 'rank单元格-1的个数,末80
c = 0 'rank单元格0的个数,中间
For i = (n - 2) * 20 + 2 To (n - 1) * 23 'rank的行
If Not IsEmpty(Worksheets("rank").Cells(i, j).Value) And Month(Worksheets("rank").Cells(i, 1)) = Month(Worksheets("winners").Cells(n, 1)) And Year(Worksheets("rank").Cells(i, 1)) = Year(Worksheets("winners").Cells(n, 1)) Then
'先判断rank的单元格不为空,然后判断rank单元格的年月和winners相同
If Worksheets("rank").Cells(i, j).Value = 1 Then
a = a + 1
ElseIf Worksheets("rank").Cells(i, j).Value = -1 Then
b = b + 1
ElseIf Worksheets("rank").Cells(i, j).Value = 0 Then
c = c + 1
End If
End If
Next i
If a > 0 And b = 0 Then
Worksheets("winners").Cells(n, j).Value = 1
Worksheets("losers").Cells(n, j).Value = 0
Worksheets("both").Cells(n, j).Value = 0
Worksheets("never").Cells(n, j).Value = 0
ElseIf a = 0 And b > 0 Then
Worksheets("losers").Cells(n, j).Value = 1
Worksheets("winners").Cells(n, j).Value = 0
Worksheets("both").Cells(n, j).Value = 0
Worksheets("never").Cells(n, j).Value = 0
ElseIf a > 0 And b > 0 Then
Worksheets("both").Cells(n, j).Value = 1
Worksheets("winners").Cells(n, j).Value = 0
Worksheets("losers").Cells(n, j).Value = 0
Worksheets("never").Cells(n, j).Value = 0
ElseIf a = 0 And b = 0 And c > 0 Then
Worksheets("never").Cells(n, j).Value = 1
Worksheets("winners").Cells(n, j).Value = 0
Worksheets("losers").Cells(n, j).Value = 0
Worksheets("both").Cells(n, j).Value = 0
End If
Next n
Next j
End Sub