Excel-VBA:If-Else-Statement将数字转换为文本

时间:2018-03-22 06:23:25

标签: excel vba excel-vba

我有2列; 1个月,另一个1年。两列都具有随机值。我想将两列合并为一列。例如,在B"月"我有这个1-12号码代表月份和C列#34;年份"比如2008年的8或2010年的10。

我的目标是将两者合并为一列,并在E列中将其格式化为mmm YYYY,例如" 2008年1月和#34;。我的想法是我想尝试将Concatenate函数作为学习VBA。我有以下代码来测试将月份从整数转换为字符串,但它给了我一个错误

  

"输入不匹配"

并且可能在IF-Then-Else语句上有一些错误。我试图改进它但仍然无处可去。我在IF声明中的错误在哪里。

Sub DateColumn()

'***Defined Variable
  Dim NRows As Integer
  Dim Month() As Integer
  Dim Year() As Integer

'***Read Data
Sheets("Data").Activate
LastRowData = Range("A4").End(xlDown).Row - 1
NRows = LastRowData

'***Redefined Array
  ReDim Month(NRows)
  ReDim Year(NRows)

'***Calculate/Convert
For n = 1 To NRows
'Month= convert integer to string
  If (Month = 1) Then
   Month = "Jan"
  ElseIf (Month = 2) Then
   Month = "Feb"
  ElseIf (Month = 3) Then
   Month = "Mar"
  ElseIf (Month = 4) Then
   Month = "Apr"
  ElseIf (Month = 5) Then
   Month = "May"
  ElseIf (Month = 6) Then
   Month = "June"
  ElseIf (Month = 7) Then
   Month = "July"
  ElseIf (Month = 8) Then
   Month = "Aug"
  ElseIf (Month = 9) Then
   Month = "Sept"
  ElseIf (Month = 10) Then
   Month = "Oct"
  ElseIf (Month = 11) Then
   Month = "Nov"
  ElseIf (Month = 12) Then
   Month = "Dec"
  Else
  End If
Next n

'***Write Output
For n = 1 To NRows
Sheets("Data").Cells(1 + n, 5) = Month()

End Sub

我还是新手,想要"尝试计算"理解这个概念。我的代码仍然没有妥善安排(对不起),我想知道如何纠正我在If-Then-Else上的代码。谢谢Stackoverflow。

4 个答案:

答案 0 :(得分:3)

您的问题是您尝试将字符串分配给整数。这就是您收到类型不匹配的原因。

Dim Month() As Integer

但您正尝试使用此变量,如:

Month = "Jan"

"Jan"不是整数,而是字符串。

下一个问题是你试图将不同的数据类型分配给同一个变量......再次,这将是你的月变量(If Month = 1 Then

虽然技术上可以使用Variant类型,但这不是您应该使用的方法。

相反,创建两个变量。如果您想使用"月",那么可能是Dim intMonth As Integer, strMonth As String之类的内容。将具有Int值的列分配给Integer var,并转换为String var。

我不完全确定您有多少行,但一个好的经验法则是始终将表示行号的变量声明为类型Long而不是类型Integer }。虽然你可以安全地在你的月份使用Integer& year vars(我仍然使用Long),如果你有太多行,你可能遇到溢出问题(整数上升到大约32.7k,然后会溢出)。

下一期,您使用数组Months(),但您在If语句中将Months称为非数组

Sub DateColumn()

      Dim ws As Worksheet
      Dim NRows As Long
      Dim Month As String

    Set ws = ThisWorkbook.Worksheets("Data")        '<-- remove the .Activate
    NRows = ws.Range("A4").End(xlDown).Row - 1

    For n = 1 To NRows
        Select Case ws.Cells(n, "B").Value    '< I think your "Month" col is B?
        Case 1
            Month = "Jan"
        Case 2
            Month = "Feb"
        Case 3
            Month = "Mar"
        Case 4
            Month = "Apr"
        Case 5
            Month = "May"
        Case 6
            Month = "Jun"
        Case 7
            Month = "Jul"
        Case 8
            Month = "Aug"
        Case 9
            Month = "Sep"
        Case 10
            Month = "Oct"
        Case 11
            Month = "Nov"
        Case 12
            Month = "Dec"
        Case Else
            MsgBox "Unknown Error in month. Row # [" & n & "], row val = [" & _
                                    ws.Cells(n, "B").Value & "]. Please debug"
        End Select

        ws.Cells(n, "E") = Month & " " & CStr(ws.Cells(n, "C") + 2000)

    Next n


End Sub

答案 1 :(得分:3)

您可以使用DateSerial函数,从B列(月份)和C列(年份)中保留的值中获取实际日期,然后使用NumberFormat = "mmm yyyy"获取A列中的格式,如你所愿。

您可以将整个代码缩短为以下内容:

Option Explicit

Sub DateColumn()

'***Defined Variable
Dim NRows As Long, LastRowData As Long, n As Long

With Sheets("Data")
    LastRowData = .Cells(.Rows.Count, "B").End(xlUp).Row ' last row with data in column B, where you keep your months

    For n = 1 To LastRowData
        .Range("A" & n).Value = DateSerial(2000 + .Range("C" & n).Value, .Range("B" & n).Value, 1)
        .Range("A" & n).NumberFormat = "mmm yyyy"
    Next n
End With

End Sub

如果您想获取字符串(而不是日期),请使用以下代码:

For n = 1 To LastRowData
    .Range("A" & n).Value2 = Format(DateSerial(2000 + .Range("C" & n).Value, .Range("B" & n).Value, 1), "mmm yyyy")
Next n     

答案 2 :(得分:2)

请参阅随附的屏幕截图...

enter image description here

第二列使用本机工作表函数DATE(但它需要将单元格格式化为MMM YYYY),最后一列使用下面的自定义用户函数(将您带到{{ 1}},并且不需要单元格格式化):

2000

上述功能使用Function dateConv(month, year) As String Dim dtOut As Date On Error Resume Next dtOut = CDate("01" & "-" & month & "-" & year) dateConv = Format(dtOut, "MMM YYYY") End Function 转换器将日期VBACDate结果用于您定位的格式。

希望这会有所帮助......

答案 3 :(得分:1)

最简单的方法是使用Excel的内置功能。<​​/ p>

  

我的目标是将两者合并为一列并将其格式化为mmm   YYYY在E栏,如“2008年1月”。

只需放置一个公式,将两个单元格转换为E列中的日期,然后格式化该列以所需格式显示日期。下面的两张图片显示了公式和格式设置。

enter image description here enter image description here

我在公式中使用了day 1,因为您只关心月份和年份。