2012-10-01 38 views
0

我建立一个功能,找到列:Excel宏:找到列单元格中没有激活它

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 

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

有没有更好的方法来做到这一点?因为我多次使用这种方法,当单元格上的每次单击都出现故障时,我的合作伙伴不满意。

请帮

回答

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 
+0

+ 1额外的错误处理+不使用'MID(ActiveCell.Address,2,1)'来得到列号:)你也可能要添加'Thisworkbook'之前每'表(NameSheet) ' –

+0

@SiddharthRout - >'Mid(ActiveCell.Address,2,1)'不返回列号,而是列字母。如果OP要'A'而不是'1',这个findColumn函数将不起作用。我想我们都可以按照OP编写代码的方式假设不同的事情,即取决于我们是否认为findColum = 0更能指示OP后面的内容,而不是'Mid'公式。 –

+0

@SiddharthRout,真的。我去更新它,然后改变了主意。很可能你希望它能在ThisWorkbook上工作,但是如果放在模块中,可以从不同的工作簿中调用它,在这种情况下它可以在当前工作簿上运行。我们总是可以扩展它以指定所需的工作簿,但这可能会过度呢? –

4

这里是一个将作为您能否提供一个功能,我相信,因为它从来没有.Selects.Activates片你搜索,同时带回你想要的列字母。它也不循环每个单元格,这可能非常低效。

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

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 
+0

+ 1宾果! :-) –

相关问题