Excel的单元格date格式

这是我的第一个问题,所以我希望一切都是正确的。 我已经破解了一些代码来从excel中读取,并输出一个带有语音标记的CSV文件给每个单元格,不pipe是否为空。 问题出在Excel将date转换成MM-DD-YYYY的date写入CSV。 为了解决这个问题,我写了如下的陈述:

If IsDate(Cells(r, c)) Then 

不幸的是,程序现在将解释为“2A”的单元格作为date(即使我已经检查了excel中的格式是文本),将其导出为“1899-12-30”。 我已经放入一个非常快速和肮脏的条款来过滤这个

 If Selection.Cells(r, c) = "2A" Then 

但我想知道是否有一个更优雅的方式来转换只有YYYY-MM-DD或类似格式的date格式。 为什么它认为A2是一个约会!? 完整代码如下:

 For r = 1 To Selection.Rows.Count s = """" c = 1 For c = 1 To Selection.Columns.Count If IsDate(Selection.Cells(r, c)) Then 'ridiculous clause to get rid of A2 being treated as a date If Selection.Cells(r, c) = "2A" Then s = s & Selection.Cells(r, c) Else s = s & Format(Selection.Cells(r, c), "YYYY-MM-DD") End If Else s = s & Selection.Cells(r, c) End If If c = Selection.Columns.Count Then s = s & """" 'end of row Else s = s & """,""" 'mid row End If Next c a.writeline s Next r 

问题出现是因为2A被解释为2 AM

 ?isdate("2A") True ?cdate("2A") 02:00:00 

处理这个问题取决于date旁列中的值是什么types,您可以检查它们的长度或检查DateTime中不包含date部分时使用的默认date;

 if format$(cdate("2A"), "YYYY-MM-DD") = "1899-12-30" then ..dodgy.. 

或者看看它的模式; if isdate(x) and x like "####-##-##"或者可以将该值转换为date并检查它是否在适当的范围内。

您也可以重新格式化列本身Selection.NumberFormat = "yyyy-mm-dd"

除了Alex对你的date问题的很好的解释,你可能想看看我的代码http://www.experts-exchange.com/A_3509.html (完整的文章有解释),以优化您的整体方法为

  1. 变体数组比范围效率更高
  2. 它处理“,”在内部,你当前的代码将视此为分裂单元格内容的标志
  3. 当用两个短string连接一个长string时,最好先将两个短string连接在一起(使用不相关的),否则将长string连接两次

下面的示例将转置你不想遵循的presumbaly列和行

 Sub CreateCSV_FSO() Dim objFSO Dim objTF Dim ws As Worksheet Dim lRow As Long Dim lCol As Long Dim strTmp As String Dim lFnum As Long Set objFSO = CreateObject("scripting.filesystemobject") Set objTF = objFSO.createtextfile(sFilePath, True, False) For Each ws In ActiveWorkbook.Worksheets 'test that sheet has been used Set rng1 = ws.UsedRange If Not rng1 Is Nothing Then 'only multi-cell ranges can be written to a 2D array If rng1.Cells.Count > 1 Then X = ws.UsedRange.Value2 'The code TRANSPOSES COLUMNS AND ROWS by writing strings column by column For lCol = 1 To UBound(X, 2) 'write initial value outside the loop strTmp = IIf(InStr(X(1, lCol), strDelim) > 0, """" & X(1, lCol) & """", X(1, lCol)) For lRow = 2 To UBound(X, 1) 'concatenate long string & (short string with short string) strTmp = strTmp & (strDelim & IIf(InStr(X(lRow, lCol), strDelim) > 0, """" & X(lRow, lCol) & """", X(lRow, lCol))) Next lRow 'write each line to CSV objTF.writeline strTmp Next lCol Else objTF.writeline IIf(InStr(ws.UsedRange.Value, strDelim) > 0, """" & ws.UsedRange.Value & """", ws.UsedRange.Value) End If End If Next ws objTF.Close Set objFSO = Nothing MsgBox "Done!", vbOKOnly End Sub 

一个更简单的方法是使用单元格中的文本值

 For r = 1 To Selection.Rows.Count s = """" c = 1 For c = 1 To Selection.Columns.Count s = s & Selection.Cells(r, c).Text If c = Selection.Columns.Count Then s = s & """" 'end of row Else s = s & """,""" 'mid row End If Next c a.writeline s Next r 

使用.Text可以避免格式中遇到的所有问题

(我也build议阅读这个帮助,用Excel范围编写循环,这意味着你可以定义行,列相对于你的表,而不是绝对地址或select)

这对date格式很有用

 Range("U2:U" & newrow).NumberFormat = "mm/dd/yy" Range("V2:V" & newrow).NumberFormat = "mm/dd/yy" 

UV是列, newrow是一个variables