2016-11-09 38 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