多谢Long_III,最近用字典较少,主要是认为DICTIONARY作为一种对象,与数组相比,还是要慢些。我的代码中调用COUNTIF函数也很不明智。
突然想起用一个byte数组标记可能要快些,试试:
Private Sub CommandButton2_Click() '
Application.ScreenUpdating = False
Dim r As Range, diff As Long, n As Byte, i As Byte, j As Byte, k As Long, cc As Long, nums As Long, befit As Boolean, result() As String
Dim b() As Byte, aa
aa = Timer
Rows("20:65536").Delete
ReDim b(1 To 2 * [dj1])
Set r = [a1:dj1]
For j = 1 To [dj1].Column
b((r(1, j))) = 1
Next
For n = 3 To 20 '循环?等差
cc = n * (n + 3) / 2 - 9
diff = (Val(r(1, r.Cells.Count)) - Val(r(1, 1))) / (n - 1) '最大可能差额
nums = 1 '初始化计数变量
ReDim result(1 To n + 1, 1 To nums) '初始化数组
For i = 4 To diff '循环差额
For j = 1 To r.Cells.Count - n '循环整个范围
befit = True
For k = 0 To n - 1
If b(r(1, j) + k * i) = 0 Then befit = False: Exit For
Next
If befit = True Then
If b(r(1, j) + (n + 1) * i) = 0 Then
nums = nums + 1
ReDim Preserve result(1 To n + 1, 1 To nums)
For k = 0 To n '添一行n等差数列
result(k + 1, nums) = r(1, j) + k * i
Next
End If
End If
Next
Next
If nums > 1 Then
result(1, 1) = WorksheetFunction.Text(n, "[dbnum1]") & "等差序列" '列头
[a20].Offset(, cc).Resize(nums, n + 1) = WorksheetFunction.Transpose(result) '定位赋值
[a20].Offset(1, cc).Resize(nums, n).Font.Color = vbRed '前面的列设成红色字体
[a20].Offset(1, n + cc).Resize(nums, 1).Font.Color = vbBlue '最后一列设成蓝色字体
End If
Next
Application.ScreenUpdating = True
MsgBox "ok! timer:= " & Format(Timer - aa, "0.00")
End Sub