2015-10-14 2 views
3

Я написал очень простой код, который возвращает последние 6 символов каждой активной ячейки в пределах диапазона.VBA Right-Function, возвращающий неправильный тип данных

Код работает очень хорошо, пока не найдет определенную ячейку, в которой должны быть возвращены символы: «MARC01». К сожалению, он возвращает символ типа даты (01.Mrz).

Используя обычную формулу excel, она работает нормально, поэтому я ожидаю, что она также будет работать с макросом.

Здесь вы можете увидеть мой код, который принимает строку из столбца «А» и вводит его в колонке «B»:

Range("B12").Activate 

    Do 
     ActiveCell.Value = Right((ActiveCell.Offset(0, -1).Value), 6) 
     ActiveCell.Offset(1, 0).Activate 

    Loop Until ActiveCell.Offset(0, -1).Value = 0 
+0

Я рекомендую вам изменить «.value» на «.Formula», так как, в общем, .Value может дать различные результаты в зависимости от форматирования, в то время как .Formula более или менее ядро ​​числовая/текст привести себя. Не уверен, что это устраняет вашу конкретную проблему. –

+0

@ Grade'Eh'Bacon - ни .Formula, ни .Value2 не устраняет проблему. – ZygD

ответ

3

Excel любит менять что-либо, что выглядит как возможная дата до даты. Чтобы этого не произошло, поставьте "'" перед формулой.

ActiveCell.Value = "'" & Right((ActiveCell.Offset(0, -1).value), 6) 

Это заставит его оставаться в тексте. С другой стороны, если это номер, он будет сохранен как текст.

3

Excel любит пытаться интерпретировать определенные данные, а не просто оставлять его как есть. Особенно это происходит со строками, которые выглядят как даты и с числовыми вводами.

два способа решения проблемы являются

  • Поместите текст символа префикса перед вашей строки. Обычно это одинарная цитата. (см. ответ Скотта для кода)
  • Отформатируйте ячейку как текст, прежде чем размещать там значение.

Sub foo() 
Range("B12").Activate 

    Do 
     ActiveCell.NumberFormat = "@" 
     ActiveCell.Value = Right((ActiveCell.Offset(0, -1).Formula), 6) 
     ActiveCell.Offset(1, 0).Activate 

    Loop Until ActiveCell.Offset(0, -1).Value = 0 
End Sub 
0

С помощью этой простой цели, я не знаю, почему вам нужно VBA зацикливание.

Вы можете просто установить форму formular1c1 в =RIGHT(RC[-1],6).

Option Explicit 

Sub Right6() 
    Const R6LeftCol = "=RIGHT(RC[-1],6)" 
    Dim oRng As Range, lRow As Long 
    lRow = Cells(Rows.Count, "A").End(xlUp).Row 
    Set oRng = Range("B12") 
    Range(oRng, Cells(lRow, "B")).FormulaR1C1 = R6LeftCol 
    Set oRng = Nothing 
End Sub 
Смежные вопросы