用Excel中的vba获取网页内容填写网页表单
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用Excel中的vba获取网页内容填写网页表单相关的知识,希望对你有一定的参考价值。
参考技术A 有些网页写得很复杂,iframe内又套iframe,直接从IE对象获取内层iframe中的元素是获取不到的。需要逐层进去,一层也不可跳过。对于每个iframe,用 f.contentWindow.Document.getElementByid 获取iframe内的子元素。而不是直接从ie.Document去getElementByid。整个连接起来看是很长的:ie.Document.getElementByid("第一层iframe").contentWindow.Document.getElementByid("第二层ifrem") ......
属性选择器
其中一个iframe的名字是随机生成的,后面的整数每次都不同。可以改成用querySelector函数,用通配符匹配。
End语句。Visual Basic遇到End语句就结束运行。
Trim去除前后空格。Str整数转字符串。Round小数取整。InStr搜索匹配子字符串。
循环语句while wend、while do loop……两种?
防止 Word VBA 中的 Excel 提示
【中文标题】防止 Word VBA 中的 Excel 提示【英文标题】:Preventing Excel prompt from Word VBA 【发布时间】:2015-12-17 23:56:47 【问题描述】:我在 Word 和 Excel 上使用 VBA。我让 Word 运行一个用户表单,它会自动打开一个 Excel 文件。用户应在 Excel 文件中填写一些数据,然后返回 Word 用户表单。当用户填写完 Word 用户表单中的所有字段后,它将在 Word 上运行一些 VBA 代码,将数据从 Excel 复制到 Word。完成后,Excel 文件将自动关闭。因此,我需要防止用户手动关闭 Excel 应用程序。
为了做到这一点,我在Sub Workbook_BeforeClose
的 Excel VBA 中使用这些代码。如果用户关闭 Excel 应用程序窗口,它将显示一个消息框,询问用户是否仍在使用 Word 用户窗体。代码如下:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
answer = MsgBox("Are you still working with Word userform?", vbYesNo)
If answer = vbYes Then
Cancel = True
MsgBox "This workbook should not be closed. It will be automatically closed when you finish working with Ms. Word Template Userform."
Else
Application.ThisWorkbook.Saved = True
End If
End Sub
在 Word VBA 中,我有关闭 Excel 文件的代码:
Sub closeExcelApp()
If Not excelApp Is Nothing Then
excelApp.DisplayAlerts = False
excelWb.Close savechanges:=False
Set excelWb = Nothing
excelApp.Quit
End If
Set excelApp = Nothing
End Sub
当 Word VBA 代码完成将数据从 Excel 复制到 Word 时,将调用此 Sub。但是,调用此 Sub 将导致调用 Workbook_BeforeClose
。同时,当我从 Word VBA 调用 closeExcelApp
子时,我不希望调用 Workbook_BeforeClose
。
有什么建议吗?
【问题讨论】:
最好的方法是创建一个Public Boolean
,在输入此closeExcelApp
时设置为True,并在Workbook_BeforeClose
的开头添加If Boolean Then Exit Sub
之类的内容。这应该够了吧! ;)
【参考方案1】:
如 cmets 中所述,在模块顶部添加这一行:Public ClosingFromWord As Boolean
,并在开始执行代码时将此布尔值设置为 False。
当您在应用程序之间工作时,最简单的方法是将布尔值从 Word 写入 Excel 中的单元格,然后在 Workbook_BeforeClose
中读取/加载该值,以避免遍历该例程的整个代码.
并修改你的代码看起来像这样:
Sub closeExcelApp()
ClosingFromWord = True
excelApp.Workbooks(1).Sheets(1).Cells(1,1) = ClosingFromWord
If Not excelApp Is Nothing Then
excelApp.DisplayAlerts = False
excelWb.Close savechanges:=False
Set excelWb = Nothing
excelApp.Quit
End If
Set excelApp = Nothing
ClosingFromWord = False
excelApp.Workbooks(1).Sheets(1).Cells(1,1) = ClosingFromWord
End Sub
因此,当您执行closeExcelApp
时,布尔值将设置为True,并且Workbook_BeforeClose
不会全部执行,因为它将以If ClosingFromWord Then Exit Sub
退出:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
ClosingFromWord = Workbooks(1).Sheets(1).Cells(1,1)
If ClosingFromWord Then Exit Sub
answer = MsgBox("Are you still working with Word userform?", vbYesNo)
If answer = vbYes Then
Cancel = True
MsgBox "This workbook should not be closed. It will be automatically closed when you finish working with Ms. Word Template Userform."
Else
Application.ThisWorkbook.Saved = True
End If
End Sub
【讨论】:
我应该把Public ClosingFromWord as Boolean
放在哪里? closeExcelApp
在 Word 中,而 Workbook_BeforeClose
在 Excel 中。我试图将布尔变量放在 Word VBA 模块中,但它似乎不起作用。我想我需要将变量从 Word 传递到 Excel,不是吗?
我的错,我忘记了。查看编辑,您可以指定比Workbooks(1).Sheets(1).Cells(1,1)
更实用的内容,但由于我对您的文件一无所知,这是解释它的最简单方法!
啊,我从来没有想过使用单元格在 Word 和 Excel 变量之间传递值。这对其他情况很有用。谢谢!【参考方案2】:
您可以禁用事件:
Sub closeExcelApp()
If Not excelApp Is Nothing Then
excelApp.DisplayAlerts = False
excelApp.EnableEvents = False
excelWb.Close savechanges:=False
Set excelWb = Nothing
excelApp.Quit
End If
Set excelApp = Nothing
End Sub
【讨论】:
啊哈,看到你回答我就傻了,那一刻我完全忘记了!比我提出的解决方案更有效!以上是关于用Excel中的vba获取网页内容填写网页表单的主要内容,如果未能解决你的问题,请参考以下文章