EXCEL里添加实时金价并自动刷新的代码

实时金价监控工具是一个基于 Excel/WPS VBA 的数据采集小工具,主要用于通过API接口获取浙商银行积存金实时价格,并在工作表中自动刷新显示。

该功能适合用于黄金投资跟踪、价格监控表、财务分析模板、贵金属看板等工作簿。当用户需要实时关注金价变动时,只需点击按钮即可获取最新价格,并可开启自动刷新模式,无需手动反复查询。

本版本针对表单控件按钮进行了适配,同时也支持从宏列表或VBA编辑器中手动运行。代码中加入了JSON解析、HTTP请求、错误处理、自动刷新调度、状态栏提示等增强逻辑,适合在Excel与WPS表格中直接使用。


📌 核心功能一览

功能 说明
一键获取金价 点击按钮后从API获取最新积存金价格
自动显示时间戳 在价格旁自动记录获取时间
涨跌幅百分比显示 自动解析并显示涨跌幅,支持百分比格式
自动刷新模式 可设置间隔时间,定时自动更新金价
支持表单控件按钮 可通过工作表上的表单按钮触发
支持手动运行 即使不是按钮触发,也可手动执行
智能错误处理 HTTP错误、解析失败时给出友好提示
状态栏提示 获取过程中实时显示状态信息
颜色标识 成功/失败/涨跌均有不同颜色区分
Excel/WPS通用 适用于Microsoft Excel与WPS表格VBA环境
配置参数集中管理 所有可调参数集中在代码顶部,方便修改

⚙️ 项目结构说明

模块组成

模块 类型 作用
标准模块 标准模块 存放所有金价获取和刷新管理代码
工作表按钮 表单控件 点击后调用获取金价或启动自动刷新宏

推荐使用场景

场景 说明
黄金投资跟踪表 实时关注金价变动
贵金属报价看板 大屏展示金价信息
财务分析模板 引用实时金价进行测算
成本核算表 根据金价计算加工成本
价格监控系统 多产品价格监控
个人理财台账 记录黄金资产变动

🚀 使用方式

第一步:打开 VBA 编辑器

在 Excel 或 WPS 表格中按下:

1
Alt + F11

进入 VBA 编辑器。


第二步:插入标准模块

在 VBA 编辑器中依次点击:

1
插入 → 模块

新建一个标准模块,例如 Module1


第三步:粘贴代码

将本文下方的完整 VBA 代码复制到标准模块中。


第四步:配置参数(可选)

在代码顶部的可配置参数区域,可以根据需要修改:

参数 说明 默认值
TARGET_CELL 金价显示位置 A4
TIME_COL_OFFSET 时间戳列偏移 1(B列)
RATE_COL_OFFSET 涨跌幅列偏移 2(C列)
DEFAULT_REFRESH_INTERVAL 默认刷新间隔(秒) 60
PRICE_FORMAT 价格显示格式 0.00
RATE_FORMAT 涨跌幅显示格式 0.00%
COLOR_SUCCESS 成功背景色 浅绿色
COLOR_ERROR 错误背景色 浅红色

第五步:插入表单按钮

返回工作表,依次点击:

1
开发工具 → 插入 → 表单控件 → 按钮

在工作表顶部或右侧放置一个按钮。


第六步:指定宏

给按钮指定宏,可选:

宏名称 功能
GetZSGoldPrice 手动获取一次金价
StartAutoRefresh 启动自动刷新
StopAutoRefresh 停止自动刷新

📋 完整代码

标准模块代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
Option Explicit

' ========================================
' 可配置参数区域 - 修改前请确认
' ========================================

' ----- 单元格位置配置 -----
Public Const TARGET_CELL As String = "A4" ' 金价显示位置
Public Const TIME_COL_OFFSET As Integer = 1 ' 时间戳列偏移(0=同一列,1=B列)
Public Const RATE_COL_OFFSET As Integer = 2 ' 涨跌幅列偏移(0=同一列,2=C列)
Public Const TARGET_SHEET As String = "" ' 工作表名称(空字符串表示使用活动工作表)

' ----- API配置 -----
Public Const API_URL As String = "https://api.jdjygold.com/gw2/generic/jrm/h5/m/stdLatestPrice?productSku=1961543816"
Public Const PRODUCT_SKU As String = "1961543816" ' 产品SKU编码
Public Const REQUEST_BODY_TEMPLATE As String = "{""reqData"": {""productSku"": ""{SKU}""}}"

