【问题标题】:extend selection to last used column vba将选择扩展到最后使用的列 vba
【发布时间】:2018-07-06 03:05:48
【问题描述】:

代码:

Sub MyColumnSelect()
Dim myCurrentRow As Long
Dim myLastColumn As Long
myCurrentRow = ActiveCell.Row
myLastColumn = ActiveCell.SpecialCells(xlLastCell).Column
Range(ActiveCell, Cells(myCurrentRow, myLastColumn)).Select
End Sub


我需要将我的选择从任何列或任何行扩展到工作表中最后使用的列。此代码将选择扩展到特定列,在我的情况下为column P。我不知道为什么会这样,但即使只有 4 列,它仍然会将选择范围扩展到column P

图片:

PS:我知道我不应该使用select,但即使使用select,我也无法让它工作。需要帮忙。

【问题讨论】:

标签: vba excel


【解决方案1】:

Ron de Bruin - Find last row, column or last cell 告诉你如何找到最后使用的列。

Sub MyColumnSelect()
    Dim myCurrentRow As Long
    Dim myLastColumn As Long
    myCurrentRow = ActiveCell.Row
    myLastColumn = Cells.Find(What:="*", After:=Cells(1, 1), _
                        Lookat:=xlPart, LookIn:=xlFormulas, SearchOrder:=xlByColumns, _
                        SearchDirection:=xlPrevious, MatchCase:=False).Column

    Range(ActiveCell, Cells(myCurrentRow, myLastColumn)).Select
End Sub

这也有效。但请注意,UsedRange 有时可能会将数据扩展到非连续格式。

  Intersect(ActiveCell.EntireRow, ActiveSheet.UsedRange).Select

附录

正如@Rawrplus 指出的那样,使用ActiveCellSelection 是坏习惯,应该避免。观看:Excel VBA Introduction Part 5 - Selecting Cells (Range, Cells, Activecell, End, Offset)

【讨论】:

  • 是的,我的代码也发生了同样的事情。一旦我在 4 列的数据中使用代码,最后使用的列将是 4,但是当我更改数据时,选择仍然是 4 列。你的工作完美。太感谢了。我确实有一个问题,我在上次使用的行中也有同样的问题,你也可以给我答案还是我应该问另一个问题。 ?
  • 阅读Ron de Bruin - Find last row, column or last cellFunction Last(choice As Long, rng As Range) 中的 Select Case 2
  • @TinMan 呸!!! ActiveSheet, .Select On Error Resume next 内部代码..该死的,不要这么残忍,让他学习不好的初学者编码习惯,他将不得不强行忘掉。我绝对建议从这些摘录中学习!
  • @Rawrplus 我添加了免责声明。我在回答这个问题时犹豫不决,但决定回答是因为我之前有热键类似的代码。在格式化和编辑大型工作表时,能够像这样扩展选择非常方便。
【解决方案2】:

谷歌搜索一下绝对会得到答案。这是检索最后一个活跃使用的行的最常用方法

Shets("Sheetname").Cells(Rows.Count, <inColumn>).End(xlUp).Row

和列

Shets("Sheetname").Cells(<inRow>, Columns.Count).End(xlToLeft).Column

在您的情况下,假设您的工作表名为“Sheet1”,它将是:

Dim lr as Long
Dim lc as Long
lr = Sheets("Sheet1").Cells(Rows.Count, 2).End(xlUp).Row
lc = Sheets("Sheet1").Cells(4, Columns.Count).End(xlToLeft).Column

显然,如果您的列范围不同,您应该循环检索它们(例如,遍历所有活动行)

For i = 3 to lr
   lc = Sheets("Sheet1").Cells(i, Columns.Count).End(xlToLeft).Column
   ' do something
Next i

Also, do absolutely read up on why you should not use Select, ActiveSheet and so on..

【讨论】:

  • 感谢您的回答,但仍然无法在我的代码中使用。
  • 它确实有效.. 你只是没有执行我认为的任何事情。例如,在 for 循环中的 lc 分配之后执行 Debug print lc 或检查您的工作表是否命名为“Sheet1”。没有比您在问题中提供的信息更好的答案了
  • 我的意思是,我无法将您的解决方案集成到我的答案中,以将选择从 activecell 扩展到最后使用的列。再次感谢。我试试看。
  • @Rawrplus:完全不使用Select 是一致的。但是如果宏要在当前活动工作表中运行,除了ActiveSheet 之外还应该使用什么?
  • @AxelRichter 我明白你的意思。尽管问题是,在大多数情况下,程序员会知道代码将应用于哪个工作表。我不一定暗示你永远不应该使用ActiveSheet。实际上,即使Select 也有它的用途——但我想说的是,这是一个坏习惯,几乎总是可以避免,只有在绝对必要时才应该使用(几乎从来没有)
【解决方案3】:

试试这个:

Sub MyColumnSelect()

Dim myRow, myLastColumn As Long

 For myRow = 3 To ActiveSheet.Cells(Rows.Count, 2).End(xlUp).Row

  myLastColumn = ActiveSheet.Cells(myRow, Columns.Count).End(xlToLeft).Column

  ActiveSheet.Range(Cells(myRow, 1), Cells(myRow, myLastColumn)).Copy

 Next

End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多