根据各种可能的标题名称选择一列

时间:2014-02-07 18:09:50

标签: excel vba excel-vba

根据各种不同的可能标题名称选择列的最有效方法是什么?例如,以下内容为我提供了标题为“school”的列:

Rows("1:1").Select
Selection.Find(What:="School", _
After:=ActiveCell, _
LookIn:=xlFormulas, _
LookAt:=xlPart, _
SearchOrder:=xlByRows, _
SearchDirection:=xlNext, _
MatchCase:=False).Activate
ActiveCell.Select
Range(ActiveCell, ActiveCell.Offset(6536, 0)).Select

然而,“学校”可能是另一本工作簿中的“大学”,或另一本书中的“机构”。我是否应该将上述代码放在if-then-else语句中并将“school”替换为其他可能性,或者是否有更有效的方法?是的,这假设在同一工作簿中没有可能的头名称共存。

1 个答案:

答案 0 :(得分:1)

Find已经非常有效了。所有那些Select的效率都不高。

我建议您将查找标题逻辑包装到Function中,并重构代码以避免Select

Private Function GetColumn(Header() As Variant, _
  Optional NumRows As Long = 0, _
  Optional ws As Worksheet = Nothing, _
  Optional wb As Workbook = Nothing) As Range

    Dim rng As Range, cl As Range
    Dim i As Long

    If wb Is Nothing Then
        Set wb = ActiveWorkbook
    End If
    If ws Is Nothing Then
        Set ws = wb.ActiveSheet
    End If

    Set rng = ws.UsedRange.Rows(1)
    For i = LBound(Header) To UBound(Header)
        Set cl = rng.Find(What:=Header(i), _
          After:=rng.Cells(1, 1), _
          LookIn:=xlValues, _
          LookAt:=xlWhole, _
          SearchOrder:=xlByRows, _
          SearchDirection:=xlNext, _
          MatchCase:=False)
        If Not cl Is Nothing Then
            With ws
                If NumRows = 0 Then
                    Set GetColumn = Range(cl, .Cells(.Rows.Count, cl.Column).End(xlUp))
                Else
                    Set GetColumn = Range(cl, .Cells(NumRows, cl.Column))
                End If
                Exit Function
            End With
        End If
    Next
    Set GetColumn = Nothing
End Function

像这样称呼

Dim rng As Range
Dim Headers() As Variant
Headers = Array("School", "Institution", "College")


' Active Workbook, Active Sheet
Set rng = GetColumn(Headers, 6536)

' All rows in specified column
' Specified sheet in Active workbook
Set rng = GetColumn(Headers, , Worksheets("SomeSheetName"))