ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 60215|回复: 47

[原创]用VBA取某股票当日股价与历史股价

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2007-8-21 17:08 | 显示全部楼层 |阅读模式

我之所以开始这个题目,是因为我又看到有人问起如何从WEB中取数据了。随着炒股的人越来越多,可能很多人喜欢用EXCEL来分析股票信息。可是,如何得到股价信息呢?这又是一个问题。

我之前看到的程序,都是从类似business.sohu.com或finance.sina.com.cn中取数据。用XMLHTTP读取大段的网页然后进行数据分离。这种做是对的,但是却不是最快的。要知道用XMLHTTP读取数据的过程,其实就是你打开网页的过程。你打开网页有多快,XMLHTTP就有多快。因此,如何获取最低层的那个GET是最重要的。 经过一段时间的努力,我找到了金融街网站的股票数据信息的最底层的那个GET,速度快,底层的返回数据没有一句http语言,纯文本,易于处理。

现在就将这两个函数公开,希望能对用到的朋友提供一点帮助。

对于其他网页数据的获取,请参照下面的GetHttp函数。只需要在函数参数中加入自己的网址就行了。另外,如果你是经常需要从不同的网页获取数据,为了便于处理得到的文本,建议学习一下“正则表达式”,我们论坛上用的。

好了,言归正传。下面就介绍这两个函数。

取金融街某支股票当天数据的函数Jrj0DayData
 
 
函数使用说明
  • 参数StockCode输入股票代码
  • 函数以数组形式返回当天数据

Function Jrj0DayData(ByRef StockCode As String)
   
    Dim Url As String
   
    Url = "
http://quote.jrj.com.cn/htmdata/html/" & StockCode & ".htm"
    Url = GetHttp(Url)
    Jrj0DayData = Split(Url, ",")
   
End Function

返回的数组有元素38个,数组元素含义如下:

数组的各元素的含义如下所示:
    Debug.Print "日期" & arrA(1)
    Debug.Print "时间" & arrA(2)
    Debug.Print "成交价" & arrA(3)
    Debug.Print "现手" & arrA(4)
    Debug.Print "涨跌" & arrA(5)
    Debug.Print "幅度" & arrA(6)
    Debug.Print "均价" & arrA(7)
    Debug.Print "总量" & arrA(8)
    Debug.Print "金额" & arrA(9)
    Debug.Print "主买或外盘" & arrA(10)
    Debug.Print "主卖或内盘" & arrA(11)
    Debug.Print "昨收" & arrA(12)
    Debug.Print "开盘" & arrA(13)
    Debug.Print "最高" & arrA(14)
    Debug.Print "最低" & arrA(15)
    Debug.Print "委比" & arrA(16)
    Debug.Print "委差" & arrA(17)
    Debug.Print "量比" & arrA(18)
    '下面的格式就是买卖交替,从19-38
    Debug.Print "买①" & arrA(19)
    Debug.Print "买①量" & arrA(20)
    Debug.Print "卖①" & arrA(21)
    Debug.Print "卖①量" & arrA(22)
可以说,这一个数组已经包括了某支股票当日的基本信息,比较全了。
第二个函数,获取历史价格信息
金融街取某一股票80天数据的函数
 
用法:参数StockCode输入某股票代码。函数以数组形式返回80天数据,数组每个元素中存贮着类似(2007-04-20  开:48.23  高:50.79  低:48.00  收:50.27  量:461974  额:228812.67 )的数据。
 
Function Jrj80DayData(ByRef StockCode As String)
   
    Dim Url As String
    Dim objREGEXP As Object
   
    Url = "
http://chart.jrj.com/htmdata/KLINE/ " & StockCode & ".js"
    Url = GetHttp(Url)
   
    Set objREGEXP = CreateObject("VBSCRIPT.REGEXP")
    With objREGEXP
  
        .Global = True
        .Pattern = "[a\[][^\]]*[\]]"
        Url = .Replace(Url, "")
       
    End With
    Set objREGEXP = Nothing
   
    Url = Replace(Url, "= ", "")
    Url = Replace(Url, """", "")
    Url = Replace(Url, Chr(13), "")
    Url = Replace(Url, ";", "")
   
    Jrj80DayData = Split(Url, Chr(10))
   
End Function

函数返回的数组有80个元素,从0-79中依次存着类似2007-04-20  开:48.23  高:50.79  低:48.00  收:50.27  量:461974  额:228812.67 这样的内容。至于你要事先显示此字符串还是要只取数据进行分析,那就随你自己了。

前面两个函数的运用,是要用到下面的这两个函数的。这两个函数是必须的。一个是xmlhttp组件的运用,一个是纠正乱码的。

Function GetHttp(Url)
    Dim objXML
    On Error Resume Next
    Set objXML = CreateObject("Microsoft.XMLHTTP")
    With objXML
        .Open "Get", Url, False, "", ""
        .Send
        GetHttp = .ResponseBody
    End With
    GetHttp = BytesToBstr(GetHttp, "GB2312")
    Set objXML = Nothing
    On Error GoTo 0
End Function

Function BytesToBstr(strBody, CodeBase)
    Dim objStream
    Set objStream = CreateObject("Adodb.Stream")
   
    With objStream
        .Type = 1
        .Mode = 3
        .Open
        .Write strBody
        .Position = 0
        .Type = 2
        .Charset = CodeBase
        BytesToBstr = .ReadText
    End With
    objStream.Close
    Set objStream = Nothing
End Function

TA的精华主题

TA的得分主题

发表于 2007-8-21 17:35 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
收藏学习,虽然暂时用不上.谢谢楼主!

TA的精华主题

TA的得分主题

发表于 2007-8-21 17:48 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
不错,不过跟我的要求还有些距离,我是要沪深所有股票的当天的日线数据和历史上某天的数据.以便对此。我找了很多网站,均没有达到这些要求的,您能不能修改一下,能达到我的要求,谢谢!

TA的精华主题

TA的得分主题

发表于 2007-9-4 14:33 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2007-10-10 16:24 | 显示全部楼层

试验成功,很好,谢谢。

但是取不了股票名称。

TA的精华主题

TA的得分主题

发表于 2007-10-10 16:32 | 显示全部楼层
要股票数据直接到股票软件上导出就可以了,没必要那么麻烦。可以是当天的全部数据,也可以某股票的全部历史数据。钱龙上可以导出某股票的全部历史数据。钱龙的当天数据没有股票代码。安信2003版可以导出当天股票数据,有代码,收盘后就可以得到,非常及时。还有一个网站也可以下载表格式的近几天的全部收盘数据。不过要等到晚上七八点才有,有时会漏一两天。
[此贴子已经被作者于2007-10-10 16:46:31编辑过]

TA的精华主题

TA的得分主题

发表于 2007-10-11 10:19 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

应该如何更新数据?

TA的精华主题

TA的得分主题

发表于 2007-10-11 12:21 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

TA的精华主题

TA的得分主题

发表于 2007-10-11 22:57 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

 楼主:能不能把您做好的这个作品传上来,让我们试试啊!

谢谢了!

[此贴子已经被作者于2007-10-11 22:58:21编辑过]

TA的精华主题

TA的得分主题

发表于 2007-10-31 19:31 | 显示全部楼层
另外插个表,用数组获取股票名
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-9-28 19:43 , Processed in 0.052584 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表