2014-10-01 3 views
0

Я новичок в VBA, поэтому у меня возникла проблема с преобразованием некоторого номера строки в номер значения для проверки IF.EXCEL VBA - Аналогичная функция для формулы excel Значение

Проблема есть. У меня есть столбец "A", наполненную чем-то вроде этого:

E/B: Дома 01

E/B: Дома 02

E/B: Строительство/Новая вилла

E/B: Строительство/Bella Casa

E/B: Дома 03

Итак, в моем коде, я хочу, чтобы заполнить «B» Колонка с 2 последних цифр, если число есть или имя, если ISN «т.

Set Rng = Range("A8:A" & Range("I" & Rows.Count).End(xlUp).Row) 

For Each celula In Rng.SpecialCells(xlCellTypeVisible) 
    Select Case True 
     Case IsNumeric(Right(celula, 2)) = True 
      celula.Offset(0, 1).Value = Right((celula), 3) 
     Case Else 
      celula.Offset(0, 1).Value = Mid(celula, InStr(4, celula, "/") + 1, Len(celula)) 
    End Select 
Next celula 

Но дело IsNumeric (справа (celula, 2)) = True никогда не будет True. Он не фиксирует 2 последних числа. Но он работает хорошо с именами и возвращает «Новая вилла» и «Белла Каса». И я думаю, что проблема в том, что Right (celula, 2) никогда не бывает числом, даже если это число.

Я хочу знать, есть ли способ конвертировать «Right (celula, 2)» в значение, как и формулу Value в excel, чтобы выполнить проверку.

OBS: Прежде чем пытаться таким образом, у меня была формула excel, примененная к этим ячейкам, и это сработало, но я хочу попробовать этот путь для учебных целей.

Благодаря

+1

Просто скопирован и вставлен как ваш код, так и ваши данные образца в новый рабочий лист Excel, и он работает. Вы уверены, что у вас нет пробелов (-ов) после чисел? 'Debug.Print" <"+ Right (celula, 2) +"> "', чтобы убедиться (он должен печатать '<01>', '<02>' и т. Д.). – ssarabando

+0

Выглядит хорошо. используйте это, чтобы проверить это. Возможно, вы не выбрали правильный диапазон. Для каждой celula в выборе Выберите случай True .... – causita

+0

Я установил rgn после автофильтра, в этом была проблема. спасибо – MVAmorim

ответ

1

Я думаю, что сама for each цикл работает, как ожидалось.

Однако это

Set Rng = Range("A8:A" & Range("I" & Rows.Count).End(xlUp).Row)

, вероятно, где проблема лежит. Вы должны убедиться, что у вас есть правильный Range. Вы можете проверить путем отладки: Debug.print Rng.Address.

+0

Диапазон в порядке, он работает с именами. Если диапазон был выключен, он ничего не должен возвращать. Редактировать: У меня есть другие данные на моем листе, столбец «I» заполнен, но не используется в этом. – MVAmorim

+0

Что он печатает для 'rng.address'? –

+0

Должно быть что-то еще, оно работает так, как ожидалось, на отдельном листе, но в моем основном листе работает только случайное дело – MVAmorim

0
Sub t() 
Dim rng As Range 

With ActiveSheet 
    Set rng = .Range("a1:a" & .Range("a" & .Rows.Count).End(xlUp).Row) 
     For Each cell In rng.Cells 

      If Val(Right(cell.Value, 2)) = 0 Then 
         cell.Offset(0, 1) = Mid(cell.Value, InStrRev(cell.Value, "/") + 1, Len(cell)) 
        Else 
         cell.Offset(0, 1) = Val(Right(cell.Value, 2)) 
      End If 

     Next cell 
End With  

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