Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String Instr函数无法检测字符串中的单词_String_Function_Excel_Named Ranges_Vba - Fatal编程技术网

String Instr函数无法检测字符串中的单词

String Instr函数无法检测字符串中的单词,string,function,excel,named-ranges,vba,String,Function,Excel,Named Ranges,Vba,在这个私有函数中,如果满足以下要求,我想设置一个工作表: 单元格Z1必须包含单词特殊表格 在特殊工作表中,定义为说明的单元格必须包含turn或TRN 但是它不注册单词turn或TRN。我是否错误地使用了InStr功能 Private Function getTransferSheet() As Worksheet Dim ws As Worksheet For Each ws In ThisWorkbook.Sheets If ws.Range("Z1") &l

在这个私有函数中,如果满足以下要求,我想设置一个工作表:

  • 单元格Z1必须包含单词
    特殊表格
  • 特殊工作表
    中,定义为
    说明
    的单元格必须包含
    turn
    TRN
  • 但是它不注册单词
    turn
    TRN
    。我是否错误地使用了
    InStr
    功能

    Private Function getTransferSheet() As Worksheet
        Dim ws As Worksheet
    
        For Each ws In ThisWorkbook.Sheets
            If ws.Range("Z1") <> "Special_Sheet" Then GoTo ContLoop
    
            If InStr(1, ws.Range("Description"), "turn", vbTextCompare) Or InStr(1, ws.Range("Description"), "TRN", vbTextCompare) Then
                Set getTransferSheet = ws
                Exit Function
            End If
        ContLoop:
        Next
    
        MsgBox "Turn sheet (Last sheet) not found", vbExclamation
        End
    End Function
    
    Private函数getTransferSheet()作为工作表
    将ws设置为工作表
    对于此工作簿中的每个ws.Sheets
    如果ws.Range(“Z1”)“特殊工作表”,则转到ContLoop
    如果仪表(1,ws.Range(“说明”),“turn”,vbTextCompare)或仪表(1,ws.Range(“说明”),“TRN”,vbTextCompare),则
    设置getTransferSheet=ws
    退出功能
    如果结束
    ContLoop:
    下一个
    MsgBox“找不到翻页(最后一页)”,带感叹号
    终点
    端函数
    
    InStr
    函数返回一个int。这里需要一个布尔值。 另外,我认为您不想设置
    start
    ,如果是,请不要设置它。您还必须获取
    范围(“说明”)

    尝试:

    如果InStr(ws.Range(“Description”).Text“turn”,vbTextCompare)0或InStr(ws.Range(“Description”).Text“TRN”,vbTextCompare)0,则
    
    原始代码与
    仪表的指令相符。与此相比:

    Function getTransferSheet() As Worksheet
        Dim ws As Worksheet
        Dim test As String
    
        Set getTransferSheet = Nothing
        For Each ws In ThisWorkbook.Sheets
            If ws.Range("Z1") = "Special_Sheet" Then
                test = ""
                On Error Resume Next
                test = ws.Range("Description").Text
                On Error GoTo 0
                If InStr(1, test, "turn", vbTextCompare) Or InStr(1, test, "TRN", vbTextCompare) Then
                    Set getTransferSheet = ws
                    Exit For
                End If
            End If
        Next
    End Function
    
    即使命名范围“description”不存在,这也会起作用。否则,
    instr
    函数将失败,因为比较需要2个字符串。 使用
    vbTextCompare
    选项是正确的-它使比较不区分大小写

    最后,我对代码进行了重构,以在所有情况下提供一个干净的执行路径,即使无法确定传输表。函数中应该只有一个出口,并且应该一致地返回一种数据类型。如果要对失败作出反应,请在调用例程中执行以下操作:

    ' code where this function is called
    set ws = getTransferSheet
    If ws is Nothing then
        MsgBox "Turn sheet (Last sheet) not found", vbExclamation
        Exit Sub
    End If
    

    你好,ZwoRmi。我试图将其设置为0,但仍然无法工作。@Saud您是否尝试使用调试器?Sry,我不是最擅长调试的:/。当我切换断点并运行代码时,它跳过了第二个if语句(带有特殊的单词)@Saud,因此在
    if
    行上切换断点,运行代码,当代码停止时,选择
    ws.Range(“Description”)
    ,右键单击,然后
    添加watch
    ,您将看到值。当我这样做时,我得到值:。类型:空
    ' code where this function is called
    set ws = getTransferSheet
    If ws is Nothing then
        MsgBox "Turn sheet (Last sheet) not found", vbExclamation
        Exit Sub
    End If