【问题标题】:New to VBA, struggling with RangesVBA 新手,在 Ranges 中苦苦挣扎
【发布时间】:2020-06-27 03:33:12
【问题描述】:

多年来,我使用多种语言/数据库进行了编程,但对 VBA 完全陌生。好的,实际上我已经深陷其中并且正在苦苦挣扎。

我正在尝试编写一些代码,这些代码将从工作表中的单元格中获取一些 RGB 值,并将另一个范围(多个区域)的单元格背景格式化为该颜色 - 作为奖励,将文本格式化为白色如果颜色很深。有多组价值观,影响不同的领域。许多单元格都有选择颜色的菜单,最终我希望在那里进行任何更改以自动触发相关单元格的格式设置。 如果您想知道,我们正在尝试从公司通讯允许使用的列表中选择一组颜色用于技术报告中。所以有一个网格,我们可以从侧面看到所有的组合,并弄清楚我们是否可以区分它们——完全视力的人,以及我们这些有颜色缺陷的人。显然,对于我们尝试的每个新组合,必须手动更改单元格颜色是正确的 PITA。

最终的计划将是调用几个外部例程之一来设置范围,或者传递一个变量以在 case 语句中使用。但我需要先搞定基本的工作。

这行得通:

DestColor = RGB(Range("d4"), Range("e4"), Range("f4"))
Sheets("Main").Range("$B$5:$P$5,$B$4,$I$2,$I$4,$I$6,$I$8,$I$10,$I$12,$I$14,$I$16,$I$18").Interior.Color = DestColor

这会给出“1004:Application-defined or object-defined error”

Set DestCells = Sheets("Main").Range("$B$5:$P$5,$B$4,$I$2,$I$4,$I$6,$I$8,$I$10,$I$12,$I$14,$I$16,$I$18")
DestColor = RGB(Range("d4"), Range("e4"), Range("f4"))
Sheets("Main").Range(DestCells).Interior.Color = DestColour

我有一种感觉,我只是没有掌握正确处理范围的语法。当我阅读内容时,我创建了一个名为 DestCells 的 Range 类型的对象,所以我应该能够在任何我使用“Range(...)”的地方使用它。 是我从根本上误解了某些东西,还是我在语法上遇到了根本错误?

最终我会希望有一个这样的潜艇:

Sub SetCells(DestCells As Range, ColorVals As Range)
  
  vRed = ColorVals.Columns(1)
  vGreen = ColorVals.Columns(2)
  vBlue = ColorVals.Columns(3)
' some more stuff to go in here ...
End Sub

但尝试将其称为(并简化测试范围):

SetCells(Sheets("Main").Range("$B$5:$P$5"), Sheets("Main").Range("d4:f4"))

给出“编译错误:预期 =”(我试过带括号和不带括号)

有人可以给我一些指示我在这里出错的地方吗?

