使用Selection.Find后按名称选择VBA整列的问题
解决VBA按列名选中整列的问题
嘿,我来帮你搞定这个问题!你的代码里的问题出在过度依赖Select和Activate,而且最后那行Selection.End(xlUp).Select完全没起到你想要的作用——因为此时的Selection还是整个第一行,所以End(xlUp)只会停在第一行,自然选不到目标列。
咱们换个更可靠的思路,尽量避免用Select/Activate(这可是VBA写代码的最佳实践,能减少很多莫名其妙的bug),直接定位到目标表头,然后操作对应的列:
方案1:选中整列(不管数据是否连续)
如果你就是要选中整个列,不管里面有没有数据,用这段代码就行:
Dim targetHeader As Range ' 在第一行查找目标列名 Set targetHeader = Rows("1:1").Find(What:="LongColumnName", _ LookIn:=xlFormulas, LookAt:=xlPart, _ SearchOrder:=xlByRows, SearchDirection:=xlNext, _ MatchCase:=False, SearchFormat:=False) ' 先检查有没有找到目标 If Not targetHeader Is Nothing Then ' 选中该列的所有单元格 targetHeader.EntireColumn.Select Else MsgBox "没找到名为LongColumnName的列哦!" End If
方案2:选中列中所有有数据的单元格(支持非连续)
如果你的列里有非连续的数据,只想选中有内容的部分,试试这段:
Dim targetHeader As Range, dataRange As Range Set targetHeader = Rows("1:1").Find(What:="LongColumnName", _ LookIn:=xlFormulas, LookAt:=xlPart, _ SearchOrder:=xlByRows, SearchDirection:=xlNext, _ MatchCase:=False, SearchFormat:=False) If Not targetHeader Is Nothing Then ' 先尝试选中常量单元格,再尝试公式单元格(覆盖所有非空内容) On Error Resume Next ' 防止列里只有表头的情况报错 Set dataRange = targetHeader.EntireColumn.SpecialCells(xlCellTypeConstants) If dataRange Is Nothing Then Set dataRange = targetHeader.EntireColumn.SpecialCells(xlCellTypeFormulas) End If On Error GoTo 0 If Not dataRange Is Nothing Then dataRange.Select Else ' 如果列里只有表头,就选中表头单元格 targetHeader.Select End If Else MsgBox "没找到名为LongColumnName的列哦!" End If
为啥你的原代码不行?
简单说:你先Select了第一行,之后Find并Activate目标单元格,但此时Selection仍然是整个第一行(Activate只是让单元格成为活动单元格,不会改变选中范围),所以Selection.End(xlUp).Select当然还是选中第一行,根本没碰目标列。
以后写VBA尽量少用Select和Activate,直接用变量存储Range对象,代码更稳定,也更容易维护!
内容的提问来源于stack exchange,提问作者user9719232
相关产品推荐
相关产品推荐