' ----- HTTP请求头 -----
Public Const HEADER_CONTENT_TYPE As String = "application/json"
Public Const HEADER_ACCEPT As String = "application/json"
Public Const HEADER_ORIGIN As String = "https://www.jd.com"
Public Const HEADER_REFERER As String = "https://www.jd.com/"

' ----- 超时设置(毫秒) -----
Public Const TIMEOUT_RESOLVE As Long = 5000 ' DNS解析超时
Public Const TIMEOUT_CONNECT As Long = 5000 ' 连接超时
Public Const TIMEOUT_SEND As Long = 10000 ' 发送超时
Public Const TIMEOUT_RECEIVE As Long = 10000 ' 接收超时

' ----- 刷新时间配置(秒) -----
Public Const DEFAULT_REFRESH_INTERVAL As Double = 60 ' 默认刷新间隔
Public Const MIN_REFRESH_INTERVAL As Integer = 10 ' 最小刷新间隔
Public Const STATUS_CLEAR_DELAY As Long = 3 ' 状态栏清除延迟

' ----- 显示格式配置 -----
Public Const PRICE_FORMAT As String = "0.00" ' 价格数字格式
Public Const TIME_FORMAT As String = "yyyy-mm-dd hh:mm:ss" ' 时间戳格式
Public Const RATE_FORMAT As String = "0.00%" ' 涨跌幅百分比格式
Public Const LOADING_TEXT As String = "加载中..." ' 加载提示文字
Public Const ERROR_TEXT As String = "错误" ' 错误提示文字
Public Const FAIL_TEXT As String = "获取失败" ' 失败提示文字

' ----- 颜色配置(使用长整型数值,RGB(红,绿,蓝)转换公式:红 + 绿*256 + 蓝*65536) -----
Public Const COLOR_SUCCESS As Long = 14474460 ' RGB(220, 255, 220) 浅绿色
Public Const COLOR_ERROR As Long = 15132391 ' RGB(255, 230, 230) 浅红色
Public Const COLOR_NEUTRAL As Long = 16777215 ' RGB(255, 255, 255) 白色

' ========================================
' 全局变量(运行时修改)
' ========================================
Public RefreshEnabled As Boolean ' 刷新启用标志
Public RefreshInterval As Double ' 当前刷新间隔(秒)
Public NextRefreshTime As Date ' 下一次刷新时间
Public NextStatusClearTime As Date ' 下一次清除状态栏时间
Private RefreshInProgress As Boolean ' 防止重复进入刷新

' ========================================
' 核心功能函数
' ========================================

' 获取浙商银行积存金价格并显示在指定单元格
Sub GetZSGoldPrice(Optional ByVal ShowErrorMessage As Boolean = True)
On Error GoTo ErrorHandler

Dim http As Object
Dim url As String
Dim requestBody As String
Dim response As String
Dim priceValue As Double
Dim targetCell As Range
Dim rateValue As Double

If RefreshInProgress Then Exit Sub
RefreshInProgress = True

' 获取目标单元格
Set targetCell = GetTargetCell()

' 构建请求
url = API_URL
requestBody = BuildRequestBody()

' 状态栏提示
Application.StatusBar = "正在获取金价..."

' 在目标单元格显示加载提示
targetCell.Value = LOADING_TEXT
targetCell.NumberFormat = "@"
targetCell.Interior.Color = COLOR_NEUTRAL

' 清空相邻单元格
ClearAdjacentCells targetCell

' 创建HTTP请求
Set http = CreateObject("MSXML2.ServerXMLHTTP.6.0")

' 发送POST请求
With http
.setTimeouts TIMEOUT_RESOLVE, TIMEOUT_CONNECT, TIMEOUT_SEND, TIMEOUT_RECEIVE
.Open "POST", url, False
.setRequestHeader "Content-Type", HEADER_CONTENT_TYPE
.setRequestHeader "Accept", HEADER_ACCEPT
.setRequestHeader "Origin", HEADER_ORIGIN
.setRequestHeader "Referer", HEADER_REFERER
.send requestBody

