用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获取网页内容填写网页表单的主要内容,如果未能解决你的问题,请参考以下文章

有啥好用的网页自动填写软件啊?

有啥软件能快速实现网页自动填表?

利用excel VBA进行自动化数据分析,数据汇总,网页表单自动提交等功能

如何实现办公网页自动填写提交?有没网页自动填表工具?

用Vb提取网页中的数据

求问:excel VBA对一个已经打开的网页进行操作