在Vba函数中键入不匹配

时间:2018-02-12 09:25:29

标签: excel vba excel-vba

以下代码给出了类型不匹配错误。有人可以请更正此代码。我必须在我的Excel工作表的第一列中找到一个字符串值。

index.html

4 个答案:

答案 0 :(得分:2)

这个函数实际上并没有比Find函数做的更多,所以如果你真的需要这个函数,也许值得考虑。

除此之外,您的功能可以简化 - 见下文。您的问题可能是因为Activecell部分 - 正如我在评论中提到的那样。

Private Function FindHeader(ByVal SheetName As String, ByVal HeaderName As String) As Range
    Set FindHeader = ThisWorkbook.Worksheets(SheetName).Range("A1").Resize(1,1000).Find(HeaderName, lookat:=xlWhole)
End Function

请注意,如果找不到具有该名称的标头,则您的函数将返回Nothing。所以当你调用函数时检查Is Nothing。例如:

Public Sub Test()
    Dim header As Range
    Set header = FindHeader("Sheet1", "TestHeader")

    If Not header Is Nothing Then
        MsgBox "Header is in " & header.Address
    End If
End Sub

答案 1 :(得分:0)

以下按预期工作,我更换了ActiveCell部分并更改了范围,以便它查看第1列而不是A1:A1000:

Private Function find_RuleId_Column(page As String, strFind As String) As Range
    Dim Gcell As Range
    Set Gcell = Sheets(page).Columns(1).Find(What:=strFind, LookIn:=xlFormulas, Lookat _
       :=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
        False)
        Set find_RuleId_Column = Gcell
End Function

Sub foo()
    If Not find_RuleId_Column("Sheet1", "SearchItem") Is Nothing Then MsgBox find_RuleId_Column("Sheet1", "SearchItem").Address
End Sub

答案 2 :(得分:0)

您可以使用公式

=MATCH(B1,INDIRECT(CONCATENATE(A1,"!A1:A1000")),0)

其中B1包含您要搜索的字符串,A1包含工作表的名称。

答案 3 :(得分:0)

当ActiveCell不在A1:ALL1范围内时,会发生错误。但是,如果找不到strFind,则会出现另一个错误。如果搜索不成功,范围Gcell将无效。你应该测试一下。但是,你似乎并不想要这个范围。下面的代码将返回列号,正如函数的名称所示。如果未找到strFind,则会发生代码忽略的错误。如果未找到匹配项,该函数将返回0(零)。

Private Function find_RuleId_Column(page As String, strFind As String) As Long

    Dim Gcell As Range

    With Sheets(page)
        Set Gcell = .Range(.Cells(1, 1), .Cells(1, 1000))
        On Error Resume Next
        find_RuleId_Column = Gcell.Find(What:=strFind, _
                                        After:=.Cells(1, 1000), _
                                        LookIn:=xlFormulas, _
                                        LookAt:=xlWhole, _
                                        SearchOrder:=xlByRows, _
                                        SearchDirection:=xlNext, _
                                        MatchCase:=False).Column
    End With
End Function