2011-09-16 168 views
2

这是我的第一个问题,所以我希望一切都正确。我已经破解了一些代码来从excel中读取数据,并输出带有语音标记的CSV文件给每个单元格,不管是否为空。问题出在excel将YYYY-MM-DD日期写入CSV的日期为MM-DD-YYYY。为了解决这个问题,我写了下面的if语句:Excel单元格日期格式

If IsDate(Cells(r, c)) Then 

不幸的是,现在的程序在它解释细胞与“2A”作为一个日期,以及(即使我已经检查的格式在Excel中是文本),将其导出为“1899-12-30”。我已经把在一个非常快速和肮脏的子句来过滤此

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

但我不知道是否有一个更优雅的方式,转换日期格式,仅在YYYY-MM-DD或类似的格式。为什么它认为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 
+0

你是指“A2”(如问题文本中)或“2A”(如在你的代码中)?另外,你需要用'Selection.'来限定所有的单元格引用(例如'IsDate(Selection.Cells(r,c)')如果编码它将只按预期工作,如果你的选择开始于单元格A1 –

+0

很好的反馈,更正,并感谢 – pluke

回答

4

问题就出现了,因为2A被解释为2 AM

?isdate("2A") 
True 

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

与这依赖于在该日期旁边的列是什么类型的值的处理,你可以检查他们的长度或检查日期时间不包含日期部分时使用的默认日期;

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

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

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

+0

解释它,谢谢 – pluke

1

单独从亚历克斯好解释,你的日期问题,您可能想看看我的代码从http://www.experts-exchange.com/A_3509.html(全文有解释)优化你的整体方法,因为

  1. 变阵列更比范围有效
  2. 它处理“”内部CELS,wheras您当前的代码会将此视为一个标志,以拆分单元格内容
  3. 当concatening长字符串有两个短字符串,最好是加入了两个短串在一起首先(使用paretheses),否则长串连接两次

样品下面没有转栏和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 
1

一个更简单的方法是在细胞例如使用文本值的行

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 

使用。文本避免您与格式

中遇到的所有问题(我还建议阅读本help on writing loops with Excel ranges。这意味着你可以定义行,列在有关的表格,而不是绝对地址或选择)

0

这将是日期格式

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

UV是列和newrow有用的是一个变量