ARTICLE · 995172
用excel盯盘
上班族开股票行情软件显得非常不尊重工作,以前就有用excel盯盘的,根本看不出你是在工作还是在摸鱼。不过上古时期是怎么编写的程序咱也搞不懂,只会拿来就用,根本不会自己添加需要的功能。
好在AI时代来了,只要有高中水平的知识储备,我们也可以手搓一个excel盯盘工具。
根据上古大神的设计思路,就是启用宏命令,在某一单元格(比如A1)输入股票代码,每次重新计算就在临近格获取当前股价。我们稍微优化一下,你可以这样问AI:用excel通过宏获取指定股票的现价,第二行放股票代码,第三行获取现价,做两个按钮,一个从新浪获取数据,另一个从腾讯获取数据。
大概就是如下效果:

AI会给你一段vba代码,你需要启用宏,并在表格中画两个按钮并将按钮和对应功能绑定。我获得的是这样的代码,如果你的代码有错误可以让AI继续改进或者直接换个AI问。
Function GetSinaHttpGBK(url As String) As StringDim http As Object' 改用 WinHttpRequest,TLS 和 Header 控制更稳Set http = CreateObject("WinHttp.WinHttpRequest.5.1")' 强制 TLS1.2(Win7/Win10 兼容)http.Option(9) = 2048http.Open "GET", url, False' 新浪必须带以下头,否则直接 403 或 Kinsoku 报错http.SetRequestHeader "Referer", "https://finance.sina.com.cn/"http.SetRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"On Error Resume Nexthttp.SendIf http.Status <> 200 ThenGetSinaHttpGBK = ""Set http = NothingExit FunctionEnd If' GBK 转码Dim stream As ObjectSet stream = CreateObject("ADODB.Stream")stream.Type = 1stream.Openstream.Write http.ResponseBodystream.Position = 0stream.Type = 2stream.Charset = "GBK"GetSinaHttpGBK = stream.ReadTextstream.CloseSet stream = NothingSet http = NothingEnd FunctionSub GetPrice_Sina()Dim ws As WorksheetSet ws = ThisWorkbook.Sheets(1)Dim lastCol As LonglastCol = ws.Cells(2, ws.Columns.Count).End(xlToLeft).ColumnDim i As LongFor i = 2 To lastColDim stockCode As StringstockCode = Trim(ws.Cells(2, i).Value)If stockCode = "" Then GoTo NextCol' 必须用 HTTPSDim url As Stringurl = "https://hq.sinajs.cn/list=" & stockCodeDim resp As Stringresp = GetSinaHttpGBK(url)If resp = "" Thenws.Cells(3, i).Value = "ERR"GoTo NextColEnd IfOn Error Resume NextDim parts() As Stringparts = Split(resp, """")Dim dataFields() As StringdataFields = Split(parts(1), ",")Dim price As Stringprice = Trim(dataFields(3))If IsNumeric(price) Thenws.Cells(3, i).Value = CDbl(price)Elsews.Cells(3, i).Value = "N/A"End IfOn Error GoTo 0NextCol:Next iMsgBox "新浪财经:获取完成!", vbInformationEnd Sub'==========================================' 腾讯按钮 → 获取现价到第三行'==========================================Sub GetPrice_Tencent()Dim ws As WorksheetSet ws = ThisWorkbook.Sheets(1)Dim lastCol As LonglastCol = ws.Cells(2, ws.Columns.Count).End(xlToLeft).Column' 从 B 列开始(跳过 A 列)Dim i As LongFor i = 2 To lastColDim stockCode As StringstockCode = Trim(ws.Cells(2, i).Value)If stockCode = "" Then GoTo NextColDim url As Stringurl = "http://qt.gtimg.cn/q=" & stockCodeDim resp As Stringresp = GetSinaHttpGBK(url)If resp = "" Thenws.Cells(3, i).Value = "ERR"GoTo NextColEnd If' 解析现价:按双引号分割,再按 ~ 分割' 腾讯格式:v_xxx="类型~名称~代码~现价~昨收~今开~..."' 现价在 ~ 分割后的 index 3On Error Resume NextDim parts() As Stringparts = Split(resp, """")Dim dataFields() As StringdataFields = Split(parts(1), "~")Dim price As Stringprice = Trim(dataFields(3))If IsNumeric(price) Thenws.Cells(3, i).Value = CDbl(price)Elsews.Cells(3, i).Value = "N/A"End IfOn Error GoTo 0NextCol:Next iMsgBox "腾讯财经:获取完成!", vbInformationEnd Sub
在C列之后可以任意添加股票代码,建议不要超过10个,而且刷新频率也不要低于30秒,否则可能会被对方认为是爬虫从而封禁你的ip。
另外,不光能获取现价,还能获取名称、开盘、昨收、最高、最低、成交量等字段,根据自己需要让AI修改即可。
基本功能就是这样了,这时候我们还可以添加功能,比如把当前价格添加到sheet2的最后一行,你就继续问AI:我要做一个按钮,把当前价格作为快照记录到sheet2的最后一行。效果大概就是这样的

这时候AI又会给你一段vba代码,大概是这样的
Sub RecordDataSnapshot()Dim wsSource As WorksheetDim wsTarget As WorksheetDim nextRow As Long' 定义工作表Set wsSource = ThisWorkbook.Sheets("Sheet1")Set wsTarget = ThisWorkbook.Sheets("Sheet2")' 在Sheet2中找到第一列最后一个非空单元格的下一行nextRow = wsTarget.Cells(wsTarget.Rows.Count, "A").End(xlUp).Row + 1' 关键:使用 .Value2 仅复制数值(忽略公式),速度更快更干净wsTarget.Range("A" & nextRow).Value2 = wsSource.Range("A3").Value2 ' 日期wsTarget.Range("B" & nextRow & ":J" & nextRow).Value2 = wsSource.Range("B3:J3").Value2 ' 数据区域' 提示完成(可选,不想弹窗可以把下面这行删掉)MsgBox "数据已固化至 Sheet2 第 " & nextRow & " 行!", vbInformationEnd Sub
每按一次记录按钮,就会把当前的价格作为快照记录到sheet2的最后一行,之后就可以按照sheet2的数据自己做分析,做回测啦。
需要其他更多功能,可以继续向AI提问,不过excel毕竟不是专业工具,还是越简单越好。
另外,如果不需要做数据回测,也就不需要excel的数据处理能力,这就可以做成数据看板模式,一样可以用AI手搓一个html网页来实现。