【问题标题】:Get visible row and column number获取可见的行号和列号
【发布时间】:2015-11-21 18:51:31
【问题描述】:

我的 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

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    re: "... 为了获得更好的用户体验,我希望宏运行并在完成后返回用户激活宏之前所在的单元格,这样用户就不会查看屏幕上的任何变化。”

    最简单的方法是永远不要使用.Select.Activate。在少数情况下,使用 .Select 比直接引用单元格和工作表更可取,而实际上只有一半是必要的。

    请参阅How to avoid using Select in Excel VBA macros,了解摆脱依赖 .Select 和 .Activate 来实现目标的方法。

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

    【讨论】:

    【解决方案2】:

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

    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。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-10
    • 2020-09-21
    • 1970-01-01
    • 2012-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多