Arrays 如何转换或分析字符串以使用dateserial VBA Excel

Arrays 如何转换或分析字符串以使用dateserial VBA Excel,arrays,vba,excel,Arrays,Vba,Excel,我有一列数据,它由两个元素组成(作为字符串输入) 我想将一个变量设置为等于上面提到的字符串日期部分的DateSerial 我不想把数据分开,让它驻留在不同的列中。我希望格式保持不变 我将加载一个包含表中所有数据(多列)的数组,但我希望该数组按日期索引。我将对数组运行快速排序,然后对排序后的数组执行一些额外的交叉引用。然而,我无法用实际的数据集进入这些阶段,因为我被日期问题困住了 给定源数据的格式,如何按日期编制索引 Dim d as Date Dim arTemp Dim arTemp1 Dim

我有一列数据,它由两个元素组成(作为字符串输入)

我想将一个变量设置为等于上面提到的字符串日期部分的DateSerial

我不想把数据分开,让它驻留在不同的列中。我希望格式保持不变

我将加载一个包含表中所有数据(多列)的数组,但我希望该数组按日期索引。我将对数组运行快速排序,然后对排序后的数组执行一些额外的交叉引用。然而,我无法用实际的数据集进入这些阶段,因为我被日期问题困住了

给定源数据的格式,如何按日期编制索引

Dim d as Date
Dim arTemp
Dim arTemp1
Dim WS As Worksheet
Dim list As Object, list1 As Object
Dim RowCount as Integer, y As Integer

Set list = CreateObject("System.Collections.SortedList")
Set list1 = CreateObject("System.Collections.SortedList")

For Each WS In WorkSheets
    With WS
        For RowCount = 7 to 207
            'Works perfectly if the data in Column 1 is actually a date
            d = DateSerial(Year(.Cells(RowCount, 1)), Month(.Cells(RowCount, 1)), 1)

                If list.Containskey(d) Then
                    arTemp = list(d) 
                    arTemp1 = list1(d)'omitted from code below but follows the same format
                Else
                    ReDim arTemp(8)
                    ReDim arTemp1(8)
                End If
                For y = 2 to 7 'Cycle through the columns and load array/list
                    arTemp(0) = arTemp(0) + .Cells(RowCount, y) 'Grab Km
                    arTemp(1) = arTemp(1) + .Cells(RowCount, y) 'Grab Route Hrs
                    arTemp(2) = arTemp(2) + .Cells(RowCount, y) 'Grab No. Deliveries
                    arTemp(3) = arTemp(3) + .Cells(RowCount, y) 'Grab No. of Del Pieces
                    arTemp(4) = arTemp(4) + .Cells(RowCount, y) 'Grab No. Pick-ups
                    arTemp(5) = arTemp(5) + .Cells(RowCount, y) 'Grab No. of PU Pieces
                    arTemp(6) = arTemp(6) + .Cells(RowCount, y) 'Grab Total Stops
                    arTemp(7) = arTemp(7) + .Cells(RowCount, y) 'Grab Total Pieces
                    arTemp(8) = arTemp(8) + 1
                    list(d) = arTemp
            'do other stuff here .........................................
            Next y
        Next RowCount
    End With
Next
替换:

d = DateSerial(Year(.Cells(RowCount, 1)), Month(.Cells(RowCount, 1)), 1)
与:


您是否尝试过使用DateValue()而不是DateSerial()

使用DateValue,您可以简单地使用代码

DateVariable = DateValue("10/30/2016 09:18 pm")
它将决心

DateVariable = 10/30/2016
应该比尝试使用DateSerial简单得多

然后可以添加以下行

DateVariable = DateVariable - Day(DateVariable) + 1

要到达月初

Split(cellValueHere,“”)(0)
将为您提供日期部分,因此您应该能够将其传递到
DateSerial
将日期/时间存储为字符串很少是一个好主意。为什么不将电子表格转换为日期/时间序列并按现在的格式显示?@Tim Williams:我将尝试拆分选项,看看如何工作。@克里斯·尼尔森:为什么将日期和时间作为单个元素“双重”存储是一个好主意?另外,如您所建议的,我将如何转换电子表格?我试图避免“重新格式化”原始数据,因为这是office软件导出的报告格式。其他工作人员不太可能进行任何手动格式化,我希望避免对将来导入工作簿的所有工作表进行“格式化”。请更详细地解释一下。@Gary学生的好地方——我以为我已经彻底阅读了要求更改的请求,结果却没有。这并不难理解,我已经添加了一行额外的内容-非常好-danl&Gary的学生:我会尝试你的建议。至于我为什么要使用DateSerial,这是我最初熟悉的(我是VBA新手),因此它本质上是我在日期操作和索引等方面的“goto”。@war鄂尔多斯
DateSerial()
还避免了与
DateValue()相关的任何古怪行为
依赖于区域设置。这是非常正确的-尽管如果日期存储为文本,您不一定能在这方面获胜,因为您仍然需要决定是将日期解释为ddmmyyy还是MMDDYYYY@Gary的学生:感谢您提供了一个允许使用DateSerial的解决方案。我目前正在测试这两个答案(DateVariable和您的DateSerial选项),看看哪一个在这种情况下表现更好——并试图限制我自己对DateSerial的偏见(或者如果您愿意的话,我缺乏经验)。
DateVariable = 10/30/2016
DateVariable = DateVariable - Day(DateVariable) + 1