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
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
7条答案
按热度按时间xkrw2x1b1#
pnuts注解是解决这个问题的最简单的方法。
说明:
运行"记录宏",选择列并启动文本到列向导。
在文本转列向导的第3页上,"列数据格式"下的"日期"选项自动设置为"MDY"。请将其更改为"DMY"。
停止宏,您将找到以下代码
=Array(1,4)
中的"4"是决定DMY格式的部分。jhkqcmku2#
也许你可以先用应用程序设置语言。国际?
[http://msdn.microsoft.com/en-us/library/office/ff840213(v=office.15).aspx][1]
0tdrvxhp3#
我有一个更好的选择。将列定义为文本,以便:
使用2格式会创建一个文本字段,因此不会进行格式设置。
643ylb084#
对于这种情况有一个变通办法。在执行TexttoColumn之前,首先从文本中获取日期部分。此日期将以文本形式显示。使用Left、Mid和right函数获取日期。月和年,然后使用函数dateserial在vba与这些参数。现在你会得到2种类型的日期。日期在文本格式,这将是在英国格式,您可以存储在单元格中的excel。其他为英国格式,如果日期〈今天条件,将用于。U现在可以使用文本到列,忽略来自文本到列的日期,并使用日期作为文本。下面提到的相同代码,例如“31/08/2014 part1 part2”
uubf1zoe5#
我今天也遇到了同样的问题,我也在文本中使用了DMY到列,当手动操作时,DMY工作正常,但在VBA中,如上所述,总是在可能的情况下更改为美国数据格式。
我通过在右侧插入一个新列并使用= TEXT(Cell,"DD/MM/YYYY"),然后复制并粘贴值来解决这个问题(这可能不适合您)。
我删除了原来的列后,我还确保这总是工作,无论行数的工作,我的最后一行的数据在每一次。
下面的VBA段..
希望这个有用。
谢谢
汤姆
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仅应用于真正的文本格式数据。一种可能的解决方法是先将整个数据读入数组,然后再将其写回,以确保所有数据都具有相同的初始格式。
wydwbb8l7#
回答这个问题有点晚,但我遇到了同样的问题(在Excel 2019中),经过几次尝试/捕获循环,终于解决了这个问题。
例如,使用DMY格式的日期纯文本(单行):
对我来说,答案是用“AM”和“PM”替换所有出现的“a.m.”和“p.m.”,在纯文本中不带格式地分成列:
整个过程结束后,删除了几个无用的列,在列A中添加了连接时间戳,在列B中添加了断开连接时间戳。
最后一步,将该文本转换为适当的日期字段:
再加上我真正需要的,那就是连接的时间:
必须保留A列和B列吗?是的。在这一点上并不重要,因为我不会保存它,只是需要一个时间段计算。只是为了美观而隐藏它们
尝试巴里建议,但查询Application.International(xlDateOrder)返回1,根据文档,这是DMY:
希望这能帮助到一些人。
问候古斯塔沃。