excel VBA文本到列阅读日期格式

zi8p0yeb  于 2023-01-27  发布在  其他
关注(0)|答案(7)|浏览(231)

当在vba中运行文本到列时,它会普尔斯我的日期作为美国日期而不是英国日期,只要它有可能这样做。例如,31-Aug仍然是31-Aug,但是01-Sep变成了09-Jan!
有没有办法在vba运行之前指定所有日期都是英国格式的?因为即使只是重新格式化为美国日期以显示为美国日期也不会起作用,因为我们有运行if date < Today的代码,这当然会导致更改日期格式的问题。
数据以dd/mm/yyyy格式馈送,但excel读取它时显示为mm/dd/yyyy!

xkrw2x1b

xkrw2x1b1#

pnuts注解是解决这个问题的最简单的方法。
说明:
运行"记录宏",选择列并启动文本到列向导。
在文本转列向导的第3页上,"列数据格式"下的"日期"选项自动设置为"MDY"。请将其更改为"DMY"。
停止宏,您将找到以下代码

Columns("A:A").Select
Selection.TextToColumns Destination:=Range("A:A"), DataType:=xlDelimited, _
    TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
    Semicolon:=False, Comma:=False, Space:=False, Other:=False, FieldInfo _
    :=Array(1, 4), TrailingMinusNumbers:=True

=Array(1,4)中的"4"是决定DMY格式的部分。

0tdrvxhp

0tdrvxhp3#

我有一个更好的选择。将列定义为文本,以便:

Columns("A:A").Select
Selection.TextToColumns Destination:=Range("A:A"), DataType:=xlDelimited, _
    TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
    Semicolon:=False, Comma:=False, Space:=False, Other:=False, FieldInfo _
    :=Array(1, 2), TrailingMinusNumbers:=True

使用2格式会创建一个文本字段,因此不会进行格式设置。

643ylb08

643ylb084#

对于这种情况有一个变通办法。在执行TexttoColumn之前,首先从文本中获取日期部分。此日期将以文本形式显示。使用Left、Mid和right函数获取日期。月和年,然后使用函数dateserial在vba与这些参数。现在你会得到2种类型的日期。日期在文本格式,这将是在英国格式,您可以存储在单元格中的excel。其他为英国格式,如果日期〈今天条件,将用于。U现在可以使用文本到列,忽略来自文本到列的日期,并使用日期作为文本。下面提到的相同代码,例如“31/08/2014 part1 part2”

Sub t() 

Dim myarr() As String

Dim cell As Range

  For Each cell In Selection ' selection contains cells which text you need to convert text to columns
      i = i + 1
      myarr = Split(cell.Value, " ")
      mydate = Val(Left(myarr(0), 2))
      mymonth = Val(Mid(myarr(0), InStr(1, myarr(0), "/") + 1, 2))
      myyear = Val(Right(myarr(0), 4))
      date_american = DateSerial(myyear, mymonth, mydate)
      date_uk = myarr(0)
  Next cell

End Sub
uubf1zoe

uubf1zoe5#

我今天也遇到了同样的问题,我也在文本中使用了DMY到列,当手动操作时,DMY工作正常,但在VBA中,如上所述,总是在可能的情况下更改为美国数据格式。
我通过在右侧插入一个新列并使用= TEXT(Cell,"DD/MM/YYYY"),然后复制并粘贴值来解决这个问题(这可能不适合您)。
我删除了原来的列后,我还确保这总是工作,无论行数的工作,我的最后一行的数据在每一次。
下面的VBA段..

Sub Dateformat()

'sets i as last current row with data in

    Dim i As Integer

    Range("A2").Select

    i = ActiveCell.End(xlDown).Row

    Columns("D:D").Select
Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
Range("D2").Select
ActiveCell.FormulaR1C1 = "=TEXT(RC[-1],""DD/MM/YYYY"")"
Selection.Copy
Range("D2:D" & i).Select
ActiveSheet.Paste
Application.CutCopyMode = False
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
Columns("C:C").Select
Selection.Delete Shift:=xlToLeft

