【问题标题】:Last cell selection .End(xlup) using VBA in Excel 2003 'lists' - requires two .Select to get correct cell?最后一个单元格选择 .End(xlup) 在 Excel 2003“列表”中使用 VBA - 需要两个 .Select 才能获得正确的单元格?
【发布时间】:2011-01-05 12:58:34
【问题描述】:

我是 Experts-Exchange 的新用户,因为我注意到他们提高了“免费高级服务”积分门槛。

在包含 Excel“列表”的工作表中使用 End(xlup) 命令时,Excel 2003 似乎存在问题。如果我选​​择在“列表”边界之外的单元格 ,然后尝试使用 VBA 选择工作表中的最后一个单元格,我必须调用 .Select 函数两次以确保获得正确的单元格。如果原始单元格在“列表”边界内,那么我只需要一个.Select。我的破解解决方案如下,有两个选择,因为我永远无法确定保存时可以选择哪个单元格。我在打开时包含版本检查以在 Excel 2007 中运行不同的代码(此代码在 2007 年失败,其中 .End(xlUp) 命令正常工作)。

有没有更雄辩的方法来处理这个问题? 感谢您的帮助!

.Range("A1").Select
.Cells(.Rows.Count, "A").End(xlUp).Select
.Cells(.Rows.Count, "A").End(xlUp).Select
'two .Selects needed to select correct cell in Excel 2003 list because original selection (A1) was not in list'

.Range("A1").Select
.Cells(.Rows.Count, "T").End(xlUp)(-2, 1).Select
.Cells(.Rows.Count, "T").End(xlUp)(-2, 1).Select
'two .Selects needed to select correct cell in Excel 2003 list because original selection (A1) was not in list'

.Cells(.Rows.Count, "T").End(xlUp)(-3, 1).Select
'only one select needed here because original selection above was within the list'

