选择动态范围内合并单元格除外的区域

时间:2018-02-28 15:09:59

标签: excel excel-vba vba

重要编辑:此处的主要问题是由隐藏的合并单元格引起的,这些单元格会导致其活动范围的整体性被选中。除非您知道如何使用动态跳过合并的单元格(在动态范围内),它很可能无济于事。相应地改变了问题的完整性

知道我做错了什么?

得到以下代码,fyi函数find_last_row将最后一个活动行的值作为整数返回。在这种情况下,返回的变量将是40

Private Sub initalize_button_Click()

    Dim lastRow As Integer
    Dim ws As Worksheet: Set ws = Sheets("Training_Planner")


    lastRow = find_last_row

    With ws
        .Activate
        .Range("E5:H" & lastRow).Select
    End With


End Sub

非常基本的代码,应该打开工作表Training_Planner并选择从E5到HlastRow (在这种情况下,lastRow是40)所以选择的范围应该是E5:H40

以下是预期结果:

enter image description here

我得到了什么:

enter image description here

奇怪的是,它只选择有效范围,但就好像它没有注意列,而不是预期的E5:H40我得到B5:I40 知道是什么导致了这个吗?

3 个答案:

答案 0 :(得分:1)

好的,首先,如果你的范围总是以E5开始,你的范围是50%dinamic,因为它始终在同一列和同一行开始。你的范围是(单元格(a,b),单元格(c,d)),这意味着a = 5和b = 5(E列)。

另外,你说和Inputbox要求用户提供范围的结束单元格(在你的例子中是H40,但这是动态的)。

因此,我的代码会检查所形成范围内的每个单元格,然后使用Application.Union设置最终大范围。我们不能只使用一个数组来选择所有这些,因为你的范围是动态的,选择带数组的范围限制为30个args,所以我们需要更新每个单元格的FinalRange。

Dim MyCell As Range
Dim RangeWanted As Range
Dim MyFinalRange As Range

Set RangeWanted = Range("E5:" & InputBox("Cell Address")) 'User inputs Final Cell of Range. Start is always E5


'let's get all invididual addresses of each cell inthat dynamic RangeWanted
For Each MyCell In RangeWanted

    If MyCell.MergeCells = False Then 'If not merged, we add it to FinalRange

        If MyFinalRange Is Nothing Then
            Set MyFinalRange = MyCell
        Else
            Set MyFinalRange = Application.Union(MyFinalRange, MyCell)
        End If

    End If
Next MyCell

Set RangeWanted = Nothing

MyFinalRange.Select

使用此代码,从图像中的范围(“E5:H40”)开始,合并黄色单元格。我想只选择未合并的。使用此代码,我得到了这个:

enter image description here

我的例子是Range(“E5:H40”),但它也适用于其他范围。

尝试并根据需要调整代码。

答案 1 :(得分:0)

每当发生类似这样的事情时,只需尽量简化即可。在你的情况下,就是这样:

Sub TestMe()
    Worksheets("Training_Planner").Range("E5:H40").Select
End Sub

如果选择E5:H40则一切正常。如果没有,请尝试手动选择它。可能你有一个隐藏的行,它从B合并到I,因此就是这样。

答案 2 :(得分:0)

而不是: .Range("E5:H" & lastRow).Select

试着这样做: .Range("E5", (Cells(Rows.Count, "H").End(xlUp))).Select

计算“H”所有行,然后向上,直到找到第一个项目。然后它将从“E1”中选择到“H”中的最后一项