从foreach传递的行范围为,ByRef参数类型不匹配



我通过另一种方式解决了问题(见末尾(。但我很好奇如何将行范围传递给潜艇。最初的问题。。。

在以下Excel 2007 VBA代码中,我发现ByRef参数类型不匹配。也许从范围的前臂提取的行本身不是一个范围?

Sub colorcells()
For Each bgr In Worksheets("1k sort").Range("AO2:AQ1001").Rows
colorrow bgr
Next bgr
For Each bgr In Worksheets("1k sort").Range("as2:au1001").Rows
colorrow bgr
Next bgr
For Each bgr In Worksheets("1k sort").Range("aw2:ay1001").Rows
colorrow bgr
Next bgr
End Sub
Sub colorrow(ByRef gbrrow As Range)
red = gbrrow.Cells(, 3).Value
blue = gbrrow.Cells(, 2).Value
green = gbrrow.Cells(, 1).Value
gbrrow.Interior.Color = RGB(red, green, blue)
red = (128 + red) Mod 256
blue = (128 + blue) Mod 256
green = (128 + green) Mod 256
gbrrow.Font.Color = RGB(red, green, blue)
End Sub

我正在使用excel电子表格为Kalles Fraktaler分形程序构建1000个条目调色板表。在对RGB值的每个位片进行排序后(顶部位,然后是第二位、第三位等(,我想通过对单元格背景进行着色来查看电子表格中的颜色。这使得文本无法阅读,所以我添加了代码,还将字体颜色设置为背景颜色的补色。不想在下一个循环中每个循环有8行相同的代码,我想我应该创建一个子程序。嗯…没那么简单。

作为测试,我删除了子调用,并将代码内联到三个for each循环中。例如

Sub colorcells()
For Each bgr In Worksheets("1k sort").Range("AO2:AQ1001").Rows
red = bgr.Cells(, 3).Value
blue = bgr.Cells(, 2).Value
green = bgr.Cells(, 1).Value
bgr.Interior.Color = RGB(red, green, blue)
red = (128 + red) Mod 256
blue = (128 + blue) Mod 256
green = (128 + green) Mod 256
bgr.Font.Color = RGB(red, green, blue)
Next bgr
For Each bgr In Worksheets("1k sort").Range("as2:au1001").Rows
red = bgr.Cells(, 3).Value
blue = bgr.Cells(, 2).Value
green = bgr.Cells(, 1).Value
bgr.Interior.Color = RGB(red, green, blue)
red = (128 + red) Mod 256
blue = (128 + blue) Mod 256
green = (128 + green) Mod 256
bgr.Font.Color = RGB(red, green, blue)
Next bgr
For Each bgr In Worksheets("1k sort").Range("aw2:ay1001").Rows
red = bgr.Cells(, 3).Value
blue = bgr.Cells(, 2).Value
green = bgr.Cells(, 1).Value
bgr.Interior.Color = RGB(red, green, blue)
red = (128 + red) Mod 256
blue = (128 + blue) Mod 256
green = (128 + green) Mod 256
bgr.Font.Color = RGB(red, green, blue)
Next bgr
End Sub

这产生了一些奇怪之处。范围的所有列以及介于两者之间的列都变宽了。我的clear colors子程序保留了范围底部的许多字体颜色。靶场的最后两排改为居中排列。我认为Excel可能没有做好设置3000字体颜色的准备。我暂时把字体涂掉。

因此,解决方案是通过整个范围,对于通过每行的每个循环,都是不必要的

Sub colorcells()
With Worksheets("1k sort")
colorrange .Range("AO2:AQ1001")
colorrange .Range("as2:au1001")
colorrange .Range("aw2:ay1001")
End With
End Sub
Sub colorrange(ByRef gbrrng As Range)
For Each gbr In gbrrng.Rows
red = gbr.Cells(, 3).Value
blue = gbr.Cells(, 2).Value
green = gbr.Cells(, 1).Value
gbr.Interior.Color = RGB(red, green, blue)
'    red = (128 + red) Mod 256
'    blue = (128 + blue) Mod 256
'    green = (128 + green) Mod 256
'    gbr.Font.Color = RGB(red, green, blue)
Next gbr
End Sub
Sub clearcolors()
With Worksheets("1k sort")
clearrangecolor .Range("AO2:AQ1001")
clearrangecolor .Range("as2:au1001")
clearrangecolor .Range("aw2:ay1001")
End With
End Sub
Sub clearrangecolor(ByRef gbrrng As Range)
gbrrng.Font.Color = xlcolorautomatic
gbrrng.Interior.ColorIndex = xlColorIndexNone
End Sub

只是取消注释并测试字体颜色。在大多数情况下,它仍然使最后两排山脉的大部分居中对齐。我会留下评论,重点是在我写Kalles fraktaler调色板文件之前,快速检查一下颜色排序是否没有导致一些可怕的条纹。我真的不需要读取rgb值,只需要查看颜色即可。

谢谢你的帮助,

Jeremy Thomson

colorrow()需要一个Range对象作为参数。默认情况下,bgr是Variant数据类型,因为您从未将其声明为Range。这会导致编译器引发ByRef类型不匹配错误。

Sub colorcells()
Dim bgr As Range
For Each bgr In Worksheets("1k sort").Range("AO2:AQ1001").Rows
colorrow bgr
Next bgr
For Each bgr In Worksheets("1k sort").Range("as2:au1001").Rows
colorrow bgr
Next bgr
For Each bgr In Worksheets("1k sort").Range("aw2:ay1001").Rows
colorrow bgr
Next bgr
End Sub
Sub colorrow(ByRef gbrrow As Range)
red = gbrrow.Cells(, 3).Value
blue = gbrrow.Cells(, 2).Value
green = gbrrow.Cells(, 1).Value
gbrrow.Interior.Color = RGB(red, green, blue)
red = (128 + red) Mod 256
blue = (128 + blue) Mod 256
green = (128 + green) Mod 256
gbrrow.Font.Color = RGB(red, green, blue)
End Sub

我不认为.rows返回一个范围引用,您可以在第一次调用之前查看locals窗口中的bgr,看看它是什么。无论如何,在使用它之前,您应该将其显式调暗为范围。

如果您要使用:

对于(ws(.范围(AO2:AO502(.单元格中的每个bgr

然后,您可以更改调用的例程以重新引用gbrow以获得其他值设置gbrow=gbrow.resize(1,3(

最新更新