重要编辑:此处的主要问题是由隐藏的合并单元格引起的,这些单元格会导致其活动范围的整体性被选中。除非您知道如何使用动态跳过合并的单元格(在动态范围内),它很可能无济于事。相应地改变了问题的完整性
知道我做错了什么?
得到以下代码,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
以下是预期结果:
我得到了什么:
奇怪的是,它只选择有效范围,但就好像它没有注意列,而不是预期的E5:H40我得到B5:I40 知道是什么导致了这个吗?
答案 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”)开始,合并黄色单元格。我想只选择未合并的。使用此代码,我得到了这个:
我的例子是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”中的最后一项