VBA:合并在偏移范围方面的行为方式

VBA : How does Merge behave regarding to an Offset'ed Range

提问人:Tounn 提问时间:10/24/2023 最后编辑:Tounn 更新时间:10/25/2023 访问量:46

问:

以下代码中的问题是,被合并的始终是 .rangeRange("A1:B2")

'how the range are set (they're dim'ed as Range)

Set Range1 = Sheet1.Range("A1:B2")
Set Range2 = Sheet2.Range("A1:B2")

For i = 1 To col1.Count 'collection with data which will be used further in the code
    If i <> 1 Then 'checking that we're not at the first item
        Sheet1.Rows(range_row + 2 & ":" & range_row + 3).Insert 'range row = 1 at start
        Sheet2.Rows(range_row + 2 & ":" & range_row + 3).Insert
        Sheet1.Rows("61:62").Delete
        Sheet2.Rows("61:62").Delete
        Set Range1 = Range1.Offset(1, 0) 'I've tried with Offset 2 it changes nothing
        Set Range2 = Range1.Offset(1, 0)
        Range1.Merge
        Range2.Merge
        range_row = range_row + 2
    End If
    'other operations not affecting the size of the range
Next i

目标是合并然后然后等等......Range("A1:B2")Range("A3:B4")Range("A5:B6")

我所拥有的:

目标

Offset方法应将范围向下移动,以便由于该方法可以合并 2 行。显然,经过一些调试后,问题似乎是总是合并。但是在我的代码中,我在这个 Range 中存储了一个值,它位于正确的单元格中.......MergeRange("A1:B2")

是不喜欢偏移范围吗?我应该为我的两个范围做一个不同的声明吗?MergeAs New

请注意,每个变量都是暗淡的,并且具有正确的值,期望 Range。

Excel VBA 循环 范围

评论

0赞 FaneDuru 10/24/2023
我无法理解你试图做什么......什么?有什么价值?为什么你使用变量进行迭代而不使用它?我认为最好尝试用语言解释你尝试做什么。或者更好的是,编辑您的问题并显示两张图片。一个显示现有情况,另一个显示您尝试完成的内容......是否要合并范围 A:B 的两列?我的意思是“A1:B2”、“A3:B4”、“A5:B6”等?如果是这样,基于什么来停止迭代?如果没有,请用语言清楚地解释您尝试做什么。Col1range_rowi
0赞 Tounn 10/24/2023
@FaneDuru 是仅在代码中进一步使用的项的集合。 从 1 开始,就像我在代码中写的注释一样。我想合并等等。就像我现在说的,只有第一个范围()被合并。Col1Range_rowRange("A1:B2")Range("A3:B4")Range("A1:B2")
0赞 Black cat 10/24/2023
合并后的范围有问题。Offset 方法仅生成 A 列中的一个单元格,因为在合并和偏移后,第一个循环的结果为 A4
0赞 Tounn 10/24/2023
@Blackcat 如果你的意思是第一次迭代的合并,我不知道你的意思是什么,因为第一次迭代时没有合并,单元格已经合并了。
0赞 Black cat 10/24/2023
在第二个循环中,范围是合并的范围。当您使用 offset(1,0) 重新定义它时,由于范围已合并,结果只有一个单元格。

答:

2赞 FaneDuru 10/24/2023 #1

请看一下合并两个 adiacent 列的下一个方法:

Sub TesteMergeCells1()
  Dim i As Long
  For i = 1 To 10 Step 2 'use here your collection number of elements instead of 10
    Range("A" & i, "B" & i + 1).merge
  Next i
End Sub

Sub TesteMergeCells2()
  Dim i As Long, rngA As Range
  For i = 1 To 10 Step 2
    Set rngA = Range("A" & i)
    Range(rngA, rngA.Offset(1, 1)).merge
  Next i
End Sub

Sub TesteMergeCells3()
  Dim i As Long, rngAB As Range
  Set rngAB = Range("A1:B2")
  For i = 2 To 6
    rngAB.merge
    Set rngAB = rngAB.Offset(1).Resize(2, 2)
  Next i
End Sub

设置不会产生动态范围。它始终是相同的范围。Set Range1 = Sheet1.Range("A1:B2")

我只是试着展示这个原理。我认为,让它适应你的两张纸应该很容易。现在我必须离开我的办公室......

评论

0赞 Tounn 10/24/2023
很好的解释,它现在对我有用,但这意味着即使我之后像这样重新定义范围,VBA 也会保留传递的第一个定义,这里是一个硬编码值。(我要离开了,我明天会看到答案,但我已经解决了我的问题。Set Range1 = Range1(1, 0)Set
0赞 FaneDuru 10/24/2023
@Etienne NAMUR 您需要调整每个迭代行的范围!