首页 > 解决方案 > 从范围的 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 值,只需查看颜色即可。

感谢您的任何帮助,

杰里米汤姆森

标签: excelvba

解决方案


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

推荐阅读