' 检查HTTP状态
If .Status <> 200 Then
targetCell.Value = "错误: HTTP " & .Status
targetCell.Interior.Color = COLOR_ERROR
Application.StatusBar = "金价获取失败:HTTP " & .Status

If ShowErrorMessage Then
MsgBox "HTTP错误:" & .Status & " - " & .statusText, vbExclamation, "获取金价失败"
End If

GoTo CleanUp
End If

response = .responseText
End With

' 调试输出
Debug.Print "原始响应: " & response

' 解析JSON提取价格
priceValue = ParseGoldPrice(response)

' 检查是否成功获取价格
If priceValue > 0 Then
' 输出到目标单元格
targetCell.Value = priceValue
targetCell.NumberFormat = PRICE_FORMAT
targetCell.Interior.Color = COLOR_SUCCESS

' 添加时间戳
targetCell.Offset(0, TIME_COL_OFFSET).Value = Now()
targetCell.Offset(0, TIME_COL_OFFSET).NumberFormat = TIME_FORMAT

' 显示涨跌幅(百分比格式)
rateValue = ParseRate(response)
With targetCell.Offset(0, RATE_COL_OFFSET)
.Value = rateValue
.NumberFormat = RATE_FORMAT
.Interior.Color = GetRateColor(rateValue)
End With

' 状态栏提示成功
Application.StatusBar = "金价获取成功:" & Format(priceValue, PRICE_FORMAT) & " 元/克"
ScheduleClearStatusBar STATUS_CLEAR_DELAY
Else
targetCell.Value = FAIL_TEXT
targetCell.Interior.Color = COLOR_ERROR
Application.StatusBar = "金价解析失败"

If ShowErrorMessage Then
MsgBox "未能解析金价数据,请检查网络或API接口。" & vbCrLf & _
"原始响应:" & Left(response, 200), vbExclamation, "解析失败"
End If
End If

CleanUp:
Set http = Nothing
RefreshInProgress = False
Exit Sub

ErrorHandler:
If Not targetCell Is Nothing Then
targetCell.Value = ERROR_TEXT
targetCell.Interior.Color = COLOR_ERROR
End If

Application.StatusBar = "金价获取错误:" & Err.Description

If ShowErrorMessage Then
MsgBox "错误 " & Err.Number & ": " & Err.Description & vbCrLf & _
"发生在: GetZSGoldPrice", vbCritical, "运行时错误"
End If

Resume CleanUp
End Sub

' ========================================
' 辅助函数
' ========================================

' 获取目标单元格
Private Function GetTargetCell() As Range
Dim ws As Worksheet

If TARGET_SHEET <> "" Then
Set ws = ThisWorkbook.Worksheets(TARGET_SHEET)
Else
Set ws = ThisWorkbook.ActiveSheet
End If

Set GetTargetCell = ws.Range(TARGET_CELL)
End Function

' 构建请求体
Private Function BuildRequestBody() As String
BuildRequestBody = Replace(REQUEST_BODY_TEMPLATE, "{SKU}", PRODUCT_SKU)
End Function

' 清除相邻单元格内容
Private Sub ClearAdjacentCells(ByVal targetCell As Range)
If TIME_COL_OFFSET > 0 Then
targetCell.Offset(0, TIME_COL_OFFSET).ClearContents
targetCell.Offset(0, TIME_COL_OFFSET).Interior.Color = COLOR_NEUTRAL
End If

If RATE_COL_OFFSET > 0 And RATE_COL_OFFSET <> TIME_COL_OFFSET Then
targetCell.Offset(0, RATE_COL_OFFSET).ClearContents
targetCell.Offset(0, RATE_COL_OFFSET).Interior.Color = COLOR_NEUTRAL
End If
End Sub

' 根据涨跌幅返回颜色
Private Function GetRateColor(ByVal rateValue As Double) As Long
If rateValue > 0 Then
GetRateColor = RGB(255, 200, 200) ' 浅红色 - 上涨
ElseIf rateValue < 0 Then
GetRateColor = RGB(200, 255, 200) ' 浅绿色 - 下跌
Else
GetRateColor = COLOR_NEUTRAL ' 白色 - 持平
End If
End Function

' ========================================
' JSON解析函数
' ========================================

