【问题标题】:VBA to validate if non-continuous range contains valuesVBA验证非连续范围是否包含值
【发布时间】:2017-04-10 18:21:45
【问题描述】:

我正在尝试创建一个宏来验证是否填写了非连续范围,然后在包含值的最后一行之后删除空行。

在上图中,A、D、G、H、I 列是必填字段。如果一个包含一个值,则其余必填字段也必须包含一个值。绿色突出显示的单元格是可以通过验证的输入示例,而黄色将需要失败,因为 A 和 G 中的值未填写。

我尝试了以下方法:

Sub Validate()
Dim Cell As Range
For Each Cell In Union(Range("A2:A3"), Range("D2:D3"), Range("G2:G3"), Range("H2:H3"), Range("I2:I3"))
    If IsEmpty(Cell) Then
        MsgBox ("Error: All mandatory fields must be filled out") 'actions To Do If True
End If
Next
End Sub

问题在于,每次用户输入信息时,行数都会有所不同,一旦完成,其余行就会留空。我不太确定如何进行,因为我对 VBA 和一般编码都很陌生。我希望某种检查这些必填字段并在遇到空行时停止的循环可以解决问题,但是我对编码真的不太了解。

我发现 VBA 可以删除空行,如下所示,并希望在验证完成后运行它。

不幸的是,代码示例工具没有配合,所以我添加了一个图片。

不确定其中是否有任何意义,如果您需要澄清,请告诉我。非常感谢任何和所有帮助!

【问题讨论】:

  • 那么,如果任何行在 A、D、G、H 或 I 列中的任何一个中有一个条目,那么总有一个条目吗?其他列有数据吗?
  • 正确,如果 A、D、G、H 或 I 列中的任何一个中有条目,那么所有条目中都必须有一个条目。 B、C、E、F、J 或 K 列中也可能有值,但不是强制性的。 K 将是可以包含值的最后一列。

标签: excel vba


【解决方案1】:

好的,试试这个。当您发现无效行时,我不确定您想要发生什么 - 这只是显示一个消息框。

Sub x()

Dim rFind As Range, r1 As Range, r As Long

With Sheet1
    Set rFind = .Cells.Find(What:="*", After:=.Cells(1), LookAt:=xlWhole, _
                            SearchOrder:=xlByRows, SearchDirection:=xlPrevious, SearchFormat:=False)

    If Not rFind Is Nothing Then
        For r = 2 To rFind.Row
            Set r1 = Union(Cells(r, "A"), Cells(r, "D"), Cells(r, "G"), Cells(r, "H"), Cells(r, "I"))
            If WorksheetFunction.Count(r1) > 0 And WorksheetFunction.CountA(r1) < r1.Count Then
                MsgBox r & " incomplete"
            End If
        Next r
    End If
End With

End Sub

【讨论】:

  • 非常感谢!这正是我一直在寻找的,我留下的一个问题是如何在验证完成后合并删除空行子。
  • 很高兴它成功了。在我看来,该代码似乎会删除任何包含空白的行,但是如果您说某些列中的空白是合法的,您认为您不想要吗?如果您在运行上面的代码后有空白,您不希望用户在进行任何删除之前能够填充它们(在这种情况下您将删除什么?)
  • 是的,这对我来说有点疏忽。我忘记了我使用该 sub 让用户清除工作表以重新开始。本质上,我所追求的是一种方式,在验证通过后,在最后填写的行之后删除所有内容。所以说在上图中,如果所有四行都正确填写删除第6行及以下。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-11
  • 2015-06-26
  • 1970-01-01
  • 2017-11-15
  • 1970-01-01
  • 1970-01-01
  • 2021-05-28
相关资源
最近更新 更多