两年提取代码之间的差异

时间:2015-06-30 19:42:27

标签: excel vba excel-vba

我有两个代码,我已经写过/得到了其他人的帮助,只是想知道这两个代码是否可以组合成单个代码,为我做了很多工作。我得到的第一个代码是

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年以来的天数。

有人能建议解决我遇到的这个问题吗?

1 个答案:

答案 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) > 0IsEmpty(val)
    • 更快
  • 如果两列都在同一行结束,则不需要为每列执行2次循环
    • 获取其中一个的最后一行并同时修改两列
    • (与第一个功能相同)