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