【问题标题】:Adding an Offset Row to a Given Range. Excel VBA将偏移行添加到给定范围。 Excel VBA
【发布时间】:2013-07-21 06:38:21
【问题描述】:

我有一个变量,它在开始时设置为给定范围。

我希望有一个循环语句,它将从给定范围的末尾取出下一行并将其添加到该范围。

即:

myRows = Range(1:10)

    For Each cell in myRows

       If cell.Value > 2048 Then

           myRows = myRows + myRows.Offset(1, 0) ---This is where i need help---

基本上我如何在每次循环运行时自动增加范围。

编辑:

另外我将如何添加到范围的前面。以及从范围的后面带走。

Range(1:10) 未隐藏 范围(11:20)被隐藏

我想在未隐藏的范围内添加一个,这将带走隐藏范围,所以它:

Range(1:11) 未隐藏 范围(12:20)被隐藏

【问题讨论】:

  • 所以一旦你的条件得到满足,你基本上想连接当前单元格的值和它正下方的单元格的值?然后,您是否希望保持其正下方单元格的值不变并跳到下一个单元格?还是要删除该行?
  • 更改循环内循环的范围是个坏主意。我认为 Do Loop 可能更合适,但我不知道为什么要增加它,所以很难说。
  • 我在循环中更改它的原因是因为我试图让溢出类型的事情发生。因此,一旦范围内的单元格达到上限,它就会向该范围添加一个新单元格并开始将该单元格填充到其上限,依此类推

标签: excel vba auto-increment


【解决方案1】:

您有 myRows 作为 Variant 数据类型。您需要将其声明为 Range 对象。

Dim myRows as Range

那么您需要使用Set 关键字来分配Range 对象)。

Set myRows = Range("1:10")

然后,使用范围.Resize 方法:

Set myRows = myRows.Resize(myRows.Rows.Count+1, myRows.Columns.Count)

否则,如果您需要将 myRows 保持为 Variant 类型,请告诉我,我可以重新处理。

【讨论】:

  • 忘了提及我确实将它设置为前面的范围,但调整大小看起来像是我正在寻找的。你能看看我在顶部编辑过的帖子,看看调整大小是否能处理同样的事情吗?
  • 我认为可以使用Offset Resize 方法完成,但请注意@Dick Kusleika 的评论,这通常是一个坏主意,可能会导致一些如果您在循环内更改循环范围,则会出现不希望的结果。
  • 我在循环中更改范围的原因是因为我正在寻找某种溢出功能(有点像堆栈溢出),一旦范围中的单元格达到其上限然后一行被添加并且新行开始填满,直到无穷大。
  • 循环将对您添加到范围的行进行操作。
  • 如果添加到循环之外的范围然后有一个 GoTo 命令返回到循环的开头怎么办。这样做如何才能溢出我想要的那种东西?
【解决方案2】:

你也可以使用

Set myRows = Union(myRows, myRows.Offset(1, 0))

编辑:

你要求的!

从通用范围中删除一行

Set myRows = RemoveRowFromRange(myRows, 10)

...

Function RemoveRowFromRange(ByVal Range As Range, row_number As Long) As Range
    With Range.Worksheet
        Select Case row_number
        Case 1
            Set Range = Intersect(Range, .Range(.Rows(2), .Rows(.Rows.Count)))
        Case .Rows.Count
            Set Range = Intersect(Range, .Range(.Rows(1), .Rows(.Rows.Count - 1)))
        Case Else
            Set Range = Union(Intersect(Range, .Range(.Rows(1), .Rows(row_number - 1))), Intersect(Range, .Range(.Rows(row_number + 1), .Rows(.Rows.Count))))
        End Select
    End With
    Set RemoveRowFromRange = Range
End Function

【讨论】:

  • union 将如何处理我添加到原始帖子中的编辑?
  • 这并不容易。如果两个范围都是简单的矩形,你可以使用Set Range2 = Range2.Resize(Range2.Rows.Count-1, Range2.Columns.Count).Offset(1,0)
  • 范围内的单元格中有公式,这是您所说的简单矩形还是实际单元格尺寸?
  • 不是尺寸。选定单元格的形状。您可能有一个复合范围,例如 1:10,12:20,30:30:这个范围由 3 个区域(我称之为“矩形”)组成:1:10 和 12:20 和 30:30。要从此范围中删除一行,您不能只使用.Resize
  • 那么我将如何从一系列隐藏行中取出一行并将其放置在一系列未隐藏行中?
猜你喜欢
  • 2017-10-18
  • 1970-01-01
  • 1970-01-01
  • 2016-05-02
  • 1970-01-01
  • 2014-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多