【问题讨论】:

    标签: excel vba list


    【解决方案1】:

    看看这是怎么做的:

    Sub Example()
        Dim rngLstCell As Excel.Range
        Set rngLstCell = GetLastCell(Excel.Worksheets("Sheet1"))
        MsgBox "The last cell is: " & rngLstCell.Address, vbInformation
    End Sub
    
    Public Function GetLastCell(ByVal ws As Excel.Worksheet) As Excel.Range
        Dim rngRtnVal As Excel.Range
        With ws.UsedRange
            Set rngRtnVal = .Find("*", .Cells(1, 1), , , xlByRows, xlPrevious)
            If rngRtnVal Is Nothing Then
                Set rngRtnVal = .Cells(1, 1)
            End If
        End With
        Set GetLastCell = rngRtnVal
    End Function
    

    起初使用 find 可能看起来很奇怪,但由于处理空单元格的方式有些变幻莫测,因此它最终成为最可靠的方法。

    如果您的数据未标准化(锯齿状),这可能并不完美。

    【讨论】:

    • 非常感谢您的建议!
    【解决方案2】:

    我发现我在作用于 .End(xlUp) 单元格之前使用 .End(xlUp).Select 导致了问题。如果我只是在对 .End(xlUp) 单元格进行操作之前避免使用 .End(xlUp).Select,那么问题就不那么复杂了。它可以通过在任何 .End(xlUp) 操作之前使用 .Range("A1").Select 轻松解决。请参阅代码以获取解释。这并不能真正解决不正确的 .End(xlUp) 单元格“选择”问题 - 但我对“选择”单元格不感兴趣,只是对它们进行操作。我必须提到我使用 .Range("A1").Select 因为 A1 不在我通过 VBA 操作的“列表”之外。

    'commented out - just need to add a ".Range("A1").Select" prior to any .End(xlUp) usage (besides .End(xlUp).Select) to make it work in Excel 03
    '.Range("A1").Select
    '.Cells(.Rows.Count, "A").End(xlUp)(0, 1).Select
    '.Cells(.Rows.Count, "A").End(xlUp)(0, 1).Select
    ''two .Selects needed to select correct cell in Excel 2003 'Lists'
    'Set EntryDate = Cells(.Rows.Count, "A").End(xlUp)(0, 1) 'no need to select cell first, then operate on it, as in the code above
    
    'fixed code below
    .Range("A1").Select 'needed for Excel 03 to select correct cell
    Set EntryDate = Cells(.Rows.Count, "A").End(xlUp) 'just operate on the cell instead of selecting it first
    

    【讨论】:

      【解决方案3】:

      您确定您使用的范围是相同的吗?在 Excel 2007 和 2003 中使用 End 属性不会得到不同的结果。

      查看您的代码:

      .Range("A1").Select
      .Cells(.Rows.Count, "A").End(xlUp).Select
      .Cells(.Rows.Count, "A").End(xlUp).Select
      

      每一行代码对彼此的影响都为零。对于 End 属性为何会根据您提供的代码为您提供不同的结果,无法提供诚实的解释。从所写的内容来看,您每次都应该得到相同的结果。 (假设您正在使用相同的范围。)我会怀疑正在执行的任何其他代码。不过,我可以提供一些通用提示:如果您使用 End 从空白单元格开始,它将在第一个非空白单元格处停止。如果从非空白单元格开始,则相反。看下面的截图:

      Range("B13").End(xlUp).Select 'selects B12
      Range("B12").End(xlUp).Select 'selects B2
      Range("A12").End(xlUp).Select 'selects A6
      

      因此,您的列表是否连续是一个问题。此外,在对范围进行操作之前,没有必要选择范围。告诉 Excel 选择单元格 A1 不会影响它的执行方式.Cells(.Rows.Count, "A").End(xlUp).Select。假设该行位于引用工作表的 With 块内,则该代码行与导航到单元格 A65536(或 Excel 2007 中的 A1048576)并按 Ctrl + Up 相同。假设单元格为空白,Excel 将向上导航,直到在 A 列中找到第一个非空白单元格。如果您的 With 块引用范围对象,则该代码行将转到该范围的第一列,底行并向上导航,直到到达第一个空白或非空白单元格。

      【讨论】:

      • 嘿尼克,感谢您的详细帖子...但是两个 Excel 版本都可以正常工作表与预期工作。使用 Excel 的“列表”功能时,行为会发生变化(03 中的数据>列表,. 看起来它在 03 和 07 中的实现方式完全不同。请参阅jkp-ads.com/articles/Excel2007Tables.asp
      • 我刚刚在 Excel 2010 中创建了一个表格,并且能够复制我上面描述的行为,包括 End 属性以及直接在表格中使用的键盘快捷键。
      • 一个想法:您可能在过滤列表上使用 End 吗?这可能会影响您的结果。除此之外,我没有想法。 :)
      • 03 出现问题,Excel 07 按预期工作。我最初在 Excel 07 中创建了列表,并且一切正常,直到我在 03 中打开它,并且结束函数始终是一行。更具体地说,通过使用 End(xlUp).Select 函数选择的单元格会根据先前选择的单元格是否在“列表”内而有所不同。再次感谢你的帮助。我会给你的帖子一个失败的外观和
      • 例如:列表是 A3:D10。我选择单元格 A1(在列表之外),然后运行 ​​End(xlUp).Select 函数,所选单元格在它应该在的位置下方的一行。如果我选择 B4 然后运行 ​​End(xlUp).Select 函数,则会选择正确的单元格。正如你可以想象的那样,这非常令人沮丧。所以我的解决方法是以编程方式确保列表中的单元格在“真正的”选择功能之前被选中。所以我选择 A1(在列表之外),然后运行 ​​.End(xlUp).Select 函数来选择列表中的一个单元格(我可以很容易地选择 A3),然后运行 ​​.End(xlUp).Select跨度>
      猜你喜欢
      • 1970-01-01
      • 2014-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多