0

问题

我希望从工作表中的日期字段中减去存储在数组中的 1 到 3 位数字。我取数字的绝对值,乘以负 1,然后使用 DateAdd 函数执行操作。我没有收到错误消息,但数组值仍然是最初通过该进程发送的确切的 1 到 3 位数字。

例子

C列是我目前的结果给我的。

        A        B        C
1  1/8/09       54       54
2  3/3/11        1        1
3  8/1/10      132      132 

代码

If delType = "Numeric" Then
    ElseIf delChars = 3 Or delChars = 2 Or delChars = 1 Then
         del(i, 1) = Abs(del(i, 1))
         del(i, 1) = del(i, 1) * -1
         del(i, 1) = DateAdd("d", del(i, 1), Range("E" & i + 1))
         'I did confirm that this case is actually working 
         'by setting the above line to del(i,1) = "Digits" and
         'received "Digits" for all entries with 1 to 3 numeric digits.
    End If
End If
4

4 回答 4

1

Excel 中的日期存储为自固定日期以来的天数。您可以直接在工作表中从 A 列中减去 B 列。不需要 VBA。只需将结果格式化为日期即可。

于 2012-11-07T19:39:28.593 回答
1

尽管您的代码没有显示它,但我怀疑该数组被视为integer,并且您On Error Resume Next在代码中。

由于日期对于整数来说太大了,因此信息不会被替换。

试试这个看看效果

Sub test()
On Error Resume Next
Dim i As Integer
i = Now()
Debug.Print i
End Sub

错误(非)处理到位后,您会得到0. i=Now()如果没有错误处理,excel 会在出现溢出错误时停止

于 2012-11-07T19:53:34.940 回答
1
Sub Tester()

    Dim arr, x

    arr = Range("A1:A3").Value 'values to be subtracted


    For x = 1 To UBound(arr, 1)
        ' "base" date is in A5
        arr(x, 1) = Range("A5").Value - Abs(arr(x, 1))
    Next x

    With Range("D1:D3")
        .NumberFormat = "m/d/yyyy"
        .Value = arr 'dump values back to sheet
    End With

End Sub
于 2012-11-08T01:37:54.473 回答
1

Tim 的代码实际上是基于 A.Webb 的第一条评论的概念。

鉴于,您的日期、DAYS 分别位于 A、B 列中,您可以将答案输出到 C 列。您实际上可以将 A 列和 B 列读入一个二维数组或两个一维数组,使用 1 个命名单元作为指向您需要交互的所有单元格的参考点。这将允许一些细胞独立/动态过程。同样,您的问题似乎很小 - 除非您必须处理某些供应商的 Excel 加载项,这些加载项会对您在 Excel 中的数据/日期格式产生一些奇怪的影响。我不建议您使用 UDF。由于这是 BIG 操作流程的一部分,您可以将其包装在数据操作类/模块下,您可以在其中执行所有小而重要的数据“按摩”。还希望您在大型工作簿中使用 DATES 时注意工作表的性能。

非常小的建议:

arr(x, 1) = Abs(arr(x, 1)) - Range("B1").Offset(x - 1, 0).Value
于 2012-11-08T07:52:57.910 回答