2014-10-14 3 views
1

Я пытаюсь создать функцию, чтобы получить номер столбца ячейки на основе вставленной строки. Если в первой строке найдено два совпадения, я бы хотел вернуть последнее совпадение. Например, «TotalSalary Jan» и «TotalSalary Feb». Когда «TotalSalary» вставлен как параметр, я получу номер столбца для «TotalSalary Feb». Мой код:Получите номер столбца соответствующей строки в первой строке. Excel VBA

Private Function GetColumnNumber(name As String) As Integer 

Dim res As Object, ret As Integer 

Set res = Sheets("Unified").Cells(1, 1).EntireRow.Find(What:=name, LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:=False) 

If Not res Is Nothing Then 
    ret = res.Column 
    Do 
     Set res = .FindNext(res) 
     ret = res.Column 
    Loop While Not res Is Nothing And res.Column <> ret 
    GetColumnNumber = ret 
End If 

End Function 

К сожалению, код не работает должным образом. res объект не смог найти строку для номера столбца.

ответ

2

Попробуйте это и дайте мне знать.

Private Function GetColumnNumber (strKeyword As String) As Integer

Dim rngColLoop  As Range 
    Dim intCounter  As Integer 
    Dim intColNum  As Integer 
    Dim intPrevious  As Integer 
    Dim intCurrent  As Integer 

    lngCounter = 0 
    With Sheets("Unified").Cells(1, 1).EntireRow 
     For Each rngColLoop In .Columns 
      If Trim(rngColLoop) <> "" Then 
       If InStr(1, UCase(Trim(rngColLoop)), UCase(Trim(strKeyword))) > 0 Then 
        intCounter = intCounter + 1 
        If intCounter = 1 Then 
         intPrevious = rngColLoop.Column 
         intCurrent = rngColLoop.Column 
        Else 
         intPrevious = intCurrent 
         intCurrent = rngColLoop.Column 
        End If 

       End If 
      End If 
     Next rngColLoop 
    End With 
    If intCounter = 0 Then 
     GetColumnNumber = 0 
    Else 
     GetColumnNumber = intCurrent 
    End If 

    Set rngColLoop = Nothing 

End Function

+0

Это работает в целом, но пример, такой как TotalSalary Feb и TotalSalary March, по-прежнему выдает TotalSalary Feb. Я постараюсь посмотреть, что я могу сделать. * Изменить: теперь это работает. Просто нужно изменить intPrevious для intCurrent на последних трех строках. Хороший ответ btw! –

1

Я использовал другой подход, изменив направление поиска вы можете найти последний экземпляр с одной находкой метод.

Private Function GetColumnNumber (имя As String) As Integer

Dim res As Object 

Set res = Sheets("Unified").Cells(1, 1).EntireRow.Find(What:=name _ 
                 , LookIn:=xlValues _ 
                 , LookAt:=xlPart _ 
                 , SearchOrder:=xlByColumns _ 
                 , SearchDirection:=xlPrevious _ 
                 , MatchCase:=False) 

If res Is Nothing Then 
    GetColumnNumber = 0 
Else 
    GetColumnNumber = res.Column 
End If 

End Function

1

Я создал еще один метод, чтобы добавить в этой функции. Это работает btw ... Я использую Variant Array для получения номера столбца.

Private Function GetColumnNumber(name As String) As Integer 
    Dim play As Variant, j As Long, Current As Integer 
    Set play = Sheets("Unified").Range("1:1") 
    For i = 1 To play.Columns.Count 
     If InStr(play(1, i), name) > 0 Then 
      Current = i 
     End If 
    Next i 
    GetColumnNumberArray = Current 
End Function 

Я смотрю на эту статью, и это очень полезно для оптимизации вашего кода. http://fastexcel.wordpress.com/2011/10/26/match-vs-find-vs-variant-array-vba-performance-shootout/ Очевидно, что использование поиска и соответствия является очень требовательной командой для вашего компьютера.

Смежные вопросы