【问题标题】:How to fix "Sub or Function not defined" when using HSL Function使用 HSL 函数时如何修复“未定义子或函数”
【发布时间】:2020-02-14 09:25:05
【问题描述】:

我正在尝试使用 HSL 而不是 RGB 设置某些单元格的内部颜色。

从微软的这份文档来看,它非常简单: https://docs.microsoft.com/en-us/office/client-developer/visio/hsl-function

语法很简单 HSL(** hue **, ** saturation **, ** luminosity ** )

那么,为什么我的 VBA 会告诉我子或函数未定义?

这两行代码都会出现同样的错误:

Range("A1").Interior.Color = HSL(160, 240, 120)

Range("A1").Interior.ColorIndex = HSL(160, 240, 120)

【问题讨论】:

  • 那是 Visio,不是 Excel。
  • This 可能有用。
  • 请改用RGB function。 Excel 中不存在 HSL。

标签: excel vba colors rgb hsl


【解决方案1】:

这是在 VBA 中转换 RGB → HSL 的另一种方法,使用 Windows API。由于它是“经典 Windows”功能,因此它有几个特点。

RGB 到 HSL 与 ColorRGBToHLS

ColorRGBToHLS 是一个 Windows API 函数,因此它使用了自 1980 年代以来一直沿用的过时颜色范围(最初用于名为 MS Chart 的早已不复存在的程序中)。您可能熟悉在百分比和 255 之外的值之间转换 R/G/B 值。

  • 但是在这种情况下,转换必须是到/来自values out of 240,而不是 255。
  • 为了让我们在未来更加困惑,他们使用了HLS 的符号,而不是更常见的HSL(十六进制颜色字符串是0xBBGGRR,而不是#RRGGBB)。

tl;博士

Option Explicit

Public Declare PtrSafe Sub ColorRGBToHLS Lib "shlwapi.dll" (ByVal clrRGB As Long, _
    wHue As Integer, wLuminance As Integer, wSaturation As Integer)

Function rgb_to_hsl(r As Integer, g As Integer, b As Integer)
  Dim h As Integer, s As Integer, l As Integer
  ColorRGBToHLS RGB(r, g, b), h, l, s
  h = 360 * (h / 239)
  s = 100 * (s / 240)
  l = 100 * (l / 240)
  rgb_to_hsl = "hsl(" & h & "," & s & "%," & l & "%)"
End Function

...还有一个demo:

Sub test()
  Debug.Print rgb_to_hsl(255, 180, 63)  'returns "hsl(36,100%,62%)"
End Sub

顺便说一句,API 也有一个ColorHLSToRGB 函数。

80 年代对于计算机书呆子来说是一个疯狂(经常令人困惑)的时代。有趣的事实:比尔盖茨嫁给了他雇用的第一位女程序员。

【讨论】:

    猜你喜欢
    • 2020-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-29
    • 1970-01-01
    • 1970-01-01
    • 2020-03-09
    • 1970-01-01
    相关资源
    最近更新 更多