2014-02-07 28 views
0

根據各種不同的可能的標題名稱選擇列的最有效方法是什麼?例如,下面給我列標題與「學校」:根據各種可能的標題名稱選擇列

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」,還是有更高效的方法?是的,這假定在同一工作簿中沒有可能的標題名稱共存。

+0

呃,你可以確保所有的變體是在同一列數? – pnuts

+1

我可以,但我正在清理所有具有不同結構的數據集,因此需要一些時間。 – John

+0

使用宏來幫助你 - 通過標題ooops搜索:-) – pnuts

回答

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"))