VBA+HTML构建的一款兼容性强的颜色选择窗体

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

如果有机会,后面我会把模块的附件放上来,可直接导入使用,谢谢大家支持。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值