Как исправить подпрограмму или функцию, не определенную при использовании функции HSL

Я пытаюсь установить внутренний цвет некоторых ячеек, используя HSL вместо RGB.

Судя по этой документации от Microsoft, это очень просто: https://docs.microsoft.com/en-us/office/client-developer/visio/hsl-function

Синтаксис просто HSL (** оттенок **, ** насыщенность **, ** яркость **)

Почему же тогда мой VBA говорит мне, что подпрограмма или функция не определены?

Одна и та же ошибка возникает для обеих этих строк кода:

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

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

person squidgeny    schedule 17.10.2019    source источник
comment
Это Visio, а не Excel.   -  person BigBen    schedule 17.10.2019
comment
Это может оказаться полезным.   -  person BigBen    schedule 17.10.2019


Ответы (1)


Вот альтернативный метод преобразования между RGB → HSL в VBA с использованием Windows API. Поскольку это классическая функция Windows, у нее есть несколько особенностей.

RGB в HSL с ColorRGBToHLS

ColorRGBToHLS — это функция Windows API, которая использует устаревший цветовой диапазон, который был перенесен с 1980-х годов (изначально использовался в давно несуществующей программе под названием MS Chart). Возможно, вы знакомы с преобразованием значений R/G/B между процентами и значениями из 255.

  • Однако в этом случае преобразование должно быть в/из значений из 240, а не 255.
  • Просто чтобы еще больше запутать нас здесь в будущем, они использовали обозначение HLS вместо более распространенного HSL (и шестнадцатеричные цветовые строки - 0xBBGGRR вместо #RRGGBB).

tl;dr

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-е были сумасшедшим (часто сбивающим с толку) временем для компьютерных фанатов. Забавный факт: Билл Гейтс женился на первой нанятой им женщине-программисте.

person ashleedawg    schedule 24.10.2020