2016-11-09 2 views
0

Я пытаюсь найти способ поиска ячейки для чисел, которые, возможно, были введены. Значит, значение B2 равно 12. При использовании Instr он найдет 1,2 и 12. Есть ли способ вернуть только 12? Вот код, который я сейчас использую для него, который, если бы я использовал только 1-9, был бы неплохим, но мне нужно больше опций.Функция Instr, нахождение всего числа, поэтому 12 не вернется true для 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

Вы можете посмотреть на номер, а затем проверить, является ли следующий символ является числом тоже. Таким образом, вы повторяете до тех пор, пока их больше нет.

UPDATE: Я хотел бы сделать что-то вроде этого:

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

Знаете ли вы, как я могу проверить, что такое следующий символ? Было бы что-то вроде этого; 'if InStr (Cells (MonCt, DayCT) .Text, x) Затем i = InStr (ячейки (MonCt, DayCT) .Text, x) + 1, если Isnumeric (i), а затем остальная часть моего кода? – cparsons

+0

Я бы предпочел сделать что-то вроде этого: – snibbo

+0

Для i = 1 To Len (myStr) j = 0 Если IsNumeric (Mid (myStr, i, 1)) Затем Do While IsNumeric (Mid (myStr, i, 1 + к)) И я + j <= Len (myStr) J = J + 1 Loop выход = Mid (myStr, I, J) MsgBox выход End If я = I + J Далее я – 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': если вы объявите его как« Вариант », он может его решить. В любом случае, приятно слышать, что вы работали с решением куллана! – trincot

Смежные вопросы