2017-04-10 80 views
1

我想创建一个宏来验证是否填写了非连续范围,然后删除包含值的最后一行后面的空行。VBA来验证,如果非连续范围包含值

Sheet to validate

在上述图像,列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删除空行,如下所示,并希望在验证完成后运行该行。

不幸的是代码示例工具不合作,所以我包含了一个图像。 Code sample

不确定是否有任何意义,如果您需要澄清,请让我知道。任何和所有的帮助,非常感谢!

+0

因此,如果任何一行有A,D,G,H或I列中的任何一个条目,那么必须有一个条目?其他栏中是否有任何数据? – SJR

+0

正确的,如果A,D,G,H或I列中的任何一个条目都有条目,那么必须有条目。在B,C,E,F,J或K列中也可能有值,但不是强制性的。 K将是可能包含值的最后一列。 – JC3

回答

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 
+0

非常感谢!这正是我正在寻找的,我留下的一个问题是如何在验证完成后合并删除空行子。 – JC3

+0

很高兴工作。在我看来,如果该代码将删除包含空白的任何行,但如果您在某些列中说空白是合法的,那么您认为不需要那么做?如果在运行上面的代码之后你有空白,你不希望用户在删除之前能够填充它们(在这种情况下你会删除什么?) – SJR

+0

是的,这是一个监督我这边。我忘记了我使用该子用户清除工作表重新开始。基本上我以前的做法是,在验证通过后,删除最后填写的行后面的所有内容。因此,如上图所示,如果所有四行都被正确填写以删除第6行和第6行。 – JC3