VBA+HTML构建的一款兼容性强的颜色选择窗体
{"作者":"Antoniothefuture"
"关键词":["VBA","HTML","窗体","颜色"]
"开发平台":"不限"
"开发语言":"VBA、HTML"
"简介": "使用VBA+HTML构建一款兼容性强的颜色选择窗体"
}
要在VBA环境中实现颜色选择功能,网上的一般方法是调用Excel自带的颜色选择器:
Sub Color()
Dim oDialog As Dialog
Set oDialog = Excel.Application.Dialogs(xlDialogEditColor)
oDialog.Show (1)
End Sub
但是这种方法局限于在Excel中调用,在其他程序中比较麻烦,而且会带来兼容性问题,后来,笔者想到了使用 Listview 生成带背景色的颜色选项,自己制作的颜色选择窗体:
Sub LoadColorPad()
With Me.L_Colors
For B = to 5
For G = 0 to 5
For R = 0 to 5
Set Li = .ListItems.Add
Li.Text = "■"
Li.ForeColor = R * 51 + 256 * G * 51 + 65536 * B * 51
Next
Next
Next
end with
End Sub
Sub L_ColorsItemClick(ByVal Item As MSComctlLib.ListItem)
PColor = Item.ForeColor
End Sub
显而易见,这种方法也会带来兼容性问题,而且到了64位的Office版本,ListView控件就完全不能用了,所以就必须找到更好的方法。
因为笔者对HTML以及浏览器的原理有一定的了解,所以我想到了使用WebBrowser控件的方案:
和上面的ListView一样,在窗体加载时,循环将颜色值转为HTML可点击的对象,设置 #链接,加载到WebBrowser。然后将WebBrowser的跳转URL事件捕获下来,获取所点击的链接,处理后即可得到颜色值:
Dim PColor
Dim R
Dim G
Dim B
Sub RGBEdito
'每个控件对应每个颜色分值
R = ResetColor(Me.T_RText)
G = ResetColor(Me.T_GText)
B = ResetColor(Me.T_BText)
PColor = R + 256 * G + 65536 * B
Refresh Color
End Sub
Private Sub UserForm_Initialize
Me.WebBrowser1.navigate "about:blank"
ReloadWeb
End Sub
Sub ReloadWeb
Dim HeadStr As String
Dim LineStr As String
Dim TailStr As String
Dim BodyStr As String
Dim ColorV
HeadStr = "<html><head><style type = 'text/css'> a{width: 14px; height: 14px; margin: 2px; display: block; float: left} </style></head><body><div style = 'width: 100%;'>"
TailStr = "</div></body></html>"
BodyStr = HeadStr
For B = 0 To 5
For G = 0 To 5
For R = 0 To 5
ColorV = R * 51 & "," & G * 51 & "," & B * 51
LineStr = "<a href= '#' & ColorV & "'style = 'background-color:RGB(" & ColorV & ")'></a>"
BodyStr = BodyStr & LineStr
Next
Next
Next
BodyStr = BodyStr & TailStr
Me.WebBrowser1.document.Write BodyStr
End Sub
Function ResetColor(ONum As Variant) As Integer
If Not IsNumeric(ONum)Then
ResetColor = 0
Exit Function
End If
If ONum > 256 Then
ResetColor = 256
Elself ONum < 0 Then
ResetColor = 0
Else
ResetColor = ONum
End If
End Function
Sub RefreshColoro()
Me.SelectedColor.BackColor = PColor
End Sub
Private Sub WebBrowser1_BeforeNavigate2(ByVal pDisp As Object, URL As Variant, Flags As Variant, TargetFrameName As Variant, PostData As Variant, Headers As Variant, Cancel As Boolean)
If URL = "about:blank " Then Exit Sub
URL = Right(URL, Len(URL)-1)
SubURL = Split(URL,"#")
Colors = Split(SubURL(UBound(SubURL)),",")
PColor= Colors(0) + 256 * Colors(1) + 65536 * Colors(2)
Cancel = True
RefreshColor
End Sub
Sub BT_OK_Click()
me.hide
End Sub
如果有机会,后面我会把模块的附件放上来,可直接导入使用,谢谢大家支持。