一、序
我其实不会 excel 的函数和 visual basic。因为都可以用matlab和python完成。
今天用了下VBA,还挺不错的。分享下。
上传写了个matlab获取股票数据的,是雅虎财经的。这次是搜狐股票的数据。
搜狐股票:https://q.stock.sohu.com/
其实都大同小异,就是发送一个http请求,然后解析获取的数据即可。
随便找个股票:
点击左侧栏的“历史行情
”:这里就是我们要下载的数据,我前面文章使用matlab、python都可以爬取的。
二、excel 自动刷新股票数据
无法就是拿VBA 发送个http请求,然后把返回的数据保存到excel相应的位置。
随便拿个api post测试一下api,返回数据如下:
0 "2024-12-31", 日期
1 "3.00", 开盘
2 "2.90", 收盘
3 "-0.13",涨跌额
4 "-4.29%",涨跌幅
5 "2.88", 最低
6 "3.04", 最高
7 "1179628", 总手
8 "34640.35",成交金额
9 "4.39%" 换手率
office 版本:Microsoft 365
excel 中:
- 点击 文件 -> 选项。
- 在左侧选择 自定义功能区,然后勾选 开发工具 选项,点击 确定。
插入一个按钮:按下即可执行VBA代码,刷新数据
要修改这个按钮的文字大小之类的,右键然后编辑文字、或者设置控件格式即可。
点一下其它地方,即可取消编辑状态,这时候鼠标左键点下即代表按下按钮。
自己弄一下表格样式: 把下面需要填入数据的区域的单元格格式设置为“文本
”。
开发工具:Visual Basic 编写VBA代码
源码:
' 获取数据的主程序
Sub get_data()
' 清空工作表中的数据
clear_cells
' 加载页面数据
load_page1
' 选择 A1 单元格
Range("A1").Select
End Sub
' 加载页面数据
Public Sub load_page1()
Dim url As String, sSp() As String, aaa As String, line As String, sArray() As String
' 获取工作表1中的日期范围
cd = Sheets(1).[c1] ' 获取开始日期
sd = Sheets(1).[e1] ' 获取结束日期
ed = Sheets(1).[g1] ' 获取股票代码
' 构造 URL 地址,连接股票数据请求的 API
url = "https://q.stock.sohu.com/hisHq?code=cn_" & cd & "&start=" & sd & "&end=" & ed
' 创建一个 HTTP 请求对象,用于发送请求并获取响应数据
With CreateObject("msxml2.xmlhttp")
.Open "post", url, False ' 发送 POST 请求
.send ' 发送请求
' 获取响应文本并去除回车符
aaa = Replace(.responsetext, Chr(13), "")
' 查找响应中是否包含"Not Found"字符串,若有则提示数据源无法访问
Dim inte As Integer
inte = InStr(aaa, "Not Found")
If inte <> 0 Then
MsgBox ("数据源无法访问!") ' 弹出提示框
Debug.Print "数据源无法访问!退出"
Exit Sub ' 如果数据源不可访问,退出程序
End If
' 'Debug.Print "响应数据:" & aaa ' 可以用来打印调试信息,取消注释来查看响应数据
' 将响应数据按 '],[' 分割,分割成单个记录
sSp = Split(aaa, "],[")
' 如果有超过一个数据项,开始处理每一行的数据
If UBound(sSp) > 1 Then
For i = 0 To UBound(sSp) - 1
line = sSp(i) ' 取得一行数据
' 'Debug.Print " 行:" & line ' 调试信息,打印每一行数据
' 如果是第一行数据,去掉多余的部分
If i = 0 Then
line = Mid(line, 22, Len(line))
End If
' 移除双引号
line = Replace(line, Chr(34), "")
' 'Debug.Print " 行2:" & line ' 打印去除双引号后的数据行
' 将行数据按逗号分割
sArray = Split(line, ",")
' 'Debug.Print " 单元格:" & sArray(0) ' 打印每一项数据的值
' 将分割后的数据填充到工作表中,从第3行开始
Worksheets("sheet1").Cells((i + 3), 1) = sArray(0)
Worksheets("sheet1").Cells((i + 3), 2) = sArray(1)
Worksheets("sheet1").Cells((i + 3), 3) = sArray(2)
Worksheets("sheet1").Cells((i + 3), 4) = sArray(4)
Worksheets("sheet1").Cells((i + 3), 5) = sArray(5)
Worksheets("sheet1").Cells((i + 3), 6) = sArray(6)
Worksheets("sheet1").Cells((i + 3), 7) = sArray(7)
Worksheets("sheet1").Cells((i + 3), 8) = sArray(8)
Worksheets("sheet1").Cells((i + 3), 9) = sArray(9)
Next i
End If
End With
End Sub
' 清空指定范围的单元格内容
Public Sub clear_cells()
Range("A3").Select ' 选择 A3 单元格
ActiveWindow.SmallScroll Down:=45 ' 滚动页面,确保可见范围内有 A4
Range("A3:I477").Select ' 选择 A3 到 I477 范围
Selection.ClearContents ' 清空所选范围的内容
Range("A1").Select ' 选择 A1 单元格
End Sub
运行效果:
三、付费获取
我还写了升级版,可以获取多个股票数据。
不愿意自己写的就付款哈哈:链接