本人在做一个煤业的项目,项目中用到了很多模板,就是我们今天说的Excel模板,相信大家经常用这个,就不多说了,我在项目中遇到的困难是客户在使用模板的时候不是手动填写的,而是复制的,复制过来的数据可能会带有公式,也可能是别的乱七八糟的东西,这个时候就需要我们进行格式等一系列的验证了,开始我是在java代码中进行验证的,不符合的直接将错误信息响应给用户,但是后来发现这种做法,客户不是很认可,他们觉得应该就是在没导入之前就将错误校验出来,找了好多的办法,最后找到了vba
说下需求,我的excel要求是在保存的时候或者点击右上角叉号的时候对单元格是否为空和日期格式是否正确进行校验,而且我的单元格中还有一个序号列,应为客户复制过来的数据可能序号对应不起来,我们要在vba中将该序号修改为正确的序号
以下是我的vba代码
//点击保存或者ctrl+s的时候执行的方法
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, cancel As Boolean)
//声明变量
Dim i As IntegerDim j As Integer
Dim g As Integer
For i = 4 To Range("B65536").End(xlUp).Row
If Cells(i, 1) <> i - 3 Then //这一个if是来判断第一列序号是否正确,不正确就改为正确的(防止粘贴过来的序号是乱的)
Cells(i, 1) = i - 3
End If
j = j + 1
Cells(i, 4).Interior.ColorIndex = 3 //为空的时候设为红色
Else
Cells(i, 4).Interior.ColorIndex = xlAutomatic //不为空的时候设为默认色
End If
If Cells(i, 5) = "" Then
j = j + 1
Cells(i, 5).Interior.ColorIndex = 3
Else
Cells(i, 5).Interior.ColorIndex = xlAutomatic
End If
If TypeName(Cells(i, 7).Value) = "Date" Then
Cells(i, 7).Interior.ColorIndex = xlAutomatic //如果是date类型数据设为默认色
ElseIf Cells(i, 7) = "" Then
j = j + 1
Cells(i, 7).Interior.ColorIndex = 3 //如果为空设为红色
Else
g = g + 1
Cells(i, 7).Interior.Color = vbBlue //如果不是date类型数据设为蓝色
End If
Next
If j > 0 Then
MsgBox "标红的列为必填项,请为此填充数据,否则该模板无法保存,也无法在安全系统中导入!", vbCritical, "隐患批量导入错误提示" //单元格为空的时候的提示
End If
If g > 0 Then
MsgBox "标蓝的列为日期列,日期格式与指定日期格式不符,请参考表头示例将数据修改为指定日期格式数据,否则该模板无法保存,也无法在安全系统中导入!", vbCritical, "隐患批量导入错误提示" //日期格式不正确的时候的提示
End If
If j > 0 Or g > 0 Then
cancel = True
End If
End Sub
//点击右上角叉号执行的方法(此方法和上边的方法相同只有方法名不一样,详细注释参考上个方法)
Private Sub workbook_beforeclose(cancel As Boolean)
Dim i As Integer
Dim j As Integer
Dim g As Integer
For i = 4 To Range("B65536").End(xlUp).Row
If Cells(i, 1) <> i - 3 Then
Cells(i, 1) = i - 3
End If
j = j + 1
Cells(i, 4).Interior.ColorIndex = 3
Else
Cells(i, 4).Interior.ColorIndex = xlAutomatic
End If
If Cells(i, 5) = "" Then
j = j + 1
Cells(i, 5).Interior.ColorIndex = 3
Else
Cells(i, 5).Interior.ColorIndex = xlAutomatic
End If
If TypeName(Cells(i, 7).Value) = "Date" Then
Cells(i, 7).Interior.ColorIndex = xlAutomatic
ElseIf Cells(i, 7) = "" Then
j = j + 1
Cells(i, 7).Interior.ColorIndex = 3
Else
g = g + 1
Cells(i, 7).Interior.Color = vbBlue
End If
Next
If j > 0 ThenMsgBox "标红的列为必填项,请为此填充数据,否则该模板无法保存,也无法在安全系统中导入!", vbCritical, "隐患批量导入错误提示"
End If
If g > 0 Then
MsgBox "标蓝的列为日期列,日期格式与指定日期格式不符,请参考表头示例将数据修改为指定日期格式数据,否则该模板无法保存,也无法在安全系统中导入!", vbCritical, "隐患批量导入错误提示"
End If
If j > 0 Or g > 0 Then
cancel = True
End If
End Sub
该vba未执行前的时候的效果(图中用红圈标出来的均为不符合要求的数据)
点击保存或者ctrl+s或者点击右上角叉号之后的效果图如下
以上效果已达到项目要求,如果还有更好的解决方案欢迎留言