【分享成果,随喜正能量】孩子若是平凡之辈,那就承欢膝下;若是出类拔萃,那就展翅高飞;接受孩子的平庸,就像孩子从来没有要求父母,一定要有多么优秀一样。穷不怪父,孝不比兄,苦不责妻,气不凶子。。
《VBA信息获取与处理》教程是我推出第六套教程,目前已经是第一版修订了。这套教程定位于最高级,是学完初级,中级后的教程。这部教程给大家讲解的内容有:跨应用程序信息获得、随机信息的利用、电子邮件的发送、VBA互联网数据抓取、VBA延时操作,剪贴板应用、Split函数扩展、工作表信息与其他应用交互,FSO对象的利用、工作表及文件夹信息的获取、图形信息的获取以及定制工作表信息函数等等内容。程序文件通过32位和64位两种OFFICE系统测试。是非常抽象的,更具研究的价值。
教程共两册,八十四讲。今日的内容是专题十:利用QueryTables抓取网络数据:VBA中QueryTables提取股票历史交易信息
大家好,这讲讲解的是利用QueryTables实现抓取网页数据的具体应用,在上一讲的讲解中,我们看到QueryTables方法利用起来代码确实是非常简单,实现的效果也是非常好的。这讲我们继续讲解这种方法的利用。这一讲我们将完成提取某支股票历史交易信息的数据。
实用场景:利用QueryTables,抓取网易财经某支股票的历史交易数据,这里我选择的股票是紫金矿业,抓取2020年第2季度的数据,网易财经网址是:http://quotes.money.163.com/trade/lsjysj ,股票在当今社会即是个人投资的方式,又是经济社会发展的晴雨表,关注的人都非常多,也希望在市场运作中能分析出一套可以用于自己投资理财的数据,但股票有风险,大家还是要小心谨慎,不要被表面的高利所诱惑,我这里只能提供给大家基础数据积累,不涉及股票操作。
为了实现上述的场景,我们先看一看上述提供网址提供网页的信息:
上述的网页中,我要提取的是红色框框起来表的数据,我们进行一下思路的分析:首先清空一下回填数据的区域,然后用QueryTables.Add方法,在网页上提取序号为4的表的数据即可。提取表数据的时候可以选择一下格式的填充。在利用Add方法进行连接的时候要将年和季节的参数给出,同时回填数据的区域选择A5单元格。
为了验证一下网址,我们可以在工作表中的某个单元格中留存一下网址。以备核对。
股票投资小常识:懂得寻找一片充满机会的森林并不是最好的猎手,懂得狩猎的猎手很完美,但最完美的猎手还是活的最久的猎手。
为了实现上述的思路,我给出了下面的代码:
Sub myNZA() 获取网易财经股票的价格和信息
Dim strQuery As String
Sheets("Sheet2").Select
ActiveSheet.UsedRange.Offset(4).ClearContents
GPCode = Cells(1, 4).Value
myN = Cells(2, 4).Value
myJ = Cells(3, 4).Value
strQuery = "URL;http://quotes.money.163.com/trade/lsjysj_" & GPCode
strQuery = strQuery & ".html?year=" & myN
strQuery = strQuery & "&season=" & myJ
Cells(1, "l") = strQuery
With ActiveSheet.QueryTables.Add(Connection:=strQuery, Destination:=Range("A5"))
.Name = "history"
.RefreshOnFileOpen = False
.BackgroundQuery = True
.SaveData = True
.PreserveFormatting = True
.AdjustColumnWidth = False
.RefreshPeriod = 0
.WebSelectionType = xlSpecifiedTables
.WebFormatting = xlWebFormattingNone
.WebTables = "4"
.Refresh BackgroundQuery:=False
End With
MsgBox ("OK")
End Sub
代码的讲解:
1) Sheets("Sheet2").Select
ActiveSheet.UsedRange.Offset(4).ClearContents
股票投资小常识:自1928年以来,仅用于计算道琼斯工业股价平均指数的30种工商业公司股票,已有30次更换,几乎每两年就要有一个新公司的股票代替老公司的股票。
以上代码清空数据的回填区域,注意第二句的写法。
2)GPCode = Cells(1, 4).Value 取得股票的代码
3) myN = Cells(2, 4).Value 取得要查询的年
4) myJ = Cells(3, 4).Value 取得要查询的季节
5)strQuery = "URL;http://quotes.money.163.com/trade/lsjysj_" & GPCode
strQuery = strQuery & ".html?year=" & myN
strQuery = strQuery & "&season=" & myJ
以上取得要连接的URL
6) Cells(1, "l") = strQuery
在工作表的单元格中备份网址以便核对。
7)With ActiveSheet.QueryTables.Add(Connection:=strQuery, Destination:=Range("A5"))
上述代码指定加载网址http://quotes.money.163.com/trade/lsjysj_601899.html?year=2020&season=2, 的数据 ,Range("a5")是回填给工作表区域的左上角的单元格。
8).Name = "history"
9).RefreshOnFileOpen = False
如果每次打开工作簿时,数据表高速缓存或查询表自动更新,则为 True。 默认值为 False 。 读取/写入 Boolean。
10).BackgroundQuery = True
是否在后台异步执行,如果查询表的查询是异步执行(在后台执行)的,则为True。
11) .SaveData = True
如果将Data数据随工作簿一起保存,则为 True。 如果仅保存数据透视表的定义,则为 False。 读取/写入 Boolean。
12) .PreserveFormatting = True
如果将数据前五行的任何常用格式设置应用到查询表的新数据行,则为 True。 未使用的单元格未格式化。 如果将应用到查询表的最新一次自动套用格式应用于新数据行,则属性为 False。 默认值为 True。对于数据库查询表, 默认格式设置为xlSimple 常量。
刷新查询表时,将对查询表应用新的自动套用格式样式。 只要 PreserveFormatting 的值为 False,则 AutoFormat(自动套用格式)就会被设置为 None。 因此, 在PreserveFormatting之前设置的任何自动套用格式设置为False , 并且在刷新查询表之前不会生效, 并且生成的查询表不会应用任何格式。
13) .AdjustColumnWidth = False
如果每次刷新指定的查询表时列宽都会自动调整为最适合的宽度,则为 True。 如果每次刷新时列宽不进行自动调整,则为 False。 默认值为 True 。
14) .RefreshPeriod = 0
返回或设置两次刷新之间的时间间隔。 读/写 Long。将周期设置为 0(零),则会禁用自动定时刷新,并且等同于将该属性设置为 Null。RefreshPeriod 属性的值可以是从 0 到 32767 的整数。
15) .WebSelectionType = xlSpecifiedTables 指定表
16) .WebFormatting = xlWebFormattingNone 提取表的数据无格式
17) .WebTables = "4" 选择序号为4的表
18) .Refresh BackgroundQuery:=False
更新一个查询表数据。Updates an external data range in a QueryTable object.
上面的各个属性给大家进行了详细的讲解,希望大家能了解。
代码截图:
通过上述的代码,就可以完成我们的思路。
当我们点击运行按钮,如图的箭头所示,程序就会开始运行,抓取网页数据到工作表中。当然在实际的应用中,用户可以根据自己的实际需要完成抓取工作到指定的位置。
从而验证了我们思路的正确。从代码到实现的过程,非常的简洁,代码理解也非常的容易,这给我们的学习和利用带来了方便。
本节知识点回向:如何利用QueryTables对象各种属性的理解和掌握。
我20多年的VBA实践经验,全部浓缩在下面的各个教程中,教程学习顺序:
【分享成果,随喜正能量】识人不必探尽,探尽则多疑;知人不必言尽,言尽则无友;责人不必苛尽,苛尽则众远;敬人不必卑尽,卑尽则无骨;让人不必退尽,退尽则路窄。是人当寻宁静内而不在他处,当一个人的内在是寂静的,自我就会消失。。
股票投资小常识:投资如同滚雪球,需要有长长的坡,厚厚的雪。投资也像钓鱼,钓鱼就去有鱼的地方。
免责声明:本站所有信息均搜集自互联网,并不代表本站观点,本站不对其真实合法性负责。如有信息侵犯了您的权益,请告知,本站将立刻处理。联系QQ:1640731186