获取可见的行号和列号

时间:2015-11-21 10:02:51

标签: excel excel-vba vba

我的Excel工作表上有一个简单的宏,可以进行一些简单的计算。 会发生的是,为了获得更好的用户体验,我希望宏运行以及完成后返回用户在激活宏之前所在的单元格,以便用户不会在屏幕上看到任何更改

好的,所以不要太难:

Dim activeRow As Integer
Dim activeCol As Integer

Sub myCode

    activeRow = ActiveCell.Row
    activeCol = ActiveCell.Column

    ' code...

    Cells(activeRow, activeCol).Select

End Sub

上面代码的问题是在宏运行之前可见的行和列在结尾处是不一样的,因为宏可能已经向左,向右,向上或向下滚动工作表。

例如,如果工作表中显示的第一行是15或16,则可以在显示屏上看到单元格E26。

所以这里的问题是如何知道在用户显示屏上可见的行号和列号?

我想知道会是这样的:

Dim topLine As Integer
Dim bottomLine As Integer

topLine = ActiveWorksheet.GetVisibleGrid.TopLine
bottomLine = ActiveWorksheet.GetVisibleGrid.BottomLine

2 个答案:

答案 0 :(得分:1)

这是一种方法。我所做的是保存活动单元格。在那里冻结窗格,然后在最后返回那个单元格并解冻窗格。

Dim cell As Range

    'save current cell and freeze panes here
    Set cell = ActiveCell
    ActiveWindow.FreezePanes = True

    'go somewhere way off screen
    Range("A1").Select

    'now go back and remove freeze panes
    cell.Select
    ActiveWindow.FreezePanes = False

答案 1 :(得分:1)

  

re:" ...为了获得更好的用户体验,我想让宏运行,当它完成后返回到用户在激活宏之前所在的单元格,以便用户在屏幕上看不到任何变化。"

最简单的方法是永远不要使用.Select.Activate。使用。Select比引导单元格和工作表引用更可取,并且实际上只需要再使用其中的一半。

有关远离依赖的方法,请参阅How to avoid using Select in Excel VBA macros。选择和.Activate以实现目标。

开始转换代码以消除.Select和.Activate。如果您遇到问题,请在此处或Code Review (Excel)发布您的工作代码。如果它超过一页左右,请张贴它的部分。