---
title: 一键计算华师一卡通的消费记录
date: 2017-04-05T22:43:00+08:00
tags:
  - 技术

---

继上次我写了个PHP脚本抓取我的一卡通消费记录（[用PHP爬取个人一卡通的消费记录](https://blog.izgq.net/archives/789/)）之后，我遇到了一些奇怪的问题。比如说，我统计上个学期的一卡通的花费的时候竟发现少算了400+RMB，百思不得其解。直到前段时间我才发现，原来学校的这个网站查询到的信息是不完整的，有些记录竟然会有缺失，后来我请教了负责这一块的老师，老师表示大概是学校里面某些一卡通的消费机离线时间太长，消费记录没有同步到服务器上，所以造成了这个问题。

所以我花了一晚上重新设计了一个启用了宏功能的Excel表格，写了个vba脚本一键补全那些缺失的消费记录，顺带加上了一键计算每顿饭的总花费的功能（在华师的食堂一般是先在售饭窗口买完饭之后，再去一个个窗口分别点菜，所以消费记录一般都比较零散，一下子不好计算每顿饭的花费。）

使用方法：把脚本得到的 result.csv 表格复制到这个文档中的对应位置，然后点击按钮运行vba脚本，程序将自动把缺失的记录补齐（只能补全价格和余额，其它信息还是需要自己脑补），并算出每个就餐时段的花费。

使用步骤：

1. 清除文档中原有的内容
    
    ![清除内容](https://cdn.zgq.me/assets/posts/2017/calculate-ecard-records/1759449565.png)
    
2. 复制result.csv的数据
    
    ![复制](https://cdn.zgq.me/assets/posts/2017/calculate-ecard-records/46482399.png)
    
3. 粘贴数据
    
    ![粘贴数据](https://cdn.zgq.me/assets/posts/2017/calculate-ecard-records/2320344536.png)
    
4. 运行脚本
    
    ![点击按钮](https://cdn.zgq.me/assets/posts/2017/calculate-ecard-records/3404394566.png)
    
5. 计算完毕
    
    ![计算完毕](https://cdn.zgq.me/assets/posts/2017/calculate-ecard-records/114785882.png)
    

然后就可以愉快地记账啦！！

有兴趣的小伙伴们可以试试：[一卡通账单计算.xlsm](https://gqblog-1251477793.file.myqcloud.com/usr/uploads/2017/04/2207020590.xlsm)

这里不得不吐槽一下，要玩 Office 的话，Windows系统还是离不开的（貌似只有Windows下的office才对vba有完美的支持），无奈的我在这Ubuntu上安了个Windows 7的虚拟机。

VBA代码参考

``` vb
'
' 一键计算 Macro
'
' 首先删除之前的记录
Sheets("Sheet1").Range(Cells(3, 5), Cells(Sheets("Sheet1").UsedRange.Rows.Count, 5)).Clear
' 查找缺失的消费记录
Dim a, i, j, k, total
a = 0
For i = 2 To Sheets("Sheet1").UsedRange.Rows.Count
    If (Abs(Sheets("Sheet1").Cells(i, 2).Value + Sheets("Sheet1").Cells(i, 3).Value - Sheets("Sheet1").Cells(i + 1, 3).Value) > 0.01) Then
        'MsgBox (i)
        Sheets("Sheet1").Rows(i + 1).Insert
        Sheets("Sheet1").Cells(i + 1, 3).Value = Sheets("Sheet1").Cells(i, 2).Value + Sheets("Sheet1").Cells(i, 3).Value
        Sheets("Sheet1").Cells(i + 1, 2).Value = (Sheets("Sheet1").Cells(i + 2, 3).Value - Sheets("Sheet1").Cells(i + 1, 3).Value)
        a = a + 1
    End If
Next
' 更新状态
Sheets("Sheet1").Cells(2, 5).Formula = "=IF(ABS((C2+B2)-C3)<0.01,""正常"", ""异常"")"
Sheets("Sheet1").Range("E2").Select
Selection.AutoFill Destination:=Range(Cells(2, 5), Cells(Application.WorksheetFunction.Count(Sheet1.Range("C:C")), 5)), Type:=xlFillDefault
' MsgBox ("补全了 " & a & "个数据")

'
' 计算每餐的花费 Macro
'
' 首先删除之前的记录
Sheets("Sheet1").Range(Cells(2, 6), Cells(Sheets("Sheet1").UsedRange.Rows.Count, 6)).Clear

total = Application.WorksheetFunction.Count(Sheet1.Range("C:C"))
'MsgBox (total)
For i = 2 To total
    k = i
    j = Cells(i, 2).Value
    Do While (Abs(DateDiff("n", Cells(i, 1).Value, Cells(k + 1, 1).Value)) < 40)
        k = k + 1
        j = j + Cells(k, 2).Value
    Loop
    'MsgBox (k)
    'Cells(i, 6).Value = j
    Cells(i, 6).Formula = "=sum(B" & CStr(i) & ":B" & CStr(k) & ")"
    i = k
Next

MsgBox ("补全了 " & a & " 个数据并算出了每餐的花费")

```
