2015-09-18 3 views
1

В этой частной функции Я хочу, чтобы установить рабочий лист, если выполняются следующие требования:функция Instr не может обнаружить ни слова внутри строки

  1. Cell Z1 должен содержать слово Special_Sheet
  2. В Special_sheet клетке определяемый как Description, должен содержать либо 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 

ответ

2

InStr Функция возвращает int. Там вы хотите логическое. Кроме того, я не думаю, что вы хотите установить start, если это не так. Кроме того, вы должны получить Text от Range("Description")

Try:

If InStr(ws.Range("Description").Text, "turn", vbTextCompare) <> 0 Or InStr(ws.Range("Description").Text, "TRN", vbTextCompare) <>0 Then 
+0

Hi @ZwoRmi. Я попытался установить его на <> 0, но он все еще не работает. – Saud

+1

@Saud Вы пытались использовать отладчик? – ZwoRmi

+0

Sry, я не лучший при отладке: /. Когда я Togle Breakpoint и запускаю код, он пропускает второй оператор if (со специальными словами) – Saud

0

Исходный код является правильным в отношении instr инструкции. Сравните с этим:

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 

Это будет работать, даже если названное «описание» диапазона не существует. В противном случае функция 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