2017-07-03 168 views
2

我把一些简单的东西拼凑在一起,看看会发生什么,当然我打破了excel。随机颜色随着细胞的变化而变化Interior.Color

Sub colourChange() 

    Dim r As Byte, g As Byte, b As Byte 

    On Error Resume Next 

    For l = 0 To 50 
     For j = 1 To 22 
      For k = 1 To 66 
       r = WorksheetFunction.RandBetween(0, 255) 
       g = WorksheetFunction.RandBetween(0, 255) 
       b = WorksheetFunction.RandBetween(0, 255) 
       Cells(j, k).Interior.Color = RGB(r, g, b) 
      Next k 
     Next j 
     Application.Wait Now + #12:00:03 AM# 
    Next l 

End Sub 

它开始很好,然后众生放缓至几乎瘫痪,最终甚至产生太多不同的单元格的格式错误。

有没有什么办法可以加快速度并阻止错误?我查了一下,excel应该支持4000种不同的单元格格式,我不应该击中一半!它记住以前的东西吗?这里发生了什么?

+0

不知道。这不记得以前的格式。在空白工作簿(Excel 2016)上运行此功能可以很好地处理内存使用情况。没有错误或任何东西。 –

+0

你为什么要用'Wait'? – Wolfie

+0

删除'wait'并重新运行 –

回答

1

它很适合我。请注意您正在使用Wait函数,这会导致每个“帧”延迟3秒)。加速它的方法是将延迟从3秒减少到1秒:)

但是,因为随机数发生器是基于系统时间的,并且如果我们减少延迟,它会变少。

您也可以使用函数Rnd()并将其乘以256而不是使用工作表函数。但我不确定,它会显着影响执行的持续时间。

+1

Rnd()* 256的确会执行得更快(因为你不必每次都访问'WorksheetFunction'对象),尽管它可以忽略不计。 –

+0

这就是我的想法。感谢您的澄清。 –

0

我认为l = 0到50不需要。 而Application.ScreenUpdating =假设置帮助练习更快。 我猜Excel的内部颜色总数有限制。

Sub colourChange() 

    Dim r As Byte, g As Byte, b As Byte 
    Dim vR(), n As Integer 
    'Cells.Clear 
    n = 3000 
    ReDim vR(1 To n) 
    For i = 1 To n 
     r = WorksheetFunction.RandBetween(0, 255) 
     g = WorksheetFunction.RandBetween(0, 255) 
     b = WorksheetFunction.RandBetween(0, 255) 
     vR(i) = RGB(r, g, b) 
    Next i 
    Application.ScreenUpdating = False 
     For j = 1 To 500 
      For k = 1 To 100 
       Cells(j, k).Interior.Color = vR(WorksheetFunction.RandBetween(1, n)) 

      Next k 
     Next j 
    Application.ScreenUpdating = True 
End Sub 

其他方式,先练子的getColor()(仅第一次),然后 实践colourchang()。

Public vR() 
Public n As Integer 
Sub getColor() 
    Dim r As Byte, g As Byte, b As Byte 
    Dim i As Integer 
    'Cells.Clear 
    n = 3000 
    ReDim vR(1 To n) 
    For i = 1 To n 
     r = WorksheetFunction.RandBetween(0, 255) 
     g = WorksheetFunction.RandBetween(0, 255) 
     b = WorksheetFunction.RandBetween(0, 255) 
     vR(i) = RGB(r, g, b) 
    Next i 

End Sub 
Sub colourChange() 
    Dim j As Integer, k As Integer, m As Integer 
    Application.ScreenUpdating = False 
     For j = 1 To 500 
      For k = 1 To 100 
       m = WorksheetFunction.RandBetween(1, n) 
       Cells(j, k).Interior.Color = vR(m) 
      Next k 
     Next j 
    Application.ScreenUpdating = True 
End Sub 
+0

这似乎工作还不错!但之后,我跑了好几次,但它仍然会产生同样的错误: 运行时错误“1004”:太多不同的单元格格式。 – HotSauceCoconuts

+0

单元格格式有限制。请将n改为500或小于500.但我不知道具体的限制。 –

+0

嗯现在我得到一个新的错误,它陷入了这样的: 'Cells(j,k).Interior.Color = vR(WorksheetFunction.RandBetween(1,n))' 错误是... '运行时错误1004:无法获得Range类的内部属性' 我怀疑它是相同的东西 – HotSauceCoconuts