为了实现如下的功能:表或查询每相邻两行字段相减。例如下面的这张表或查询,结果是成绩列的每两行相减。

姓名 学号 成绩
小王 001 240
大王 002 260
小王 001 280
大王 002 290
大王 002 260

思路如下:
1、先把表另存一份表1,加一个自增长的ID。
2、表1再另存一份表2。
3、表1和表2用“表1的ID=表2ID-1”来连接,就是相邻两行连接起来。
4、将上面的连接表成绩字段相减,再另存一份。
5、删除表1和表2.

示例模板下载

代码如下:

Option Compare Database

Private Sub Command0_Click()
    On Error GoTo Err_Command0_Click
    
    Dim TableName, FieldName, Temp_TableName, Temp_TableName_2, NewTableName As String '变量定义,分别表示表名 字段名 临时表 临时表2 生成新表表名
    
    TableName = Trim(Text7) '表名
    FieldName = Trim(Text9) '字段名
    Temp_TableName = "Temp_" & TableName '临时表
    Temp_TableName_2 = "Temp_" & TableName & "_2" '临时表2
    NewTableName = "New_" & TableName & FieldName '生成新表表名
    
    
    str1 = "select * into " & Temp_TableName & " from " & TableName '将查询或表另存为临时表
    
    str2 = "Alter table " & Temp_TableName & " Add column ID counter (1,1)" '增加字段ID,自增长
    
    str3 = "select * into " & Temp_TableName_2 & "  from " & Temp_TableName '将临时表复制一份
    
    CurrentDb.Execute (str1) '执行上述三条SQL语句
    
    CurrentDb.Execute (str2)
    
    CurrentDb.Execute (str3)
    
    '将临时表和临时表2用ID连接,然后另存为新表
    
    str4 = "select * into " & NewTableName & "  from ( select [" & Temp_TableName & "].*,[" & Temp_TableName_2 & "]." & FieldName & "-[" & Temp_TableName & "]." & FieldName & " AS " & FieldName & "_差值 from " & Temp_TableName & "  left Join " & Temp_TableName_2 & " on [" & Temp_TableName & "].ID = [" & Temp_TableName_2 & "].ID-1)"
    
    CurrentDb.Execute (str4) '执行上述SQL语句
    
    MsgBox "新表已生成,请稍后按F5刷新", vbOKOnly, "完成提示"
    
    DoCmd.Close '关闭当前窗口
    
    
    CurrentDb.Execute ("drop table " & Temp_TableName & "") '删除临时表
    CurrentDb.Execute ("drop table " & Temp_TableName_2 & "")  '删除临时表2

Exit_Command0_Click:
    Exit Sub

Err_Command0_Click: '上述语句执行出错的话,跳转到这里:类似于TRY CATH的功能(VBA没有)
    MsgBox Err.Description
    CurrentDb.Execute ("drop table " & Temp_TableName & "") '报错的话删除复制的临时表
    CurrentDb.Execute ("drop table " & Temp_TableName_2 & "")
    Resume Exit_Command0_Click
    
End Sub
'取消按钮事件,关闭窗口
Private Sub Command11_Click()
   DoCmd.Close
End Sub