您好,JM。您可能不知道,有一个脚本专家的兄弟是演员。每个演员都知道,演艺圈中认人为亲的风气相当普遍。嗯,好在脚本专家不是演员,因为我们决不屈服于这样的徇私风气。(我说好在脚本专家不是演员还有其它原因,但那是另外一回事。)我们会随机地从每天收到的数百个问题中选择一些问题来回答。因此,嗯,JM 小兄弟,您想知道什么?哦,对了,是如何在 Excel 中将数字转换为日期。
我们从您的电子邮件了解到,您好像有一个含数字列的电子表格,数字的前一两位(取决于月份)代表月,接下来的两位(始终是两位)代表日,最后两位或四位(06 或 2006)代表年。就如下图所示:
我们的第一个想法是只使用 FormatDateTime 方法。此方法接受字符串并以日期格式输出该字符串:
strNew = FormatDateTime(strOld)
我们遇到的问题是表中的第一个日期 40806 变成了 9/20/2011。为什么呢?嗯,Excel 的一个有趣之处就是,当您试图将数字转换为日期时,程序会假定该数字是一个序列号,代表自 1900 年 1 月 1 日起所发生的天数。自 1900 年 1 月 1 日 算起的第 40806 天就是 2011 年 9 月 20 日。看来我们得从头开始了。
最后,我们决定将数字按字符串处理:使用 VBScript 函数 Left、Right 和 Mid 将字符串分开,然后将返回的各部分放在一起并加上相应的符号,这些符号会让 Excel 知道我们要的是实际日期,而不是序列号。下面就是我们提供的脚本:
Set objExcel = CreateObject("Excel.Application")
Set objWorkbook = objExcel.Workbooks.Open("C:/scripts/test.xls")
intRow = 1
intCol = 1
i = 0
Do Until objExcel.Cells(intRow,intCol).Value = ""
strDate = objExcel.Cells(intRow, intCol).Value
i = Len(strDate)
If i > 6 Then
dtYear = Right(strDate, 4)
i = i - 5
Else
dtYear = Right(strDate, 2)
i = i - 3
End If
dtDay = Mid(strDate, i, 2)
i = i - 1
dtMonth = Left(strDate, i)
newDate = dtMonth & "/" & dtDay & "/" & dtYear
objExcel.Cells(intRow, intCol).Value = newDate
intRow = intRow + 1
Loop
objExcel.Visible = True
我们首先要做的就是创建一个 Excel 对象并打开电子表格。然后我们构建一个 Do 循环以遍历整个日期列。到达列中的空单元格时循环即会停止;如果每个列中都没有日期,就必须修改此脚本。
接下来,我们从第一个单元格(恰好是第 1 行第 1 列)读入日期:
strDate = objExcel.Cells(intRow, intCol).Value
然后,使用 Len 函数检索日期字符串中的字符数。因为字符串的长度不总是一样的,所以在逐位读取字符串时要使用此数字来跟踪剩余的字符数。
读取字符串时,我们从其结尾处开始。考虑各种日期格式,含两位年份的字符串最长为六个字符,而含四位年份的字符串最短为七个字符。因此我们检查字符串是否多于六个字符;如果是,意味着此特定值肯定使用四位数字表示年份。因此,我们使用 Right 函数读取后四个字符并将其保存为年份。如果字符串含六个或更少的字符,只能意味着一件事情:它使用两位数字表示年份。因此,我们只读入后两个字符并将其保存为年份:
If i > 6 Then
dtYear = Right(strDate, 4)
i = i - 5
Else
dtYear = Right(strDate, 2)
i = i - 3
End If
如您所见,我们又将剩下的字符串长度减去年份长度加一。在接下来往回读取字符串来确定日的时候(哦对了,这些是美国格式的日期),我们会用到此数字:
dtDay = Mid(strDate, i, 2)
i = i - 1
这里我们用 Mid 函数表示要从位置 i 处开始检索两个字符;前面我们说过,因为我们要检索两个字符,所以 i 等于字符串长度减去年份长度再减一。换言之,我们的第一个字符串含有五个字符,因此 i 值为 5。读取年份后,i 值等于 5 - 2 - 1,即 2。我们从第 2 位开始提取两个字符,恰好就代表日。然后我们再减去 1,并使用此位置来检索月份:
dtMonth = Left(strDate, i)
这里我们用 Left 函数检索剩余字符数(在本例中为一),并将其保存为月份。接下来,只需将字符串放在一起,用斜杠 (/) 分隔日期的各部分:
newDate = dtMonth & "/" & dtDay & "/" & dtYear
之后,我们将新字符串放入其原始单元格中,将行数递增,在该列的下一行重新开始循环。最后一件事是使 Excel 可见,以便您能看到结果。
就是这样。代我们问候母亲。嗯,是代我们问候您的母亲…。