我有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。
答案 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)
请参阅随附的屏幕截图...
第二列使用本机工作表函数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
转换器将日期VBA
和CDate
结果用于您定位的格式。
希望这会有所帮助......
答案 3 :(得分:1)