這篇文章可能會(huì)寫(xiě)很久,很久。
在vba中不要試圖全面控制Webbrowser,因?yàn)槟鞘怯胿ba辦不到,即使能辦到也一定是辦不好的事情。
而且全面控制webbrowser的復(fù)雜度會(huì)大大超出你的意料。
可以說(shuō)在所有使用webbrowser的編程語(yǔ)言中,vba調(diào)用是最簡(jiǎn)便的一種。
html與winform的交互,主要是兩種類(lèi)型的交互。一種是html(js)與vba函數(shù)的互相調(diào)用,一種是html(js)與recordset的數(shù)據(jù)交互
一、html(js)如何與vba函數(shù)互相調(diào)用?
vba通過(guò)html的dom,可以全面讀寫(xiě)html和js,這是很容易做到的。但html或js如何調(diào)用vba函數(shù)呢?
主要有兩種方式:
1、通過(guò)事件,來(lái)通知winform執(zhí)行vba函數(shù)。 引用microsoft html object libray類(lèi)型庫(kù)
Dim WithEvents m_Doc As MSHTML.HTMLDocument
Private Sub Form_Load()
Me.WebBrowser1.Navigate2 "http://www.baidu.com"
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)
Set m_Doc = Me.WebBrowser1.Document
End Sub
Private Function m_Doc_onclick() As Boolean
Dim elem As IHTMLElement
Set elem = m_Doc.parentWindow.event.srcElement
select case elem.id '這其實(shí)是一個(gè)事件列表
case id1
call mySub1
case id2
call mysub2
……
end select
End
這里重點(diǎn)用到的是Dom的window.event對(duì)象,并且主要是用到srcElement屬性。
使用 window.event 對(duì)象,可以捕獲 WebBrowser 眾多的鼠標(biāo)和鍵盤(pán)事件,如鼠標(biāo)坐標(biāo)、按 下了鍵盤(pán)哪個(gè)鍵,以及鍵盤(pán)
Ctrl、Alt、Shift 鍵的狀態(tài)、當(dāng)前網(wǎng)頁(yè)元素的ID、索引等等。
可以說(shuō)這是VBA與webbrowser交互的唯一簡(jiǎn)便途徑了。
這種方式的缺點(diǎn):
(1)、必須為每一個(gè)htm頁(yè)面寫(xiě)特定的事件列表,雖然這當(dāng)中最主要是onclick事件。
它的抽象度非常差。如果你有什么更好的方式,不妨提出來(lái)討論一下。
(2)、WebBrowse 控件的 event
對(duì)象只能捕捉主頁(yè)面的有關(guān)事件,對(duì)網(wǎng)頁(yè)包含的內(nèi)嵌網(wǎng)頁(yè)和框架無(wú)能為力。要捕捉內(nèi)嵌網(wǎng)頁(yè)和框架的有關(guān)事件,必須為每個(gè)網(wǎng)頁(yè)定義一個(gè)捕捉事件,但 VBA 的
WithEvents 語(yǔ)句并不支持定義數(shù)組事件。
這里很容易轉(zhuǎn)換成另一個(gè)問(wèn)題:
如何讓withEvents支持collection或數(shù)組?這個(gè)問(wèn)題的答案,能解決的事情范圍變得很大了,如access的mdi問(wèn)題等。 2、通過(guò)window.external來(lái)調(diào)用vba函數(shù)
通過(guò)window.external調(diào)用vba函數(shù),其實(shí)是比較理想的方式,所有的ie的activeX插件,幾乎都是通過(guò)這種方式。但 Webbrowser只有在實(shí)現(xiàn)IDocHostUIHandler接口后,window.external才能調(diào)用VBA函數(shù)。
這在vb6中可以做到,但在access中辦不到,因?yàn)樗仨氁胦lelib.tlb,而access本身沒(méi)有任何編譯功能。( 寫(xiě)到這里,我忍不住想起mde,accde,這種編譯其實(shí)是徹頭徹尾的騙人小把戲)
很可惜,這種方式只能放棄了。
表面看起來(lái),似乎缺陷蠻多的,功能有限,但別忘了我們?cè)贏ccess中使用html,并不是想用html來(lái)全面替代winform的功能,因?yàn)檫@不科學(xué),也完全沒(méi)必要。所以還是可以承受的。不要以為用c++,c#、vb.net調(diào)用webbrowser會(huì)更容易,坦白地說(shuō),它們只會(huì)帶來(lái)更多的麻煩和痛不欲生的折磨而已。也不要以為用webkit會(huì)更容易,那是永遠(yuǎn)不可能的。
二、數(shù)據(jù)交互:
準(zhǔn)備好幾種工具:
1、 json的vba版解析器。在html5時(shí)代,不管你見(jiàn)或不見(jiàn),json就在那里,不遠(yuǎn)、不近,你回避不了。所以了解json格式是必須的,很容易在網(wǎng)絡(luò)上搜到幾十種vb6版或asp版的json解析器。它們都很方便。挑一種符合你使用的,或有人最近兩三年還在維護(hù)的json解析器。