【问题标题】:excel cell date formatexcel单元格日期格式
【发布时间】:2011-11-18 13:07:17
【问题描述】:

这是我在这里的第一个问题,所以我希望一切都是正确的。我已经破解了一些代码来从 excel 中读取并为每个单元格输出带有语音标记的 CSV,无论是否为空白。问题在于excel在将其写入CSV时将YYYY-MM-DD日期转换为MM-DD-YYYY的日期。为了解决这个问题,我编写了以下 if 语句:

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

【问题讨论】:

  • 您的意思是A2(在问题文本中)还是2A(在您的代码中)?此外,您需要使用Selection.(例如IsDate(Selection.Cells(r,c))限定所有您的单元格引用。按照编码,如果您的选择从单元格A1 开始,它只会按预期工作。
  • 很好的反馈,更正,谢谢

标签: excel vba csv


【解决方案1】:

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

?isdate("2A")
True

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

处理这取决于日期旁边列中的值类型,您可以检查它们的长度或检查当 DateTime 不包含日期部分时使用的默认日期;

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

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

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

【讨论】:

    【解决方案2】:

    除了 Alex 对您的日期问题的良好解释之外,您可能还想查看我来自 http://www.experts-exchange.com/A_3509.html 的代码(整篇文章有解释),以优化您的整体方法

    1. 变体数组比范围更有效
    2. 它在单元格内处理“,”,而您当前的代码会将其视为拆分单元格内容的标志
    3. 将长字符串与两个短字符串连接时,最好先将两个短字符串连接在一起(使用括号),否则长字符串会连接两次

    下面的示例确实转置了您可能不想遵循的列和行

    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
    

    【讨论】:

      【解决方案3】:

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

      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 可以避免您在格式方面遇到的所有问题

      (我还建议阅读此help on writing loops with Excel ranges。这意味着您可以定义与表相关的行、列,而不是绝对地址或选择)

      【讨论】:

        【解决方案4】:

        这对于日期格式很有用

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

        UV 是列,newrow 是变量

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-08-24
          • 1970-01-01
          • 1970-01-01
          • 2014-02-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多