Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel VBA如果行有数据,单元格不能为空_Vba_Excel - Fatal编程技术网

Excel VBA如果行有数据,单元格不能为空

Excel VBA如果行有数据,单元格不能为空,vba,excel,Vba,Excel,我一直在寻找这个答案,但找不到我需要的。我有一个文档,其中用户将粘贴数据,有时多达5000行(这是限制)。它有A-AG列。有些列是必需的,有些不是。我被告知用户可以用空行发布数据 我正在尝试一个宏来提醒用户丢失的数据。我将把它绑定到一个用户表单框。我想解决这个问题的方法是循环从19行(数据开始的地方)到5000行。如果行中有任何数据,请检查所需的列 例如,选中第19行,如果有任何数据,则选中第F列。如果第F列中缺少数据,则生成消息框。我希望这是有意义的,任何帮助都将不胜感激。以下代码将检查19到

我一直在寻找这个答案,但找不到我需要的。我有一个文档,其中用户将粘贴数据,有时多达5000行(这是限制)。它有A-AG列。有些列是必需的,有些不是。我被告知用户可以用空行发布数据

我正在尝试一个宏来提醒用户丢失的数据。我将把它绑定到一个用户表单框。我想解决这个问题的方法是循环从19行(数据开始的地方)到5000行。如果行中有任何数据,请检查所需的列


例如,选中第19行,如果有任何数据,则选中第F列。如果第F列中缺少数据,则生成消息框。我希望这是有意义的,任何帮助都将不胜感激。

以下代码将检查19到5000之间的每一行,查看前33列(即A到AG)中是否有任何非空单元格,然后检查某些单元格以确保它们不是空的。(我武断地决定F、G和J列是强制性的。)


下面的代码将检查19到5000之间的每一行,查看前33列(即A到AG)中是否有任何非空单元格,然后检查某些单元格以确保它们不为空。(我武断地决定F、G和J列是强制性的。)


首先尝试检查行中的所有单元格,如果找到任何数据,则检查所需的项。类似这样的内容(我的VBA已经生锈了,所以这可能不是可复制的,但应该很接近):

Dim行为整数,col为整数,hasData为布尔值
Dim errors()作为字符串,errorText作为字符串
作为字符串的重拨错误(1到1)
世界其他地区=19至5000
hasData=False
`检查此行中的每个单元格是否有数据
对于col=1到33
如果IsEmpty(单元格(行,列).Value)=True,则
hasData=True
退出
如果结束
下一列
如果有数据那么
errorText=“”
`在此验证此行的数据
`如果发现错误,请将errorText设置为非空
如果错误文本为“”,则
错误(UBound(errors))=错误文本
ReDim将错误(1到UBound(errors)+1)保留为字符串
如果结束
如果结束
下一排
`如果发现错误,请将所有错误合并在一起并显示给用户
如果UBound(errors)>1,则MsgBox Join(errors,vbCrLf)

首先尝试检查行中的所有单元格,如果找到任何数据,则检查所需项目。类似这样的内容(我的VBA已经生锈了,所以这可能不是可复制的,但应该很接近):

Dim行为整数,col为整数,hasData为布尔值
Dim errors()作为字符串,errorText作为字符串
作为字符串的重拨错误(1到1)
世界其他地区=19至5000
hasData=False
`检查此行中的每个单元格是否有数据
对于col=1到33
如果IsEmpty(单元格(行,列).Value)=True,则
hasData=True
退出
如果结束
下一列
如果有数据那么
errorText=“”
`在此验证此行的数据
`如果发现错误,请将errorText设置为非空
如果错误文本为“”,则
错误(UBound(errors))=错误文本
ReDim将错误(1到UBound(errors)+1)保留为字符串
如果结束
如果结束
下一排
`如果发现错误,请将所有错误合并在一起并显示给用户
如果UBound(errors)>1,则MsgBox Join(errors,vbCrLf)

其他答案有效,但由于关键规则颠倒,效率较低。除非缺少一个必填字段,否则没有理由检查行是否为空。根据你的问题,规则是:

