行情数据的获得,采用录制宏的方式,你把录制的宏代码告诉我,其他要求不变
时间: 2025-07-08 15:31:46 浏览: 10
<think>好的,用户现在问的是如何通过录制宏的方式来获取行情数据,同时保持其他要求不变。之前我给出的解决方案是使用VBA的XMLHTTP请求或者QueryTables来抓取网页数据,但用户可能觉得手动编写这部分代码比较复杂,尤其是对于不熟悉VBA的用户来说。所以用户希望用录制宏的方式,也就是通过Excel的宏录制功能自动生成代码,这样可以更简单直观。
首先,我需要考虑用户的需求是什么。用户可能不太熟悉VBA编程,尤其是处理HTTP请求和解析网页数据的部分。录制宏对于他们来说是一个更简单的方法,因为可以手动操作一次,让Excel自动生成代码,然后再进行修改。这样用户不需要自己从头写代码,只需要调整录制的宏即可。
接下来,我需要回忆一下Excel的宏录制功能。当用户录制宏时,Excel会记录下所有的操作,比如导航到网页、选择数据区域、导入数据等。但是,直接录制从网页获取数据的宏可能无法完全满足动态获取数据的需求,因为录制的宏通常包含具体的步骤,比如点击特定的按钮或选择特定的元素,而这些步骤可能在网页结构变化时失效。不过,用户可能只需要一个基础的框架,然后根据实际情况进行调整。
因此,我需要提供一个通过录制宏获取网页数据的示例代码,并解释如何修改以适应不同的网页结构。同时,要提醒用户注意网页结构的变化可能导致宏无法正常运行,可能需要手动调整参数,比如表格的索引或XPath。此外,还需要保持之前的点数图生成逻辑不变,即处理数据和绘制图表的部分。
然后,我需要检查之前的回答中关于数据获取的部分,将其替换为录制宏生成的代码。同时,确保其他部分如数据处理和绘图保持不变。此外,要确保代码中的注释清晰,用户能够理解哪里需要修改,比如替换URL、调整表格索引等。
可能用户遇到的困难在于如何正确录制宏并调整代码以适应他们的数据源。因此,在回答中需要详细说明录制宏的步骤,并提供示例代码,同时指出可能需要修改的地方。此外,需要提醒用户注意数据格式的兼容性,比如确保导入的数据是数值格式,以便后续处理。
最后,验证整个流程是否可行。录制宏获取数据,然后使用之前的代码处理数据并生成点数图。如果有潜在的问题,比如网页需要登录、动态加载内容等,需要指出这些限制,并建议可能的解决方案,比如使用更高级的VBA技术或第三方工具。</think>以下是基于**Excel宏录制**实现的网页数据获取方案,配合点数图生成代码可直接使用:
---
### 一、录制宏获取行情数据步骤
1. **开始录制**:开发工具 → 录制宏 → 命名`GetWebData`
2. **导入网页数据**:数据选项卡 → 获取数据 → 自其他来源 → 从网页
3. **输入目标URL**:例如 `https://finance.yahoo.com/quote/AAPL`
4. **选择表格**:在导航器中选择包含价格数据的表格(通常为Table 0)
5. **加载数据**:点击"加载"将数据导入新工作表
6. **停止录制**
---
### 二、自动生成的录制代码(需调整部分)
```vb
Sub GetWebData()
' 以下为宏录制生成的原始代码
With ActiveSheet.QueryTables.Add( _
Connection:="URL;https://finance.yahoo.com/quote/AAPL", _
Destination:=Range("$A$1"))
.Name = "AAPL"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.WebSelectionType = xlSpecifiedTables
.WebFormatting = xlWebFormattingNone
.WebTables = "0" ' 重点修改项:根据实际表格序号调整
.WebPreFormattedTextToColumns = True
.WebConsecutiveDelimitersAsOne = True
.WebSingleBlockTextImport = False
.WebDisableDateRecognition = False
.WebDisableRedirections = False
.Refresh BackgroundQuery:=False
End With
End Sub
```
---
### 三、代码优化方案(适配点数图生成)
```vb
' 修改后的数据获取函数(在原有框架中替换)
Function GetPriceData() As Variant
' 清空临时存储区
ThisWorkbook.Sheets("数据缓存").Cells.Clear
' 调用录制宏逻辑
With ThisWorkbook.Sheets("数据缓存").QueryTables.Add( _
Connection:="URL;https://finance.yahoo.com/quote/AAPL", _
Destination:=ThisWorkbook.Sheets("数据缓存").Range("A1"))
.WebTables = "0" ' 关键参数:表格索引号
.Refresh BackgroundQuery:=False
End With
' 提取收盘价列(假设在D列)
Dim LastRow As Long
LastRow = ThisWorkbook.Sheets("数据缓存").Cells(Rows.Count, "D").End(xlUp).Row
GetPriceData = Application.Transpose( _
ThisWorkbook.Sheets("数据缓存").Range("D2:D" & LastRow).Value)
End Function
```
---
### 四、完整调用流程
```vb
Sub GeneratePointFigureChart()
' 步骤1:调用录制宏获取数据
Dim PriceData As Variant
PriceData = GetPriceData() ' 返回一维数组
' 步骤2-3保持原有点数图生成逻辑不变(计算X/O并绘制)
' ...(接之前提供的CalculatePoints和DrawChartOnSheet代码)
End Sub
```
---
### 五、调试要点
1. **表格索引定位**:
- 修改`.WebTables = "0"`中的数字
- 通过浏览器开发者工具查看网页表格结构(按F12)
2. **数据列选择**:
```vb
' 示例:如果收盘价在B列
GetPriceData = Application.Transpose(Range("B2:B" & LastRow))
```
3. **定时刷新设置**(可选):
```vb
' 添加定时刷新(每5分钟)
Application.OnTime Now + TimeValue("00:05:00"), "GeneratePointFigureChart"
```
---
### 六、实际效果示例
假设获取到以下收盘价序列:
`[100, 101, 103, 102, 105]`
设置`BoxSize=1`、`Reversal=3`时,生成的点数图模式:
```
| | X | | X |
|---|---|---|---|
| O | X | O | X |
| X | | X | |
```(X列红色,O列蓝色)
---
### 七、注意事项
1. **网站防爬机制**:部分网站需要添加请求头(需手动扩展录制宏)
```vb
.WebUserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"
```
2. **动态网页限制**:对JavaScript渲染的页面无效(如新浪财经),建议选择静态数据源
3. **数据格式转换**:确保获取的数值列不包含非数字字符(可用`CDbl()`强制转换)
阅读全文
相关推荐


