' 解析JSON中的金价
Private Function ParseGoldPrice(ByVal jsonText As String) As Double
Dim priceStr As String
Dim startPos As Long, endPos As Long

' 方法1:精确查找 "price":" 后面的数字
startPos = InStr(1, jsonText, """price"":""", vbTextCompare)
If startPos > 0 Then
startPos = startPos + 9
endPos = InStr(startPos, jsonText, """")
If endPos > startPos Then
priceStr = Mid(jsonText, startPos, endPos - startPos)
priceStr = Trim(priceStr)
If IsNumeric(priceStr) Then
ParseGoldPrice = CDbl(priceStr)
Debug.Print "解析到金价: " & priceStr
Exit Function
End If
End If
End If

' 方法2:使用正则表达式
Dim regex As Object
Set regex = CreateObject("VBScript.RegExp")

With regex
.Global = False
.IgnoreCase = True
.Pattern = """price""\s*:\s*""([\d.]+)"""

If .Test(jsonText) Then
Dim matches As Object
Set matches = .Execute(jsonText)
If matches.Count > 0 Then
priceStr = matches(0).SubMatches(0)
If IsNumeric(priceStr) Then
ParseGoldPrice = CDbl(priceStr)
Debug.Print "正则解析到金价: " & priceStr
Set regex = Nothing
Exit Function
End If
End If
End If
End With

Set regex = Nothing
ParseGoldPrice = 0
End Function

' 解析涨跌幅(返回百分比数值)
Private Function ParseRate(ByVal jsonText As String) As Double
Dim startPos As Long, endPos As Long
Dim rateStr As String
Dim rateValue As Double

startPos = InStr(1, jsonText, """upAndDownRate"":""", vbTextCompare)
If startPos > 0 Then
startPos = startPos + 17
endPos = InStr(startPos, jsonText, """")
If endPos > startPos Then
rateStr = Mid(jsonText, startPos, endPos - startPos)
rateStr = Trim(rateStr)

If Right(rateStr, 1) = "%" Then
rateStr = Left(rateStr, Len(rateStr) - 1)
End If

If IsNumeric(rateStr) Then
rateValue = CDbl(rateStr) / 100
ParseRate = rateValue
Debug.Print "解析到涨跌幅: " & Format(rateValue, RATE_FORMAT)
Exit Function
End If
End If
End If

ParseRate = 0
End Function

' ========================================
' 状态栏管理
' ========================================

Sub ClearStatusBar()
Application.StatusBar = False
End Sub

Private Sub ScheduleClearStatusBar(ByVal seconds As Long)
On Error Resume Next

If NextStatusClearTime <> 0 Then
Application.OnTime EarliestTime:=NextStatusClearTime, _
Procedure:="ClearStatusBar", _
Schedule:=False
End If

On Error GoTo 0

NextStatusClearTime = DateAdd("s", seconds, Now)
Application.OnTime EarliestTime:=NextStatusClearTime, _
Procedure:="ClearStatusBar", _
Schedule:=True
End Sub

' ========================================
' 自动刷新管理
' ========================================

Sub StartAutoRefresh()
RefreshEnabled = True

If RefreshInterval < MIN_REFRESH_INTERVAL Then
RefreshInterval = DEFAULT_REFRESH_INTERVAL
End If

CancelNextRefresh
Call GetZSGoldPrice(True)
Call ScheduleNextRefresh

MsgBox "自动刷新已启动,每 " & RefreshInterval & " 秒刷新一次", vbInformation, "金价监控"
End Sub

Sub StopAutoRefresh(Optional ByVal ShowMessage As Boolean = True)
RefreshEnabled = False
CancelNextRefresh

If ShowMessage Then
MsgBox "自动刷新已停止", vbInformation, "金价监控"
End If
End Sub

Sub ScheduleNextRefresh()
If RefreshEnabled Then
CancelNextRefresh
NextRefreshTime = DateAdd("s", CLng(RefreshInterval), Now)
Application.OnTime EarliestTime:=NextRefreshTime, _
Procedure:="TimedRefresh", _
Schedule:=True
End If
End Sub

Private Sub CancelNextRefresh()
On Error Resume Next

If NextRefreshTime <> 0 Then
Application.OnTime EarliestTime:=NextRefreshTime, _
Procedure:="TimedRefresh", _
Schedule:=False
NextRefreshTime = 0
End If

On Error GoTo 0
End Sub

Sub TimedRefresh()
If RefreshEnabled Then
Call GetZSGoldPrice(False)
Call ScheduleNextRefresh
End If
End Sub

' ========================================
' 配置管理函数
' ========================================

Sub SetRefreshInterval(seconds As Integer)
If seconds >= MIN_REFRESH_INTERVAL Then
RefreshInterval = seconds

If RefreshEnabled Then
Call ScheduleNextRefresh
End If

MsgBox "刷新间隔已设置为 " & seconds & " 秒", vbInformation, "设置成功"
Else
MsgBox "刷新间隔不能小于 " & MIN_REFRESH_INTERVAL & " 秒,避免被API限制", vbExclamation, "设置无效"
End If
End Sub

Function GetCurrentInterval() As Double
GetCurrentInterval = RefreshInterval
End Function

Function IsAutoRefreshEnabled() As Boolean
IsAutoRefreshEnabled = RefreshEnabled
End Function

' ========================================
' 测试函数
' ========================================

Function TestGoldPrice() As Double
Call GetZSGoldPrice(True)

Dim cell As Range
Set cell = GetTargetCell()

If IsNumeric(cell.Value) Then
TestGoldPrice = CDbl(cell.Value)
Else
TestGoldPrice = 0
End If
End Function

Sub TestAPIConnection()
Dim startTime As Double
startTime = Timer

Call GetZSGoldPrice(True)

MsgBox "API测试完成,耗时: " & Format(Timer - startTime, "0.00") & " 秒", vbInformation, "测试完成"
End Sub

' ========================================
' 重置所有设置
' ========================================

Sub ResetToDefaults()
If RefreshEnabled Then
Call StopAutoRefresh(False)
End If

RefreshInterval = DEFAULT_REFRESH_INTERVAL
RefreshEnabled = False
NextRefreshTime = 0
NextStatusClearTime = 0
RefreshInProgress = False

Call ClearStatusBar

Dim cell As Range
Set cell = GetTargetCell()
cell.ClearContents
cell.Interior.Color = COLOR_NEUTRAL
ClearAdjacentCells cell

MsgBox "已重置为默认配置", vbInformation, "重置完成"
End Sub

🔍 技术要点详解

1. API 数据获取

代码使用 MSXML2.ServerXMLHTTP.6.0 对象发送 POST 请求:

1
Set http = CreateObject("MSXML2.ServerXMLHTTP.6.0")

该对象支持设置超时时间,避免长时间等待:

1
.setTimeouts TIMEOUT_RESOLVE, TIMEOUT_CONNECT, TIMEOUT_SEND, TIMEOUT_RECEIVE

API 地址和请求体均可通过顶部常量配置,方便切换不同产品。


2. JSON 数据解析

代码提供了两种 JSON 解析方式:

方式一:字符串查找

1
startPos = InStr(1, jsonText, """price"":""", vbTextCompare)

方式二:正则表达式(备用)

1
.Pattern = """price""\s*:\s*""([\d.]+)"""

双重解析机制提高了数据提取的可靠性。


3. 涨跌幅百分比处理

API 返回的涨跌幅为百分比字符串(如 “15%”),代码将其转换为数值类型:

1
2
3
4
If Right(rateStr, 1) = "%" Then
rateStr = Left(rateStr, Len(rateStr) - 1)
End If
rateValue = CDbl(rateStr) / 100

再通过单元格格式 RATE_FORMAT 显示为 “15.00%”。


4. 自动刷新调度

使用 Application.OnTime 实现定时刷新:

1
2
3
Application.OnTime EarliestTime:=NextRefreshTime, _
Procedure:="TimedRefresh", _
Schedule:=True

调度管理包含:

  • 取消旧任务避免重复
  • 间隔时间可动态调整
  • 最小间隔限制避免 API 限制

5. 状态栏反馈

整个获取过程通过状态栏向用户反馈进度:

1
2
Application.StatusBar = "正在获取金价..."
Application.StatusBar = "金价获取成功:" & Format(priceValue, PRICE_FORMAT) & " 元/克"

获取完成后自动清除状态栏:

1
ScheduleClearStatusBar STATUS_CLEAR_DELAY

6. 错误处理机制

代码包含多层错误处理:

  • HTTP 状态检查If .Status <> 200 Then
  • 数据解析失败If priceValue > 0 Then
  • 运行时错误On Error GoTo ErrorHandler

错误信息通过状态栏和消息框双重提示。


7. 配置参数集中管理

所有可调整参数集中在代码顶部:

1
2
3
4
5
6
7
8
' ----- 单元格位置配置 -----
Public Const TARGET_CELL As String = "A4"
Public Const TIME_COL_OFFSET As Integer = 1
Public Const RATE_COL_OFFSET As Integer = 2

' ----- 刷新时间配置 -----
Public Const DEFAULT_REFRESH_INTERVAL As Double = 60
Public Const MIN_REFRESH_INTERVAL As Integer = 10

用户无需深入代码逻辑即可调整关键参数。


8. 颜色标识系统

不同状态使用不同颜色区分:

状态 颜色 说明
成功获取 浅绿色 数据正常
获取失败 浅红色 请求或解析错误
价格上涨 浅红色 涨跌幅 > 0
价格下跌 浅绿色 涨跌幅 < 0
价格持平 白色 涨跌幅 = 0

📊 相比普通金价获取代码的优化改进

优化项 普通代码 本增强版
数据获取 固定单元格 可通过配置修改目标位置
自动刷新 通常无 支持定时自动刷新
错误处理 简单或无 完善的错误处理机制
状态反馈 状态栏全程反馈
涨跌幅显示 文本显示 百分比格式化显示
颜色标识 成功/失败/涨跌颜色区分
JSON解析 单一方法 双重解析机制
超时控制 可配置超时时间
配置管理 硬编码 集中参数配置
工作表支持 仅活动表 支持指定工作表
测试功能 内置测试函数

💡 可自定义参数

修改显示位置

默认金价显示在 A4 单元格:

1
Public Const TARGET_CELL As String = "A4"

可修改为任意单元格,例如:

1
2
Public Const TARGET_CELL As String = "B2"   ' 显示在 B2
Public Const TARGET_CELL As String = "F10" ' 显示在 F10

修改刷新间隔

默认每 60 秒刷新一次:

1
Public Const DEFAULT_REFRESH_INTERVAL As Double = 60

可修改为更短或更长的间隔:

1
2
Public Const DEFAULT_REFRESH_INTERVAL As Double = 30   ' 30 秒
Public Const DEFAULT_REFRESH_INTERVAL As Double = 120 ' 2 分钟

修改显示格式

价格格式:

1
Public Const PRICE_FORMAT As String = "0.00"

时间格式:

1
Public Const TIME_FORMAT As String = "yyyy-mm-dd hh:mm:ss"

涨跌幅格式:

1
Public Const RATE_FORMAT As String = "0.00%"

修改颜色值

使用 RGB 数值公式:红 + 绿*256 + 蓝*65536

1
2
' 示例:修改成功颜色为蓝色
Public Const COLOR_SUCCESS As Long = 16711680 ' RGB(0, 0, 255)

更换API产品

1
2
Public Const PRODUCT_SKU As String = "1961543816"        ' 产品SKU
Public Const REQUEST_BODY_TEMPLATE As String = "{""reqData"": {""productSku"": ""{SKU}""}}"

如需查询其他产品,只需修改 PRODUCT_SKU 即可。


🧩 扩展功能建议

多产品监控

可以在不同单元格监控不同产品:

1
2
3
4
5
6
7
8
9
10
11
Sub GetMultipleGoldPrices()
' 产品1
PRODUCT_SKU = "1961543816"
TARGET_CELL = "A4"
Call GetZSGoldPrice(False)

' 产品2
PRODUCT_SKU = "1961543817"
TARGET_CELL = "A10"
Call GetZSGoldPrice(False)
End Sub

数据记录

添加历史记录功能:

1
2
3
4
5
6
7
8
Sub RecordGoldPrice()
Dim lastRow As Long
lastRow = ThisWorkbook.ActiveSheet.Cells(Rows.Count, "E").End(xlUp).Row + 1

ThisWorkbook.ActiveSheet.Range("E" & lastRow).Value = Now()
ThisWorkbook.ActiveSheet.Range("F" & lastRow).Value = ThisWorkbook.ActiveSheet.Range("A4").Value
ThisWorkbook.ActiveSheet.Range("G" & lastRow).Value = ThisWorkbook.ActiveSheet.Range("C4").Value
End Sub

价格预警

设置价格上下限提醒:

1
2
3
4
5
6
7
8
9
10
Sub CheckPriceAlert()
Dim currentPrice As Double
currentPrice = ThisWorkbook.ActiveSheet.Range("A4").Value

If currentPrice > 500 Then
MsgBox "金价已超过500元/克!", vbInformation, "价格预警"
ElseIf currentPrice < 400 Then
MsgBox "金价已低于400元/克!", vbInformation, "价格预警"
End If
End Sub

🛠️ 按钮设置建议

推荐按钮组合

按钮名称 用途
获取金价 GetZSGoldPrice 手动获取一次
启动刷新 StartAutoRefresh 开启自动刷新
停止刷新 StopAutoRefresh 关闭自动刷新
设置间隔 SetRefreshInterval 修改刷新间隔
测试连接 TestAPIConnection 测试API可用性

按钮文字建议

1
获取金价

或:

1
💰 获取实时金价

自动刷新按钮:

1
▶ 启动自动刷新

📐 推荐布局方式

位置 说明
冻结窗格右上方 按钮始终可见
价格显示区域旁 操作直观
独立控制面板 集中管理所有控制按钮

⚠️ 注意事项

  1. 本代码需要 联网 才能获取金价数据。
  2. API 接口可能有访问频率限制,不建议设置过短的刷新间隔。
  3. 默认最小刷新间隔为 10 秒,避免被 API 限制。
  4. 如果返回 “获取失败”,请检查网络连接或 API 是否可用。
  5. 部分网络环境可能需要配置代理或防火墙例外。
  6. WPS 表格对 VBA 的支持与 Excel 基本一致,但不同版本表现可能略有差异。
  7. 若宏安全级别较高,需要启用宏后才能使用。
  8. API 响应结构变化时,可能需要调整 JSON 解析逻辑。
  9. 长时间运行自动刷新可能会消耗较多系统资源。
  10. 建议在非工作时间进行大规模测试。

📦 常见问题

Q1:为什么获取不到金价?

可能原因:

  • 网络连接异常
  • API 接口暂时不可用
  • 产品 SKU 不正确
  • 防火墙阻止了请求
  • API 响应结构发生变化

建议运行 TestAPIConnection 测试连接。


Q2:刷新间隔可以设置多短?

最小间隔为 10 秒,这是为了避免被 API 限制。如需更短间隔,可以修改:

1
Public Const MIN_REFRESH_INTERVAL As Integer = 5   ' 改为5秒

但请注意 API 的使用限制。


Q3:可以同时监控多个产品吗?

可以。可以复制代码并为不同产品创建不同的配置。


Q4:数据会保存吗?

当前版本只显示最新数据,不保存历史记录。如需记录,可以参考扩展功能中的历史记录代码。


Q5:WPS 表格可以用吗?

通常可以使用。但需要确保 WPS 已安装 VBA 支持组件。


Q6:如何修改价格显示的颜色?

修改顶部配置中的颜色常量:

1
2
Public Const COLOR_SUCCESS As Long = 14474460   ' 成功颜色
Public Const COLOR_ERROR As Long = 15132391 ' 错误颜色

颜色值计算公式:红 + 绿*256 + 蓝*65536


💡 扩展方向

方向 说明
多产品监控 同时监控多个黄金产品
历史记录 自动记录价格变动历史
价格预警 价格超过阈值时提醒
图表展示 自动生成价格走势图
数据导出 导出历史数据到 CSV
邮件通知 价格变动时发送邮件
微信推送 通过 API 推送价格变动
多数据源 同时从多个 API 获取数据
汇率转换 自动转换不同货币计价
成本计算 根据金价自动计算加工成本

📞 技术支持

官网:

求助建议: http://xlcs.de/

邮件联系: admin@fdc.sd


📷 效果展示

实时金价监控效果

金价自动获取并显示在A4单元格,B列为时间戳,C列为涨跌幅

💎 浙商银行积存金
--.--
元/克
涨跌幅
--.--%
更新时间
--:--:--
点击刷新获取最新金价

XLCS — 让全成本测算更智能