首页 > 解决方案 > 使用 HSL 函数时如何修复“未定义子或函数”

问题描述

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

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

语法很简单 HSL(** 色调 **, ** 饱和度 **, ** 亮度 ** )

那么,为什么我的 VBA 会告诉我 sub 或 function 没有定义?

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

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

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

标签: excelvbacolorsrgbhsl

解决方案


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

RGB 转 HSLColorRGBToHLS

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

  • 但是,在这种情况下,转换必须是到/来自 的240,而不是 255。
  • 只是为了在未来进一步混淆我们,他们使用符号 ofHLS而不是更常见的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

...和一个演示

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

顺便说一句,API 也有一个ColorHLSToRGB功能。

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


推荐阅读