excel - 从范围的 foreach 传递行,ByRef 参数类型不匹配
问题描述
我通过另一种方式解决了我的问题(见最后)。但我很好奇如何将行范围传递给子。原来的问题...
我在以下 Excel 2007 VBA 代码中得到 ByRef 参数类型不匹配。也许从范围的 foreach 中提取的行本身不是范围?
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 值的每个位切片(最高位然后是 2nd 、 3rd 等)进行排序后,我想通过为单元格背景着色来查看电子表格中的颜色。这使得文本不可读,所以我添加了代码以将字体颜色设置为背景颜色的补色。不想在每个 for next 循环中有 8 行相同的代码,我想我会创建一个子例程。嗯……没那么简单。
作为测试,我删除了 sub 调用并将代码内联到每个循环的三个中。例如。
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
这就产生了一些诡异。范围的所有列以及介于两者之间的列都变宽了。我的清除颜色子程序在范围的底部留下了许多未触及的字体颜色。范围的最后两行将它们的对齐方式更改为居中。我认为也许尝试设置 3000 种字体颜色是 Excel 没有准备好的。我暂时不考虑字体着色。
所以解决方法是传递整个范围,传递每一行的 for each 循环是不必要的
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 值,只需查看颜色即可。
感谢您的任何帮助,
杰里米汤姆森
解决方案
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
推荐阅读
- reactjs - 如何为反应应用程序提供间隔
- html - 如何选择目录来保存输出?
- android - 观察者没有被触发
- swift - Firebase - 在从缓存发送到服务器之前更改数据
- math - 如何暴力破解有损和例程?
- c++ - 如果我在 std::remove 函数中直接传递数组元素 ar[0] 而不是 x,为什么会得到不同的结果?
- c++ - shared_ptr 到派生类
- ajax - 如何在 CakePHP 中的每个 ajax 调用之前动态添加 Csfr 令牌
- cassandra - Cassandra 集群中的突然负载峰值
- python - 收到错误“消息:过时的元素引用:元素未附加到页面文档”。我做错了什么