End Sub

希望这个有用。
谢谢
汤姆

9o685dep

9o685dep6#

以下观察结果可能会有所帮助(Excel365 64位):
结论:请注意,TextToColumn只能应用于实际包含文本格式日期的单元格,而不能应用于Excel已识别为日期的单元格。
观察结果:我使用VBA从包含日期的数组中使用"range. value ="填充单元格。结果将是用文本格式的数据填充的单元格(例如,01.09.2019在单元格中,但Excel不知道它是2019年9月1日的日期,而只能看到文本)。然后我使用VBA TextToColumns将这些单元格转换为实际日期,指定"FieldInfo:= Array(1,4)"。格式确实是DMY。
这工作得很好,但当范围中的一些单元格已经被Excel识别为日期时,所有的事情都变得一团糟。
在我的案例中的场景:使用"value =(dates from a arry variable)"将数据添加到列的底部,从而导致文本格式的单元格。我想使用TextToColumn将数据重新格式化为日期。但TextToColumns每次都应用于包含先前已重新格式化的单元格的整个列,而不仅仅是新添加的数据。
事情是这样的:由于某种原因,VBA正确读取了已经是日期格式的单元格,但随后在可能的情况下切换月和日,将它们写回MDY。要了解我的意思,您可以尝试使用"FieldInfo:= Array(1,2)"将TextToColumns应用到日期格式单元格。01.09.2019表示1. Sept. 2019将被转换为文本单元格,其中"09/01/2019"表示9. January 2019。
因此,当以日期格式写回时,我们必须小心地将TextToColumn仅应用于真正的文本格式数据。一种可能的解决方法是先将整个数据读入数组,然后再将其写回,以确保所有数据都具有相同的初始格式。

wydwbb8l

wydwbb8l7#

回答这个问题有点晚,但我遇到了同样的问题(在Excel 2019中),经过几次尝试/捕获循环,终于解决了这个问题。
例如,使用DMY格式的日期纯文本(单行):

03/12/2022 05:58:49 p. m.   info    192.168.XX.X
    connect     03/12/2022 06:07:18 p. m.   info    disconnect

对我来说,答案是用“AM”和“PM”替换所有出现的“a.m.”和“p.m.”,在纯文本中不带格式地分成列:

Selection.TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
    TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
    Semicolon:=False, Comma:=False, Space:=False, Other:=False, _
    FieldInfo:=Array(Array(1, xlTextFormat), Array(2, 1), Array(3, 1), Array(4, 1), _
    Array(5, 1), Array(6, 1), Array(7, xlTextFormat), Array(8, 1), Array(9, 1)), _
    TrailingMinusNumbers:=True

整个过程结束后,删除了几个无用的列,在列A中添加了连接时间戳,在列B中添加了断开连接时间戳。
最后一步,将该文本转换为适当的日期字段:

Range("C1").Select
ActiveCell.FormulaR1C1 = "=DATE(MID(RC[-2], 7, 4), MID(RC[-2], 4, 2), " & _
    "MID(RC[-2], 1, 2)) + TIMEVALUE(MID(RC[-2], 12, 11))"
Range("D1").Select
ActiveCell.FormulaR1C1 = "=DATE(MID(RC[-2], 7, 4), MID(RC[-2], 4, 2), " & _
    "MID(RC[-2], 1, 2)) + TIMEVALUE(MID(RC[-2], 12, 11))"

再加上我真正需要的,那就是连接的时间:

Range("E1").Select
ActiveCell.FormulaR1C1 = "=RC[-1]-RC[-2]"

必须保留A列和B列吗?是的。在这一点上并不重要,因为我不会保存它,只是需要一个时间段计算。只是为了美观而隐藏它们
尝试巴里建议,但查询Application.International(xlDateOrder)返回1,根据文档,这是DMY:

  • xlDateOrder日期元素的长顺序:0 =月-日-年,1 =日-月-年,2 =年-月-日 *

希望这能帮助到一些人。
问候古斯塔沃。

相关问题