2015-10-14 91 views
3

我写了一个非常简单的代码,它返回范围内每个活动单元格的最后6个字符。VBA右函数返回错误的数据类型

该代码工作得很好,直到它找到一个特定的单元格,其中要返回的字符应该是:“MARC01”。不幸的是它返回一个日期类型字符(01.Mrz)。

通过使用正常的Excel公式它工作正常,这就是为什么我希望它也可以与宏一起工作。

在这里你可以看到我的代码,这需要字符串从“A”栏并将其输入“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喜欢尝试解释某些数据,而不是仅仅保留原样。特别是对于看起来像日期的字符串和数字条目。

两种方式解决方法是

  • 把文字前缀字符字符串中的前面。这通常是单引号。 (请参阅Scott的代码答案)
  • 在将值放在那里之前,将单元格格式化为文本。

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循环。

您可以将massular1c1设置为=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