行必须具有所有必填字段,除非为空

这可以重新表述为:

如果任何必填字段为空,则整行必须为空

第二部分的编程测试非常非常有效,因为如果测试的第一部分为真,您可能会短路:

Sub CheckRows()
    Dim r As Long, c As Long, missingValue As Boolean

    With ActiveSheet
        For r = 1 To 5000
            Select Case True
                Case .Cells(r, "F") = vbNullString:
                    missingValue = True
                Case .Cells(r, "G") = vbNullString:
                    missingValue = True
                Case .Cells(r, "J") = vbNullString:
                    missingValue = True
                Case Else
                    missingValue = False
            End Select
            'This is the ONLY CASE where you need to check if the row is empty.
            If missingValue Then
                If WorksheetFunction.CountA(.Range(.Cells(r, 1), .Cells(r, 33))) > 0 Then
                    MsgBox "Row " & r & " has some compulsory cells not filled in"
                End If
            End If
        Next
    End With
End Sub

其他答案有效,但由于关键规则颠倒,效率较低。除非缺少一个必填字段,否则没有理由检查行是否为空。根据你的问题,规则是:

行必须具有所有必填字段,除非为空

这可以重新表述为:

如果任何必填字段为空,则整行必须为空

第二部分的编程测试非常非常有效,因为如果测试的第一部分为真,您可能会短路:

Sub CheckRows()
    Dim r As Long, c As Long, missingValue As Boolean

    With ActiveSheet
        For r = 1 To 5000
            Select Case True
                Case .Cells(r, "F") = vbNullString:
                    missingValue = True
                Case .Cells(r, "G") = vbNullString:
                    missingValue = True
                Case .Cells(r, "J") = vbNullString:
                    missingValue = True
                Case Else
                    missingValue = False
            End Select
            'This is the ONLY CASE where you need to check if the row is empty.
            If missingValue Then
                If WorksheetFunction.CountA(.Range(.Cells(r, 1), .Cells(r, 33))) > 0 Then
                    MsgBox "Row " & r & " has some compulsory cells not filled in"
                End If
            End If
        Next
    End With
End Sub

使用将所有重要字段过滤为空。使用Suntotal计数以查看筛选器是否找到任何内容,然后将其删除。如果某个列是必需的,但其中没有任何内容,为什么还要关心该行的其余部分?@Comintern-如果某个单元格中有内容,并且(例如)对该列进行了求和,如果该单元格只是垃圾数据,而没有在其他列中填写相应的必填字段,则该总和可能没有意义。因此,如果非强制性字段已填写,则检查强制性字段是否已填写是相当合理的。(或者,另一方面,如果没有强制的领域,没有一个非强制性的领域被填满。)检查是否缺少任何强制措施要有效得多。如果缺少任何必填字段,则该字段无效,除非该行的其余部分有数据。@Comintern-否,如果缺少必填字段,则该行的其余部分有数据,则该字段无效。将使用所有有效字段筛选为空。使用Suntotal计数以查看筛选器是否找到任何内容,然后将其删除。如果某个列是必需的,但其中没有任何内容,为什么还要关心该行的其余部分?@Comintern-如果某个单元格中有内容,并且(例如)对该列进行了求和,如果该单元格只是垃圾数据,而没有相应的强制字段,则总和可能没有意义
Sub CheckRows()
    Dim r As Long, c As Long, missingValue As Boolean

    With ActiveSheet
        For r = 1 To 5000
            Select Case True
                Case .Cells(r, "F") = vbNullString:
                    missingValue = True
                Case .Cells(r, "G") = vbNullString:
                    missingValue = True
                Case .Cells(r, "J") = vbNullString:
                    missingValue = True
                Case Else
                    missingValue = False
            End Select
            'This is the ONLY CASE where you need to check if the row is empty.
            If missingValue Then
                If WorksheetFunction.CountA(.Range(.Cells(r, 1), .Cells(r, 33))) > 0 Then
                    MsgBox "Row " & r & " has some compulsory cells not filled in"
                End If
            End If
        Next
    End With
End Sub