2016-11-09 79 views
0

我想找到一種方法來搜索單元格可能已被輸入的數字。 所以B2的值是12.當使用Instr時,它會發現1,2和12.有沒有辦法讓它只返回12?這裏是我目前使用它的代碼,如果我只使用1-9會很好,但是我需要更多選項。Instr函數,找到整個數字,所以12將不會返回爲1

Sub PRTLookup() 
Dim WsP As Worksheet 
Dim PRTval As String 
Dim MonCt As Long, DayCT As Long 

Set WsP = ThisWorkbook.Sheets("PT") 

For MonCt = 2 To 46 Step 4 
    For DayCT = 2 To 32 
     CelVal = Cells(MonCt, DayCT) 
      If IsNumeric(CelVal) Then 
       For x = 1 To 26 
        If InStr(Cells(MonCt, DayCT).Text, x) Then PRTval = PRTval + WsP.Cells(x, 1).Value 
       Next 
       Cells(MonCt, DayCT).Value = PRTval 
       PRTval = Empty 
      End If 
    Next 
Next 

End Sub 

這是爲我工作的最終代碼:

Dim myarr() as string 
Dim num as Variant 

For MonCt = 2 To 46 Step 4 
    For DayCT = 2 To 32 
     Celval = Cells(MonCt, DayCT) 
     myarr = Split(Celval, ",") 
      For Each num In myarr 
       PRTval = PRTval & " " & WsP.Cells(num, 1).Text 
      Next num 
     Cells(MonCt, DayCT).Value = PRTval 
     PRTval = Empty 
    Next 
Next 
+0

難道你的細胞擁有多個號碼?如何格式化? – trincot

+0

「CelVal」的價值在哪裏? – trincot

+0

@Trincot,單元格值可以有多個數字。數字將被輸入像1,4,6,13等,這取決於他們從WsP工作表中得到什麼。 CelVal沒有被任何原因複製到代碼中,我編輯它來添加它。 – cparsons

回答

1

我不太理解你的問題,但這裏是我的想法:

你可以先拆用逗號輸入字符串(節能它到一個數組),然後通過該陣列內的各數迭代,並檢查它是否包含值:

Dim myarr() as String 
Dim num as String 
myarr = Split(inputLine, ",") 
For each num in myarr 
    ...... 
Next num 
+0

I」我會給它一個鏡頭,它看起來可能會奏效。 – cparsons

+0

這對我有效,但我必須將num更改爲變體。我用我的代碼結束的方式更新了問題。謝謝。 – cparsons

+0

很高興它爲你工作:) – cullan

0

你可以找一些,然後再檢查下一個字符是否是一個數字了。所以只要沒有更多的數字就可以迭代。

更新: 我會做這樣的事情:

For i = 1 To Len(myString) 
    j = 0 
    If IsNumeric(Mid(myString, i, 1)) Then 
     Do While IsNumeric(Mid(myString, i, 1 + j)) And i + j <= Len(myString) 
      j = j + 1 
     Loop 
     output = Mid(myString, i, j) 
     MsgBox output 
    End If 
    i = i + j 
Next i 
+0

你知道我該如何檢查下一個字符是什麼嗎?會不會是這樣的事情? '如果InStr(單元格(MonCt,DayCT).Text,x)然後i = InStr(單元格(MonCt,DayCT).Text,x)+ 1如果Isnumeric(i)則是我剩餘的代碼? – cparsons

+0

我寧願做這樣的事情: – snibbo

+0

對於i = 1到萊恩(myStr中) J = 0 如果則IsNumeric(MID(myStr中,I,1)),然後 做,當則IsNumeric(MID(myStr的,我,1 + j)條)和I + J <= LEN(myStr中) 當J = J + 1 迴路 輸出=中(myStr中,I,J) MSGBOX輸出 結束如果 I = I + J 下一I – snibbo

1

的一些問題:

  • 測試IsNumeric不會產生True當內容是逗號分隔的列表,在這種情況下,它將有字符串數據類型。
  • 變量PRTVal被聲明爲一個字符串,但是您使用其上的+運算符。那應該是&

您可以使用Split通過逗號分隔符分割字符串,然後您可以遍歷零件。

下面是部分適應:

Dim nums As String 
Dim str As Variant 
' ... etc ... 

If IsNumeric(Replace(Replace(CelVal, ",", ""), " ", "")) Then 
    PRTval = "" 
    nums = Split(CelVal, ",") 
    For Each str In nums 
     x = CInt(str) 
     If x >= 1 And x <= 26 Then PRTval = PRTval & ", " & WsP.Cells(x, 1).Value 
    Next 
    Cells(MonCt, DayCT).Value = Mid(PRTval, 3) ' skip first ", " 
End If 
+0

我試過這個,我不斷想出「爲每個可能迭代」的錯誤。我使用@ cullan的建議,併爲我工作。儘管謝謝你的幫助。 – cparsons

+0

好的,錯誤可能是由於'str'的​​數據類型引起的:如果你聲明它爲'Variant',它可能會解決它。無論如何,很高興聽到你與克蘭的解決方案合作! – trincot