从VBA中的联合体生成的行范围中删除一行

这似乎应该是简单的执行,但对我来说,我找不到适当的命令或伎俩。

在我的macros中,我使用范围和循环中新行之间的联合系统地生成一个行的范围:

Set DesiredRange = Union(DesiredRange, ActiveSheet.Cells(Val(ParsedText(Count)), 1).EntireRow) 

然而,为了使这个联合工作,我必须首先设置DesiredRange等于一些范围,以便联盟不会出错。

我遇到的麻烦是有一些行数,我需要排除,但行是从一个userform文本框,允许用户input任何他们希望(我已经在错误控制编码,所以传递的值是有效的),所以他们可以假设做出第一个值(因此我正在使用的初始化范围)一个被排除的行。

我希望这里有人可以有一个解决scheme,允许我完成所有的操作,然后删除该范围内的第一个添加的行,如果它在被排除的类别(行1到7)。 如果没有,我想我可能会有一个解决办法(但我的一部分是问这个问题更多的教育,而不是解决问题)

谢谢!

我想你想要一个像Range.Except这样的函数来补充Range.IntersectRange.Union但是AFAIK没有这样的函数被内置到VBA中,你必须自己编写它。 像下面的东西将执行你想要的,并自动从Union排除不需要的行。 variablesstrRowsToExclude可能会从您的表单传递给该方法:

 Sub Test() Dim rngTarget As Range Dim strRowsToExclude As String Dim varRowsToExclude As Variant Dim intCounter1 As Integer Dim intCounter2 As Integer Dim blnDoNotAdd As Boolean Set rngTarget = Nothing strRowsToExclude = "1,4,45,87,88,99" varRowsToExclude = Split(strRowsToExclude, ",") For intCounter1 = 1 To 100 blnDoNotAdd = False For intCounter2 = 0 To UBound(varRowsToExclude) If intCounter1 = Val(varRowsToExclude(intCounter2)) Then blnDoNotAdd = True End If Next intCounter2 If blnDoNotAdd = False Then If rngTarget Is Nothing Then Set rngTarget = Sheet1.Cells(intCounter1, 1).EntireRow Else Set rngTarget = Union(rngTarget, Sheet1.Cells(intCounter1, 1).EntireRow) End If End If Next intCounter1 rngTarget.Select End Sub 

你可以这样做:

 Option Explicit Sub main() Dim desiredRng As Range, forbiddenRows As Range, cell As Range Dim rowsStrng As String Dim i As Long With ActiveSheet Set forbiddenRows = .Range("1:1, 3:5, 7:7, 9:11") '<~~ set forbidden rows, you can use multiple rows sintax For i = 1 To 10 '<~~ this is your "Union" loop, ' do stuff to get to following line Set cell = .Cells(Val(ParsedText(Count)), 1) If Intersect(cell, forbiddenRows) Is Nothing Then rowsStrng = rowsStrng & cell.Row & ":" & cell.Row & "," '<~~ add row index only if not forbidden Next i If rowsStrng <> "" Then Set desiredRng = .Range(Left(rowsStrng, Len(rowsStrng) - 1)) End With End Sub 

展开Rory的评论:

 Dim DesiredRange As Range, rng As Range '...in your loop Set rng = ActiveSheet.Cells(Val(ParsedText(Count)), 1).EntireRow If DesiredRange Is Nothing Then Set DesiredRange = rng Else Set DesiredRange = Application.Union(DesiredRange, rng) End If