Excel VBA循环设置单元格内部颜色失效,批量上色出现色块问题
问题原因与解决方案
你的循环代码本身没问题,问题完全出在GetColour函数的逻辑错误,导致生成的颜色大量重复,出现同色色块:
- o的计算完全无效:你用
s = Int(NoteNum Mod 80)得到的s范围是0-79,再算o = Int(s / 80)时,s最大79,除以80小于1,Int后o永远是0。这意味着o*2、o*3始终是0,b和g的计算完全没用到分组变量,每80个NoteNum的颜色就会完全重复。 - 分组逻辑错误:你要处理1-1600的序列,应该把它分成20组(每组80个),o应该是每组的序号(0-19),而不是基于s的计算。正确的分组应该是
o = Int((NoteNum - 1) / 80),这样NoteNum1-80对应o=0,81-160对应o=1,直到1521-1600对应o=19。 - 运算符优先级冗余:
r = (s + 0 Mod 80) + 175里,Mod优先级高于+,所以0 Mod80结果是0,这行等价于r = s + 175,写法没必要这么复杂。
修正后的GetColour函数
Public Function GetColour(NoteNum As Long) As Variant Dim s As Integer Dim r As Integer Dim b As Integer Dim g As Integer Dim o As Integer ' 修正分组:o是0-19(对应1-1600的20组) o = Int((NoteNum - 1) / 80) ' s是每组内的序号0-79 s = (NoteNum - 1) Mod 80 r = s + 175 ' 简化冗余的Mod计算 b = ((s + 33 + o * 2) Mod 80) + 175 g = ((s + 66 + o * 3) Mod 80) + 175 GetColour = RGB(r, g, b) End Function
验证说明
修正后,每组80个的颜色会因为o的不同产生偏移,不会重复;同时每组内的s从0到79,保证颜色渐变。你的循环代码不需要修改,直接用修正后的函数就能得到预期的色彩范围。
内容的提问来源于stack exchange,提问作者MarkA
相关产品推荐
相关产品推荐

