2015-10-14 43 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