Я использую Excel 2016 (тема Office: красочный), и, к сожалению, когда я пишу код с определенным пользователем текстом для отображения в строке состояния, строка состояния меняет цвет фона на темно-зеленый вместо того, чтобы оставаться в vbButtonFace (& H8000000F ). Результатом является нечитаемое текстовое сообщение в строке состояния, учитывая, что цвет шрифта остается темно-серым, как и ожидалось.
Я знаю, что это напрямую не может быть выполнено с помощью VBA (пожалуйста, не предлагайте мне менять Office тема ... это не вариант!)
Погуглил я нашел код, который использует функции API SendMessage
и GetSysColor
вызовы, которые я переставил следующим образом:
#If VBA7 Then
Public Declare PtrSafe Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As LongPtr, ByVal wMsg As Long, ByVal wParam As LongPtr, lParam As Any) As LongPtr
Public Declare PtrSafe Function GetSysColor Lib "user32" (ByVal nIndex As Long) As Long
#Else
Public Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Public Declare Function GetSysColor Lib "user32" (ByVal nIndex As Long) As Long
#End If
Private Const CCM_FIRST As Long = &H2000 'Common Control Messages
Private Const CCM_SETBKCOLOR As Long = (CCM_FIRST + 1)
Private Const PBM_SETBKCOLOR As Long = CCM_SETBKCOLOR 'Progress Bar Messages
Private Const COLOR_BTNFACE = &H8000000F
#If VBA7 Then
Public Sub SetStatusBackColour(hwndStatBar As LongPtr, ByVal clrref As Long)
Call SendMessage(hwndStatBar, PBM_SETBKCOLOR, 0&, ByVal clrref)
End Sub
#Else
Public Sub SetStatusBackColour(hwndStatBar As Long, ByVal clrref As Long)
Call SendMessage(hwndStatBar, PBM_SETBKCOLOR, 0&, ByVal clrref)
End Sub
#End If
Public Function EvalCol(ByVal inCol As Long) As Long ' Returns the RGB of a long colour value (System colour aware)
If ((inCol And &HFFFFFF00) = &H80000000) Then EvalCol = GetSysColor(inCol And &HFF) Else EvalCol = inCol
End Function
Private Sub Test()
Call SetStatusBackColour(StatusBar1.hwnd, EvalCol(vbButtonFace))
'Call SetStatusBackColour(StatusBar1.hwnd, COLOR_BTNFACE) 'without GetSysColor API function call
End Sub
Теперь проблема в том ... Как мне найти hwnd строки состояния Excel?
Очевидно, если этот подход больше не применяется или вместо него можно использовать другой подход, пожалуйста, сообщите мне без проблем! !!
Любая помощь приветствуется