节内容是"VBA信息获取与处理"教程中第八个专题"VBA与HTML文档"的第五节。,希望想掌握这方面知识的朋友能参考我的教程学习。
大家好,我们继续对HTML文档进行学习,在前几节中我们认识了网页文档上面的各种元素,那么我们又该怎么访问他们呢,是如何实现呢?其实,HTML文档,提供了访问其元素的端口,这就是HTML DOM,其定义了一套标准的针对 HTML 文档的对象访问或操作的机制。HTML DOM 定义了所有 HTML 元素的对象和属性,以及访问它们的方法。换言之,HTML DOM 是关于如何获取、修改、添加或删除 HTML 元素的标准。
每个载入浏览器的 HTML 文档都会成为 Document 对象。Document 对象使我们可以从脚本中对 HTML 页面中的所有元素进行访问。Document 对象是 HTML 文档的根节点。
特别注意:Document 对象是 Window 对象的一部分,可通过 window.document 属性对其进行访问。
集合 描述
all[] 提供对文档中所有 HTML 元素的访问。
anchors[] 返回对文档中所有 Anchor 对象的引用。
applets 返回对文档中所有 Applet 对象的引用。
forms[] 返回对文档中所有 Form 对象引用。
images[] 返回对文档中所有 Image 对象引用。
links[] 返回对文档中所有 Area 和 Link 对象引用。
VBA直接支持调用的对象有限,如下:
对象 描述
Document 代表整个 HTML 文档,可被用来访问页面中的所有元素
Anchors 代表 <a> 元素集合
Body 代表 <body> 元素
Forms 代表 <form> 元素集合
Frames 代表 <frame> 元素或<iframe> 元素集合
Images 代表 <img> 元素集合
Links 代表 <link> 元素集合
Options 代表 <option> 元素集合(select元素里面可以直接使用)
Cells 代表 <td> 元素集合(table元素里面可以直接使用)
Rows 代表 <tr> 元素集合(table元素里面可以直接使用)
All 对象集合,提供对文档中所有 HTML 元素的访问。
上述VBA支持直接调用对象的元素,调用起来就非常方便了,可以用序号调用,例如forms(0),也可以按名称/ID调用,例如forms("名称/ID")。其他没法直接调用对象的元素,可以间接从通用all对象集合中去调用该元素或该元素对应的dom对象。
在HTML DOM中,所有事物都是节点。DOM 是被视为节点树的 HTML文档的每一部分都是节点,整个文档被定义为一个文档节点,每个标签是一个元素节点,包含在元素中的文本是文本节点,每一个元素的属性是一个属性节点。如下:
1)整个文档是一个文档节点
2)每个 HTML 元素是元素节点
3)HTML 元素内的文本是文本节点
4)每个 HTML 属性是属性节点
5)注释是注释节点
HTML DOM 将 HTML 文档视作树结构。这种结构被称为节点树,这时一个非常形象的比喻,根节点就是html,主干就是body等,枝干就是body内含的各种元素节点,叶子和花就是元素节点关联的元素的属性(属性节点)或内含文本(文本节点)。
通过 HTML DOM,树中的所有节点均可通过 JavaScript 进行访问。所有 HTML 元素(节点)均可被修改,也可以创建或删除节点。节点树中的节点彼此拥有层级关系。父(parent)、子(child)和同胞(sibling)等术语用于描述这些关系。父节点拥有子节点。同级的子节点被称为同胞(兄弟或姐妹)。
网页文档,可以说是由元素组合而成的,也可以说是由节点连接而成的树构造的。节点是文档树结构中特有的名词,元素是节点,但是节点不一定是元素,节点还有文档节点、文本节点、属性节点等;元素是元素节点的扩展,元素可以拥有属性还有文本。初学者不是很必要纠结元素和节点的区别,这个需要甚至数据结构、类和继承等知识。可大致理解为,同一个html dom对象,提供的两个不同接口。如下的程序,你会发现,他既有支持node(节点)的相关属性和方法,也提供了element(元素)的相关属性和方法。
Sub MYNZ()
Dim ie, dmt, bd
Set ie = CreateObject("InternetExplorer.Application") '创建一个IE对象
With ie
.Visible = True '显示它
.navigate "http://www.baidu.com" '加载某个页面
Do Until .ReadyState = 4 '等待页面加载完毕
DoEvents
Loop
Set dmt = .document '将IE浏览器加载的页面文档,赋予dmt变量
Set bd = dmt.body '将文档的body赋予bd变量
End With
End Sub
代码截图:
按F8键运行截图:
属性是节点(HTML 元素)的值,您能够获取或设置。所有 HTML 元素被定义为对象,而编程接口则是对象方法和对象属性。我们看看下面一些常见的属性:
1)innerHTML 属性 对象内部的HTML代码,是获取元素内容的最简单方法。innerHTML 属性对于获取或替换 HTML 元素的内容很有用。
下面的代码获取 id="intro" 的 <p> 元素的 innerHTML:
<script>
var txt=document.getElementById("intro").innerHTML;
document.write(txt);
2)OuterHtml:对象的HTML代码,包括对象本身的HTML标签
3)innerText:对象内部的文本
4)OuterText:对象的文本,包括对象本身的文本
5)nodeName 属性 nodeName 属性规定节点的名称。
nodeName 是只读的
元素节点的 nodeName 与标签名相同
属性节点的 nodeName 与属性名相同
文本节点的 nodeName 始终是 #text
文档节点的 nodeName 始终是 #document
注释:nodeName 始终包含 HTML 元素的大写字母标签名。
6)nodeValue 属性 nodeValue 属性规定节点的值。
元素节点的 nodeValue 是 undefined 或 null
文本节点的 nodeValue 是文本本身
属性节点的 nodeValue 是属性值
7)nodeType 属性 nodeType 属性返回节点的类型。nodeType 是只读的。
比较重要的节点类型有:
元素类型 NodeType
元素 1
属性 2
文本 3
注释 8
文档 9
以上只是给出了属性值,大家在使用的时候要注意。
本节知识点回向:
什么是HTML DOM文档的属性,常用的属性有哪些。
本节参考文件:008工作表.xlsm
在我的系列书籍中一直在强调"搭积木"的编程思路,这也是学习利用VBA的主要方法,特别是职场人员,更是要采用这种方案。其主要的内涵:
1 代码不要自己全部的录入。你要做的是把积木放在合适的位置然后去修正代码,一定要拷贝,从你的积木库中去拷贝,然后修正代码,把时间利用到高效的思考上。
2 建立自己的"积木库"。平时在学习过程中,把自己认为有用的代码放在一起,多积累,在用到的时候,可以随时拿来。你的积木库资料越多,你做程序的思路就会越广。
VBA是利用Office实现个人小型办公自动化的有效手段(工具)。这是我对VBA的应用界定。在取代OFFICE新的办公软件没有到来之前,谁能在数据处理方面做到极致,谁就是王者。其中登峰至极的技能非VBA莫属!
我记得20年前自己初学VBA时,那时的资料甚少,只能看源码自己琢磨,真的很难。20年过去了,为了不让学习VBA的朋友重复我之前的经历,我根据自己多年VBA实际利用经验,推出了六部VBA专门教程:
第一套:VBA代码解决方案 是VBA中各个知识点的讲解,教程共147讲,覆盖绝大多数的VBA知识点,初学必备;
第二套:VBA数据库解决方案 数据库是数据处理的专业利器,教程中详细介绍了利用ADO连接ACCDB和EXCEL的方法和实例操作,适合中级人员的学习。
第三套:VBA数组与字典解决方案 数组和字典是VBA的精华,字典是VBA代码水平提高的有效手段,值得深入的学习,是初级及中级人员代码精进的手段。
第四套:VBA代码解决方案之视频 是专门面向初学者的视频讲解,可以快速入门,更快的掌握这门技能。这套教程是第一套教程的视频讲解,听元音更易接受。
第五套:VBA中类的解读和利用 这是一部高级教程,讲解类的虚无与肉身的度化,类的利用虽然较少,但仔细的学习可以促进自己VBA理论的提高。这套教程的领会主要是读者的领悟了,领悟一种佛学的哲理。
第六套教程:《VBA信息获取与处理》,这是一部高级教程,涉及范围更广,实用性更强,面向中高级人员。教程共二十个专题,包括:跨应用程序信息获得、随机信息的利用、电子邮件的发送、VBA互联网数据抓取、VBA延时操作,剪切板应用、Split函数扩展、工作表信息与其他应用交互,FSO对象的利用、工作表及文件夹信息的获取、图形信息的获取以及定制工作表信息函数等等内容。
大家可以根据以上资料1→3→2→6→5或者是4→3→2→6→5的顺序逐渐深入的逐渐学习。教程提供讲解的同时提供了大量的积木,如需要可以WeChat: NZ9668
如太白诗云:众鸟高飞尽,孤云独去闲。相看两不厌,只有敬亭山。学习的过程也是修心的过程,修一个平静的心。在代码的世界中,心平静了,心情好了,身体自然而然就好。心静则正,内心里没有那么多邪知邪见,也就没有那么多妄想。利人就是利己。这些教程也是为帮助大家起航,助上我自己之力,我的上述教程是我多的经验的传递,
"水善利万物而不争",绵绵密密,微则无声,巨则汹涌。学习亦如此,知道什么是自己所需要的,不要蜷缩在一小块自认为天堂的世界里,待到暮年时再去做自欺欺人的言论。要努力提高自己,用一颗充满生机的心灵,把握现在,这才是进取。越是有意义的事情,困难会越多。愿力决定始终,智慧决定成败。不管遇到什么,都是风景。看淡纷争,看轻得失。茶,满也好,少也好,不要计较;浓也好,淡也好,其中自有值得品的味道。去感悟真实的时间,静下心,多学习,积累福报。而不是天天混日子,也不是天天熬日子。在后疫情更加严峻的存量残杀世界中,为自己的生存进行知识的储备,特别是新知识的储备。学习时微而无声,利用时则巨则汹涌。
每一分收获都是成长的记录,怎无凭,正是这种执着,成就了朝霞的灿烂。最后将一阙词送给致力于VBA学习的朋友,让大家感受一下学习过程的枯燥与执着:
浮云掠过,暗语无声,
唯有清风,惊了梦中啼莺。
望星,疏移北斗,
奈将往事雁同行。
阡陌人,昏灯明暗,
忍顾长亭。
多少VBA人,
暗夜中,悄声寻梦,盼却天明。
怎无凭!
回向学习利用VBA的历历往事,不胜感慨,谨以这些文字给大家,分享我多年工作实际经验的成果,随喜这些有用的东西,给确实需要利用VBA的同路人。
分享成果,随喜正能量
头条创作挑战赛# HTMLStyleElement 对象是 Excel VBA 中用来操作 HTML 样式的元素对象。它表示 HTML 页面中的样式标签(<style>)。
下面是 6 个代码实例,用来说明 HTMLStyleElement 对象的用法:
1、创建一个新的 <style> 元素对象,并将其添加到 HTML 文档中:
Dim style As Object
Set style = ThisWorkbook.Sheets("Sheet1").OLEObjects.Add(ClassType:="HTML Style")
2、设置 <style> 元素的 innerHTML 属性,即添加样式规则:
style.Object.innerHTML = "body { background-color: lightblue; }"
3、获取 <style> 元素的 innerHTML 属性,即获取样式规则:
Dim styleRules As String
styleRules = style.Object.innerHTML
4、将 <style> 元素插入到 HTML 文档中的某个节点之前:
Dim targetNode As Object
Set targetNode = ThisWorkbook.Sheets("Sheet1").OLEObjects("targetNode")
targetNode.ParentNode.insertBefore style.Object, targetNode
5、从 HTML 文档中移除 <style> 元素:
style.Delete
6、通过指定 <style> 元素的 id 属性,获取具有特定 id 的 <style> 元素对象:
Dim styleId As String
styleId = "myStyle"
Dim style As Object
Set style = ThisWorkbook.Sheets("Sheet1").OLEObjects(styleId).Object
通过以上的代码实例,你可以了解如何创建、设置、获取、移除和查找 HTMLStyleElement 对象。注意,在上述代码中,ThisWorkbook.Sheets("Sheet1") 可以根据你的具体情况进行修改,以指定你要操作的工作表。
当我感到压力或需要放松时,我通常会使用 Excel 来记录和跟踪我的情绪和心理状态。我创建了一个简单的示例,使用 HTMLStyleElement 对象在 Excel 中应用不同的样式主题来反映我的情绪。
Sub ApplyEmotionalStyle()
' 创建新的 HTMLStyleElement 对象
Dim style As Object
Set style = ThisWorkbook.Sheets("Sheet1").OLEObjects.Add(ClassType:="HTML Style")
' 根据情绪类型设置样式规则
Dim mood As String
mood = InputBox("请输入你的情绪类型(例如:happy、sad、excited、calm):")
Select Case mood
Case "happy"
style.Object.innerHTML = "body { background-color: yellow; }"
Case "sad"
style.Object.innerHTML = "body { background-color: blue; }"
Case "excited"
style.Object.innerHTML = "body { background-color: red; }"
Case "calm"
style.Object.innerHTML = "body { background-color: green; }"
Case Else
MsgBox "无效的情绪类型"
Exit Sub
End Select
' 将样式应用到整个工作表
ThisWorkbook.Sheets("Sheet1").Cells.Font.Name = "Arial"
ThisWorkbook.Sheets("Sheet1").Cells.Font.Size = 14
ThisWorkbook.Sheets("Sheet1").Cells.Font.Color = RGB(255, 255, 255)
ThisWorkbook.Sheets("Sheet1").Cells.Interior.Pattern = xlNone
ThisWorkbook.Sheets("Sheet1").Cells.Interior.ColorIndex = xlColorIndexNone
ThisWorkbook.Sheets("Sheet1").Cells.Interior.ThemeColor = xlThemeColorLight1
' 将 <style> 元素插入 HTML 文档中的某个节点之前
Dim targetNode As Object
Set targetNode = ThisWorkbook.Sheets("Sheet1").Range("A1")
targetNode.ParentNode.insertBefore style.Object, targetNode
' 弹出对话框展示情绪样式的效果
MsgBox "样式已应用到工作表中的单元格范围"
End Sub
当运行上述代码时,它会提示你输入情绪类型,然后根据输入的情绪类型应用相应的样式。例如,如果输入 “happy”,则会将工作表的背景颜色设置为黄色。你可以根据需要添加更多的情绪类型和对应的样式规则。【请注意,该代码假定在工作表 “Sheet1” 中有一个 Range 对象(A1) 作为目标节点,你也可以根据需要修改它】
在使用 HTMLStyleElement 对象时,需要注意以下几点:
1、确保在添加 <style> 元素之前,要创建一个 OLEObject 控件并将其类型设置为 “HTML Style”,然后再通过 Object 属性来访问 HTMLStyleElement 对象。
Dim style As Object
Set style = ThisWorkbook.Sheets("Sheet1").OLEObjects.Add(ClassType:="HTML Style")
2、使用 .innerHTML 属性来设置或获取 <style> 元素的样式规则。样式规则必须遵循 CSS 的语法规则。
style.Object.innerHTML = "body { background-color: lightblue; }"
3、在插入 <style> 元素之前,需要找到要将其插入到的目标节点。通过 ParentNode 属性和 insertBefore 方法来实现。
Dim targetNode As Object
Set targetNode = ThisWorkbook.Sheets("Sheet1").Range("A1")
targetNode.ParentNode.insertBefore style.Object, targetNode
4、如果不再需要 <style> 元素,可以使用 Delete 方法将其从文档中删除。
style.Delete
5、当在 Excel 中使用 HTMLStyleElement 对象时,要确保选择适当的目标范围(比如工作表、单元格等),以便样式被正确应用。
6、需要遵循 CSS 的语法规则,确保正确设置样式规则。例如,必须使用正确的 CSS 选择器(如 “body”、“div”)和属性(如 “background-color”、“font-size”)。
7、HTMLStyleElement 对象只能应用于支持 HTML 渲染的环境中,例如在 WebBrowser 控件中或使用 VBA 内置的 Web 浏览器。
8、在应用样式之前,应该清楚目标节点的父节点是否支持样式。例如,在 <style> 元素之前的节点必须是支持样式的元素。
【通过遵循以上注意事项,你能够正确地使用 HTMLStyleElement 对象来操作样式规则并在 Excel 中应用相应的样式。】
头条创作挑战赛# HTMLDocument对象是Microsoft Excel VBA中表示HTML文档的一种对象。它可以用于读取、修改和操作HTML文档中的标签、元素和属性。可以通过创建HTMLDocument对象来加载和解析HTML文件,并使用提供的方法和属性访问文档中的各个部分。可以将HTMLDocument对象与其他Excel对象(如Workbooks、Worksheets或Range)一起使用,以便在VBA中自动化对HTML文档的处理和操作。
1、创建HTMLDocument对象并加载HTML文件:
Dim htmlDoc As New HTMLDocument
htmlDoc.body.innerHTML = "HTML内容"
2、通过标签名称获取元素对象:
Dim element As Object
Set element = htmlDoc.getElementsByTagName("h1")(0)
3、获取元素的文本内容:
Dim text As String
text = htmlDoc.getElementById("myElement").innerText
4、修改元素的属性值:
htmlDoc.getElementById("myElement").setAttribute "class", "newClass"
5、遍历所有元素并执行操作:
Dim allElements As Object
Set allElements = htmlDoc.getElementsByTagName("*")
For Each element In allElements
' 执行操作
Next element
6、在HTML文档中插入新元素:
Dim newElement As Object
Set newElement = htmlDoc.createElement("p")
newElement.innerHTML = "新段落"
htmlDoc.body.appendChild newElement
以下是两个在Excel VBA中使用HTMLDocument对象的示例:
案例一:从网页中提取数据并填充至Excel工作表
Sub ExtractDataFromWeb()
Dim html As New HTMLDocument ' 创建HTMLDocument对象
Dim xmlhttp As Object
Dim table As Object
Dim i As Integer, j As Integer
' 创建XMLHTTP对象
Set xmlhttp = CreateObject("MSXML2.XMLHTTP")
' 发送GET请求获取网页内容
xmlhttp.Open "GET", "http://www.example.com", False
xmlhttp.send
' 将获取的网页内容解析到HTMLDocument对象
html.body.innerHTML = xmlhttp.responseText
' 在HTMLDocument对象中查找需要提取的表格
Set table = html.getElementById("tableId")
' 填充数据至Excel工作表
For i = 0 To table.Rows.Length - 1
For j = 0 To table.Rows(i).Cells.Length - 1
ThisWorkbook.Sheets("Sheet1").Cells(i + 1, j + 1) = table.Rows(i).Cells(j).innerText
Next j
Next i
Set xmlhttp = Nothing
Set html = Nothing
End Sub
案例二:自动化提交表单并获取返回结果
Sub SubmitFormAndGetResponse()
Dim html As New HTMLDocument ' 创建HTMLDocument对象
Dim xmlhttp As Object
Dim form As Object
Dim submitButton As Object
' 创建XMLHTTP对象
Set xmlhttp = CreateObject("MSXML2.XMLHTTP")
' 发送GET请求获取包含表单的网页内容
xmlhttp.Open "GET", "http://www.example.com/form-page", False
xmlhttp.send
' 将获取的网页内容解析到HTMLDocument对象
html.body.innerHTML = xmlhttp.responseText
' 在HTMLDocument对象中查找表单并填写表单字段
Set form = html.forms(0)
form.getElementById("inputField1").Value = "Value1"
form.getElementById("inputField2").Value = "Value2"
' 找到提交按钮并自动点击
Set submitButton = form.getElementsByClassName("submitButton")(0)
submitButton.Click
' 等待结果返回并解析结果
Application.Wait Now + TimeValue("0:00:02") ' 等待2秒,根据实际情况调整等待时间
html.body.innerHTML = xmlhttp.responseText
' 处理返回结果
' ...
Set xmlhttp = Nothing
Set html = Nothing
End Sub
这些示例演示了如何使用HTMLDocument对象从网页中提取数据并将其填充至Excel工作表,以及如何自动化提交HTML表单并获取返回结果。可以根据需要修改代码中的URL、元素ID和类名等,以适应具体的网页结构和目标数据。
使用HTMLDocument对象时需要注意以下事项:
1、引用Microsoft HTML Object Library:在VBA编辑器中,点击菜单栏上的"工具",选择"引用",然后勾选"Microsoft HTML Object Library"。这个引用将允许你在VBA代码中使用HTMLDocument对象。
2、创建HTMLDocument对象:使用CreateObject函数创建HTMLDocument对象。例如:
Dim html As Object
Set html = CreateObject("HTMLFile")
3、加载HTML内容:使用HTMLDocument对象的Open方法加载HTML内容。例如:
html.Open
html.Write "<html><body><h1>Hello, World!</h1></body></html>"
html.Close
4、获取HTML元素:可以使用getElementById、getElementsByTagName、getElementsByClassName等方法获取HTML元素。例如:
Dim h1 As Object
Set h1 = html.getElementById("myHeading")
5、操作HTML元素:可以使用HTML元素的属性和方法进行操作。例如,改变元素的文本内容:
h1.innerText = "Hello, VBA!"
6、事件处理:HTMLDocument对象也支持事件处理。可以使用AttachEvent方法将事件与处理程序关联起来。例如:
Dim button As Object
Set button = html.getElementById("myButton")
Private Function Button_Click()
MsgBox "Button clicked!"
End Function
button.AttachEvent "onclick", Button_Click
7、释放资源:在使用完HTMLDocument对象后,记得使用Set语句将其设置为Nothing,以释放系统资源。例如:
Set h1 = Nothing
Set html = Nothing
以上是使用HTMLDocument对象时需要注意的一些事项。通过合适的引用和正确的操作,可以在VBA编写中使用HTMLDocument对象来处理HTML内容。
*请认真填写需求信息,我们会在24小时内与您取得联系。