VBA Userform中复用WebBrowser控件时如何清除旧残留内容
问题原因
你当前的代码仅导航到空白页后直接写入新内容,没有处理WebBrowser的DOM缓存,加上如果你的窗体复用(仅隐藏不卸载)时,控件的缓存不会自动释放,就会残留之前加载的旧内容。
解决方案
按以下步骤修改代码即可解决:
- 第一步:导航到空白页后,先等待页面加载完成再操作,避免异步加载导致旧内容没清空就写入新内容
- 第二步:写入新内容前强制清空文档缓存,写入完成后关闭文档流,避免内容叠加
- 可选补充:如果你的窗体是复用的(重复调用
.Show而不是每次卸载后重新创建),可以在窗体的Activate事件中添加清空逻辑,每次打开窗体自动清残留
修改后的完整代码
Private Sub UploadImage_Click() Dim xDialog As FileDialog Dim xDocumen As String Set xDialog = Application.FileDialog(msoFileDialogFilePicker) xDialog.Title = "Select Document" xDialog.AllowMultiSelect = False If xDialog.Show = 0 Then Exit Sub xDocumen = xDialog.SelectedItems(1) Me.ImagePath.Caption = xDocumen ' 导航到空白页 usfAdd.WebBrowser.Navigate2 "about:blank" ' 等待空白页加载完成 Do While usfAdd.WebBrowser.Busy Or usfAdd.WebBrowser.ReadyState <> 4 DoEvents Loop ' 清空旧文档内容 If Not usfAdd.WebBrowser.Document Is Nothing Then usfAdd.WebBrowser.Document.Clear End If ' 写入新内容 usfAdd.WebBrowser.Document.write "<HTML><Body><embed src=""" & xDocumen & """ width=""100%"" height=""100%"" /></Body></HTML>" ' 关闭文档流,停止写入状态 usfAdd.WebBrowser.Document.Close End Sub
可选:窗体复用场景补充代码
在usfAdd窗体的代码模块中添加以下Activate事件代码,每次打开窗体自动清空残留:
Private Sub UserForm_Activate() ' 每次激活窗体先清空WebBrowser内容 Me.WebBrowser.Navigate2 "about:blank" Do While Me.WebBrowser.Busy Or Me.WebBrowser.ReadyState <> 4 DoEvents Loop If Not Me.WebBrowser.Document Is Nothing Then Me.WebBrowser.Document.Clear End If End Sub
内容的提问来源于stack exchange,提问作者Mahmoud Elshaer
相关产品推荐
相关产品推荐

