保存为文本文件时,代码更改日期格式

时间:2016-01-19 14:11:17

标签: excel vba excel-vba

我编写的代码将工作簿中的每个工作表单独保存为文本文件。如果我使用“另存为”类型下拉列表中的“文本(制表符分隔)”选项手动执行此操作,则文本文件将保留我的时间和英国日期的原始格式,即00:15 29/12/2001。我之后使用的系统从文本文件导入数据要求它采用这种格式。当我运行宏来导出数据时,生成的文本文件会从当时的前导零开始,并将日期翻转为美国格式,即12/29/2001 0:15,这会导致后续系统故障转移

为什么手动执行时文本文件正常,而宏执行时却没有?你是如何解决它的?我正在使用的代码如下:

Sub SaveSheetsAsText()

Dim sFile As String
Dim sht As Worksheet

For Each sht In Worksheets
    sht.Copy
    sFile = sht.Name & ".txt"
    ActiveWorkbook.SaveAs Filename:=sFile, FileFormat:=xlText, CreateBackup:=False, Local:=True
    ActiveWorkbook.Close SaveChanges:=True
Next sht

End Sub

更新: 有关电子表格的更多信息:

时间在A栏 - 公式栏显示00:15:00但单元格格式化为仅显示00:15

日期在B栏 - 公式栏显示29/12/2001,单元格显示相同的

实际数据是C列中的数值,例如2.497 - 本栏目没有问题。

我已经查看了发布的链接,但它超出了我的想法。

3 个答案:

答案 0 :(得分:0)

不幸的是,VBA说“美国人”,这意味着只要你让VBA做一个保存为文本,它将使用美国格式的日期。解决此问题的唯一方法是完全控制在VBA中创建文本文件。幸运的是,您不是第一个遇到此问题的人,请参阅:http://dailydoseofexcel.com/archives/2004/11/09/roll-your-own-csv/

答案 1 :(得分:0)

我只是猜测我能不能帮忙......

Sub SaveSheetsAsText()

Dim sFile As String
Dim sht As Worksheet

For Each sht In Worksheets

'myImplementation
    Dim rng As Range 'always is better to set te var in the beginning
    Dim r
    Dim c
    Dim i
    Dim t

    r = Range("A1").End(xlDown).Row 'take the row of the last cell in column A
    c = 1 'Column A 'Just take the number of the column

    Set rng = Range(Cells(1, 1), Cells(r, c)) 'Set the range with the dates

    For Each i In rng 'for each date in the range
        t = i.Text 'Store the TEXT (not the date) inside the var
        i.NumberFormat = "@" 'Set the format of the cell to Text
        i.Value = t 'set the value of the cell to the text of the date
    Next i 'next one please!
'myImplementation

    sht.Copy
    sFile = sht.Name & ".txt"
    ActiveWorkbook.SaveAs Filename:=sFile, FileFormat:=xlText, CreateBackup:=False, Local:=True
    ActiveWorkbook.Close SaveChanges:=True
Next sht

End Sub

正如我在评论中告诉你的那样:如果您在单元格中有一个日期,当您看到公式栏时,您会看到非格式化日期(原始内容:1/19/2016 9:00:00 AM),但在单元格中您格式化该内容作为日期,数字或其他任何东西。如果您在单元格栏中看到此08:23 21/01/2016单元格,则表示您没有在单元格内部显示文本的日期。

您的代码会转到每张工作表,但在保存任何内容之前,请将日期更改为文本...这对我有用,但请告诉我这是否无法实现。

答案 2 :(得分:0)

问题是否相当陈旧,但解决方案只需要1行: 在保存之前将这些放在您需要的列上。

  

列(“D:D”)。NumberFormat =“dd / mm / yyyy”

它真的对我有用。 此致