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

Vba 根据各种可能的标题名称选择列,vba,excel,Vba,Excel,根据各种可能的标题名称选择列的最有效方法是什么?例如,下面给出了标题为“学校”的列: 然而,“学校”可以是另一个工作簿中的“学院”,也可以是另一个工作簿中的“机构”。我应该把上面的代码放在if-then-else语句中,并用其他可能性替换“school”,还是有更有效的方法?是的,这假设在同一工作簿中没有任何可能的标题名称共存 查找已经非常有效了。效率低下的是那些选择的 我建议您将Find头逻辑封装到函数中,并重构代码以避免选择 Private Function GetColumn(Header

根据各种可能的标题名称选择列的最有效方法是什么?例如,下面给出了标题为“学校”的列:


然而,“学校”可以是另一个工作簿中的“学院”,也可以是另一个工作簿中的“机构”。我应该把上面的代码放在if-then-else语句中,并用其他可能性替换“school”,还是有更有效的方法?是的,这假设在同一工作簿中没有任何可能的标题名称共存

查找
已经非常有效了。效率低下的是那些
选择的

我建议您将Find头逻辑封装到
函数中
,并重构代码以避免
选择

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

我可以,但我正在清理很多数据集,这些数据集都有不同的结构,所以这样做需要一些时间。如果你在循环中打开/搜索工作簿(例如For循环),然后将搜索值存储在数组中,在循环中只需将
“School”
替换为say
AR(I)
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"))