本人在做一个煤业的项目,项目中用到了很多模板,就是我们今天说的Excel模板,相信大家经常用这个,就不多说了,我在项目中遇到的困难是客户在使用模板的时候不是手动填写的,而是复制的,复制过来的数据可能会带有公式,也可能是别的乱七八糟的东西,这个时候就需要我们进行格式等一系列的验证了,开始我是在java代码中进行验证的,不符合的直接将错误信息响应给用户,但是后来发现这种做法,客户不是很认可,他们觉得应该就是在没导入之前就将错误校验出来,找了好多的办法,最后找到了vba

    说下需求,我的excel要求是在保存的时候或者点击右上角叉号的时候对单元格是否为空和日期格式是否正确进行校验,而且我的单元格中还有一个序号列,应为客户复制过来的数据可能序号对应不起来,我们要在vba中将该序号修改为正确的序号

以下是我的vba代码

    
//点击保存或者ctrl+s的时候执行的方法

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, 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 //这一个if是来判断第一列序号是否正确,不正确就改为正确的(防止粘贴过来的序号是乱的)
            Cells(i, 1) = i - 3
        End If                                          

        If Cells(i, 4) = "" Then
            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   

        If Cells(i, 4) = "" Then
            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 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

该vba未执行前的时候的效果(图中用红圈标出来的均为不符合要求的数据)

关于web项目中使用VBA验证Excel导入

点击保存或者ctrl+s或者点击右上角叉号之后的效果图如下

关于web项目中使用VBA验证Excel导入


关于web项目中使用VBA验证Excel导入

以上效果已达到项目要求,如果还有更好的解决方案欢迎留言

相关文章:

  • 2021-06-29
  • 2021-08-17
  • 2022-12-23
  • 2021-05-08
  • 2021-08-22
  • 2021-11-23
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-12-01
  • 2021-12-25
  • 2021-09-08
  • 2022-12-23
  • 2022-01-01
  • 2021-12-25
相关资源
相似解决方案