我有两个代码,我已经写过/得到了其他人的帮助,只是想知道这两个代码是否可以组合成单个代码,为我做了很多工作。我得到的第一个代码是
Private Sub extractYears()
Dim arr As Variant, i As Long, j As Long, ur As Range, colW As Long, colV As Long
Set ur = cFinal.UsedRange '4th sheet
If WorksheetFunction.CountA(ur) > 0 Then
colW = colNum("Q")
colV = colNum("R")
If 1 Then
arr = ur
For i = 2 To getMaxCell(ur).Row 'each "row"
If Len(arr(i, colW)) > 0 Then arr(i, colW) = Format(arr(i, colW), "yyyy")
If Len(arr(i, colV)) > 0 Then arr(i, colV) = Format(arr(i, colV), "yyyy")
Next
ur = arr
End If
End If
End Sub
另一个是
Dim i As Long
For i = 2 To lastRow
If IsDate(wsFinal.Cells(i, "Q").Value) And Not IsEmpty(wsFinal.Cells(i, "Q").Value) Then
With wsFinal
.Cells(i, "Q").Value = Year(wsFinal.Cells(i, "Q").Value)
End With
End If
Next i
Dim j As Long
For j = 2 To lastRow
If IsDate(wsFinal.Cells(j, "R").Value) And Not IsEmpty(wsFinal.Cells(j, "R").Value) Then
With wsFinal
.Cells(j, "R").Value = Year(wsFinal.Cells(j, "R").Value)
End With
End If
Next j
每当我从外部源获取数据时,这两个列(Q)和(R)是最有问题的元素,因为整个列有时只包含年份(未格式化日期),有时日期格式化为日期,并且可能两种类型的非日期格式化年份和日期格式化日期在同一列中。
每次数据进入时我都要检查列Q和R的类型,如果它们只包含年份,那么当列只有完整日期格式时,我会使用第二组代码和extractYears。我不确定为什么使用任何一种类型都不会起作用。它会吐出我认为的数字,这是自1905年以来的天数。
有人能建议解决我遇到的这个问题吗?
答案 0 :(得分:0)
尝试修改后的extractYears()
Private Sub extractYears()
Dim arr As Variant, i As Long, j As Long, ur As Range, colW As Long, colV As Long
Set ur = cFinal.UsedRange '3rd sheet
If WorksheetFunction.CountA(ur) > 0 Then
colW = colNum("W")
colV = colNum("V")
arr = ur 'transfer sheet data to memory
For i = 2 To getMaxCell(ur).Row 'each "row"
If Len(arr(i, colW)) > 0 Then 'if not empty
If Len(arr(i, colW)) > 4 Then 'if it's full date (longer than 4 digits)
arr(i, colW) = Format(arr(i, colW), "yyyy") 'extract the year part
End If
End If 'if it contains 4 digit year leave it as is
If Len(arr(i, colV)) > 0 Then 'the same logic applied for colV
If Len(arr(i, colV)) > 4 Then
arr(i, colV) = Format(arr(i, colV), "yyyy")
End If
End If
Next
ur = arr 'transfer memory data back to sheet
End If
End Sub
它适用于这样的日期:
08/03/2007 -> 2007
05/24/2006 -> 2006
2007 -> 2007
2012 -> 2012
对于这两列,我应用了一个额外的条件:If Len(arr(i, colW)) > 4 Then
您可以将其应用于包含以下内容的任何其他列:完整日期或仅年份(4位数)
第二种方法的注意事项:
.UsedRange.Column
)的整个列复制到变量数组并在IsDate(val)
和IsEmpty(val)
以相同的方式工作Len(val) > 0
比IsEmpty(val)