【问题讨论】:

  • 谢谢 - 它看起来很有趣。不幸的是,我们的系统比鸭子的背部锁定得更紧,因此能够安装它的可能性为零:-(

标签: excel vba


【解决方案1】:

对于这部分:

Set DestCells = Sheets("Main").Range("$B$5:$P$5,$B$4,$I$2,$I$4,$I$6,$I$8,$I$10,$I$12,$I$14,$I$16,$I$18")
DestColor = RGB(Range("d4"), Range("e4"), Range("f4"))
Sheets("Main").Range(DestCells).Interior.Color = DestColour

这条线Sheets("Main").Range(DestCells).Interior.Color = DestColour DestCells 已经是一个范围,所以删除 .Range() 并且你已经引用了工作表,所以你不需要 Sheets("Main")

制作:

Set DestCells = Sheets("Main").Range("$B$5:$P$5,$B$4,$I$2,$I$4,$I$6,$I$8,$I$10,$I$12,$I$14,$I$16,$I$18")
DestColor = RGB(Range("d4"), Range("e4"), Range("f4"))
DestCells.Interior.Color = DestColour

对于这部分:

SetCells(Sheets("Main").Range("B5:P5"), Sheets("Main").Range("d4:f4"))

() on calls 让它认为你正在返回一些你想要的东西:

SetCells Sheets("Main").Range("B5:P5"), Sheets("Main").Range("d4:f4")

【讨论】:

  • 好吧,我现在有一些可以运行的东西,现在是时候充实一下了。我假设我也有这个错误“vRed = ColorVals.Columns(1)”,因为 vRed 在本地窗口中保持空白?
  • vRed = ColorVals.Cells(1).Value.
  • 好吧,它比这更基本一些 - 不知何故,那些单元格中的公式被删除了,我没有注意到。随着那些重新加入,ColorVals.Columns(1) 和 ColorVals.Cells(1).Value。我将使用对我来说看起来更清晰的后者。
【解决方案2】:
Sheets("Main").Range(DestCells).Interior.Color = DestColour

应该是

DestCells.Interior.Color = DestColour

其他几点说明:

  1. 设置范围后,您可以像上面一样直接引用它
  2. 您可以删除所有锁定的单元格引用 ($)。他们在降低可读性的同时对您的代码没有任何帮助
  3. 您同时使用了两种颜色拼写(不是问题,只是有趣)

【讨论】:

  • 当您需要时,手掌图标在哪里。颜色/颜色的东西对我来说有点像皮塔饼——对我来说,正确的拼写是颜色,所以在使用颜色的系统上工作很尴尬。现在我发现了阻止单元格更新的错误。单元格引用是从宏记录器中复制的,我会去掉 $,你说得对,它们模糊了可读性。
  • ??‍♂️ - @Simon56
【解决方案3】:

您可以通过读取单元格内部填充颜色索引(而不是颜色)并将其与深色颜色索引列表进行比较来应对字体颜色挑战。这里有一个函数和一些代码来测试......只需在运行测试子之前选择一个具有不同单元格颜色的区域:

Option Explicit
Sub fontColourTest()
    Dim cell As Range
    For Each cell In Selection
        cell.Font.Color = fontColour(cell.Interior.ColorIndex)
    Next cell
End Sub
Private Function fontColour(interiorColour As Integer)
    Dim darkIndexes As Variant
    Dim i As Integer
    darkIndexes = Array(1, 3, 5, 9, 10, 11, 12, 13, 14, 16, 18, 21, 23, 25, 26, 29, 30, 31, 32, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56)
    For i = 0 To UBound(darkIndexes)
        If interiorColour = darkIndexes(i) Then
            Exit For
        End If
    Next i
    If i > UBound(darkIndexes) Then
        'the interior colour was not found in the dark indexes - use black font:
        fontColour = 0
    Else
        'dark interior - use white font:
        fontColour = 16777215
    End If
End Function

可能有更复杂的方法。如果目标是黑色和白色,这很有效,但直接推断“相反”颜色会很方便。也许对 RGB 值进行一些简单的数学运算......

【讨论】:

  • 谢谢。这可能比我需要的要多 - 这种方法适用于任意 RGB 值,还是只适用于“标准”颜色?我只是要做一个近似的灰度级,然后是一个简单的“如果灰色>某个值,则使用黑色,否则使用白色”。对于这个应用程序来说应该足够好了。
【解决方案4】:

下面是获取单元格 RGB 细节的过程。

Sub GetRGBDetails()

Dim ColorToGet, NewColor As Double
 
'Get the color of a cell
ColorToGet = Range("A1").Interior.Color
 
'Get the decomposition of color
Red = ColorToGet And 255
Green = ColorToGet \ 256 And 255
Blue = ColorToGet \ 256 ^ 2 And 255
 
'Set the color on a new variable
NewColor = RGB(Red, Green, Blue)

End Sub

【讨论】:

  • 谢谢。是的,这是一段有用的代码,但我不想获取已经设置的颜色值 - 我有表格中的颜色值,只需将它们设置在一系列单元格中。
【解决方案5】:

谢谢大家 - 一个最友好和乐于助人的团体。 所有的贡献都是有用的,但来自@Warcupine 的贡献是理解我哪里出错的关键。整个事情现在已经建成——一旦我克服了那个障碍,我发现它相当容易。 再次感谢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多