1

问题

我正在尝试在数组中将 8 位数字转换为日期。条目的示例是 12282009 或 12202007。字段中还有其他格式错误的条目,包括以字符串形式输入的日期。我希望将 8 位数字分别格式化为 12/28/09 或 12/20/07。我在下面的倒数第三行不断收到类型不匹配错误。我该怎么做呢??

代码

Dim del()
ReDim del(1 To importwsRowCount, 1 To 1)
del = Range("AH1:AH" & importwsRowCount).Value
Dim delChars As Long
Dim delType As String
For i = LBound(del, 1) To UBound(del, 1)
    delChars = Len(del(i, 1)) 'Determine length of entry
    If IsNumeric(del(i, 1)) = True Then 'Determine datatype of entry
        delType = "Numeric"
        del(i, 1) = Abs(del(i, 1))
    Else
        delType = "String"
        del(i, 1) = UCase(del(i, 1))
    End If     
If delType = "Numeric" Then
    If delChars = 8 Then
        del(i, 1) = DateSerial((Right(del(i, 1), 4)), (Left(del(i, 1), 2)), (Mid(del(i, 1), 3, 2))) '<-- TYPE MISMATCH ERROR
    End If
End If

输入模板

九月。25, 20(没有年份,没有年份!删除。)
SEPT(没有年份,没用,删除。)
N/A(垃圾!删除。)
LONG TIME AG(傻瓜认为这是个好主意,删除。)
6 月 30 日, 200(显然该字段只能保存 12 个字符,删除。)
CHARGED OFF(无用,删除。)
94 DAYS(取空格前的所有字符并从包含订单日期的其他字段中减去以获得拖欠日期。)
94 DPD(DPD in某人聪明的头脑代表我相信过期的日子。同上。)
2008-7-15 12(不确定额外的数字是什么,取空格前的所有字符并转换。)
无效(删除。)
空白(什么都不做。)
4/2/4/09(格式错误的日期,删除。)
009年 1 月 1 日(同上。)
12282009(使用嵌套的 LEFT 和 RIGHT 以及 CONCATENATE 与 / 之间。)
9202011(添加前导零,然后同上。)
92410(添加前导零,这将转换为 09/24/10)
41261(自 31/12/1899 以来的天数,这将转换为 12/08/12)
1023(自拖欠的天数,从 ORDER DATE 中减去得到拖欠日期。)
452(同上。)
12(同上。)
1432.84(货币价值,被低智商的仆人错误输入。删除。)

4

2 回答 2

1

Right(Left(del(i, 1), 2), 6)是荒谬的。

Left(del(i, 1), 2)部分首先发生并返回一个 2 个字符的字符串。如果您随后应用Right(..., 6)到该 2 个字符的字符串,则会收到错误消息。

这里需要这个Mid函数:Mid(del(i, 1), 3, 2)


之前运行该Abs函数将数组条目从具有子类型 String 的 Variant 更改为具有子类型 Double 的 Variant。这不一定会影响左/中/右功能,但请尝试:

del(i, 1) = CStr(del(i, 1))
del(i, 1) = DateSerial((Right(del(i, 1), 4)), (Left(del(i, 1), 2)), (Mid(del(i, 1), 3, 2)))

我们需要确定导致错误的实际值是什么:

If delType = "Numeric" Then
    If delChars = 8 Then
        On Error Goto DateMismatchError
        del(i, 1) = DateSerial((Right(del(i, 1), 4)), (Left(del(i, 1), 2)), (Mid(del(i, 1), 3, 2))) '<-- TYPE MISMATCH ERROR
        On Error Goto 0
    End If
End If

' at the end of your Sub or Function - I'm assuming Sub here

Exit Sub

DateMismatchError:

MsgBox "Date mismatch: error number " & Err.Number & ", " & Err.Description & _
    " caused by data value: |" & del(i, 1) & "| at row " & i & ". Original data " & _
    "value is |" & Range("AH" & i).Value2 & "|, displayed value is |" & _
    Range("AH" & i).Text & "|, number format is |" & Range("AH" & i).NumberFormat & "|"

End Sub
于 2012-11-06T22:55:59.637 回答
1

您可以使用这个较短的代码将您的数组元素替换为格式化的日期

  1. 它将循环内的测试量减少到两个IFs。如果首先运行数字测试 -对非 8 个字符的字符串运行更长的
  2. 字符串函数等比它们的变体表亲Left$Mid$快得多LeftMid

importwsRowCount在下面的代码中替换了您的变量

更新了处理和转储结果的代码,现在根据 barrowc 注释处理字符串测试和不合规的数字

下面的代码将新日期放入第二个数组,跳过无效日期第二个数组然后转储到`AI`

Sub ReCut2()
Dim del()
Dim X()
Dim lngCnt As Long
del = Range("AH1:Ah10").Value2
ReDim X(1 To UBound(del, 1), 1 To UBound(del, 2))
Dim delChars As Long
Dim delType As String
For lngCnt = LBound(del, 1) To UBound(del, 1)
  If IsNumeric(del(lngCnt, 1)) Then
  If Len(Int((del(lngCnt, 1)))) = 8 Then X(lngCnt, 1) = DateSerial(Right$(del(lngCnt, 1), 4), Left$(del(lngCnt, 1), 2), Mid$(del(lngCnt, 1), 3, 2))
  End If
Next
[ai1].Resize(UBound(X, 1), UBound(X, 2)).Value2 = X
End Sub

在此处输入图像描述

于 2012-11-06T23:30:23.983 回答