Excel宏:查找列单元格而不激活它

时间:2012-10-01 15:39:10

标签: excel excel-vba vba

我构建了一个查找列的函数:

Function findColumn(NameSheet As String, ColName As String)
findColumn = 0
Worksheets(NameSheet).Select
Sheets(NameSheet).Range("A1").Select
Do Until ActiveCell.Value = ""
    searchTerm = ActiveCell.Value
    If (LCase(ActiveCell.Value) = LCase(ColName)) Then
           findColumn = Mid(ActiveCell.Address, 2, 1)
           Exit Do
    End If
    ActiveCell.Offset(0, 1).Activate
Loop 
End Function

此功能有效!但它激活其他工作表,我必须返回到上一个工作表。结果不是无缝的,因为当函数搜索列地址时会出现表单转换的小故障。

有没有更好的方法呢?因为我多次使用这种方法,而且当我在电池上的每次点击都出现故障时,我的合作伙伴并不满意。

请帮忙

2 个答案:

答案 0 :(得分:4)

这是一个可以按照您的建议工作的功能,我相信,因为它不会.Selects.Activates您正在搜索的工作表,同时还会返回您想要的列字母。它也不会循环每个单元格,这可能是非常低效的。

此函数将返回列字母,而不是数字。如果您想要这个号码,请参阅上面的丹尼尔代码。

Function findColumn(NameSheet As String, ColName As String)

With Worksheets(NameSheet)

    Dim myRng As Range
    Set myRng = .Rows(1).Find(ColName, lookat:=xlWhole)

    If Not myRng Is Nothing Then

        findColumn = Split(myRng.Address, "$")(1)

    Else

        findColumn = "Column Not Found"

    End If

End With


End Function

答案 1 :(得分:3)

这是一种可能的方法,重要的是它根本不会改变工作簿的焦点。这将返回搜索项的列号,假设它在第一行,如果未找到则返回0。如果NameSheet无效,弹出窗口将通知您,它将返回0.

Function findColumn(NameSheet As String, ColName As String) As Long
    'Add Error checking to see if sheet Exists
    On Error Resume Next
        Dim sheetTest As String
        'Copy sheet name, just to see if the sheet is valid
         sheetTest = Sheets(NameSheet).Name
    'Check if sheet was found.
    If Err.Number <> 0 Then
        MsgBox "Sheet does not exist"
        Exit Function
    End If
        'Search the first column in the NameSheet for the ColName, and return 
        'the column number.
        findColumn = Sheets(NameSheet).Rows(1).Find(What:=ColName, LookIn:=xlFormulas, _
            LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
            MatchCase:=False, SearchFormat:=False).Column
End Function