Excel VBA:将整列的字符串转换为日期时间
我正在使用VBA将时间戳数据导入电子表格 我正在使用以下代码导入它:Excel VBA:将整列的字符串转换为日期时间,excel,vba,datetime,Excel,Vba,Datetime,我正在使用VBA将时间戳数据导入电子表格 我正在使用以下代码导入它: Private子选择文件() ' '用于导入日期的表单的一部分 ' Dim iFileSelect As FileDialog,sFile Set-iFileSelect=Application.FileDialog(msoFileDialogOpen) Application.ScreenUpdating=False Application.DisplayAlerts=False '运行文件拨号 与iFileSelect .
Private子选择文件()
'
'用于导入日期的表单的一部分
'
Dim iFileSelect As FileDialog,sFile
Set-iFileSelect=Application.FileDialog(msoFileDialogOpen)
Application.ScreenUpdating=False
Application.DisplayAlerts=False
'运行文件拨号
与iFileSelect
.AllowMultiSelect=False
.Title=“选择NPD文件”
.过滤器
.Filters.Add“NPD文件”、“*.NPD、*.NPD”
.InitialView=msoFileDialogViewDetails
如果.Show=-1,则
sFile=.SelectedItems(1)
工作簿。打开的文件名:=sFile_
分隔符:=“,”
如果结束
以
运行除虫(进口中的二升似乎不起作用
列(“A:A”).TextToColumns_
目的地:=范围(“A1”)_
数据类型:=xlDelimited_
空格:=假_
逗号:=真
'更新表单中的文本框
tb_ImportData.Value=sFile
Set iFileSelect=Nothing
Application.ScreenUpdating=True
端接头
原始数据文件的一个示例是:
Time,Position: Vessel Ref (Priority 1): East,North,Lat,Long,Height,Position: Vessel Ref (Priority 2): East,North,Lat,Long,Height,Position: Vessel Ref (Priority 3): East,North,Lat,Long,Height,Position: Veripos 1 Port: East,North,Lat,Long,Height,Position: Veripos 2 Stbd: East,North,Lat,Long,Height,Position: Veripos 3 Survey: East,North,Lat,Long,Height,Gyro: Seapath 1,Gyro: Seapath 2,Gyro: Octans - Port,Gyro: Octans - Stbd,Gyro: Anschutz 1,Gyro: Anschutz 2,Motion: Seapath RPH1 R, P, H,Motion: Seapath RPH2 R, P, H,Motion: Vsl Oct MRU - Port R, P, H,Motion: Vsl Oct MRU - Stbd R, P, H,Motion: MRU1 R, P, H,Motion: MRU2 R, P, H,
14/01/2021 15:38:55, 340828.7321,5482873.9254, 049°28'39.44929", 000°48'9.54126", 49.5634, 340828.7697,5482873.8963, 049°28'39.44838", 000°48'9.54317", 49.5200, 340828.7905,5482873.8792, 049°28'39.44785", 000°48'9.54423", 49.5479, 340799.5217,5482888.9646, 049°28'39.90835", 000°48'8.06891", 87.3525, 340800.1545,5482890.0231, 049°28'39.94320", 000°48'8.09880", 87.3100, 340802.1133,5482891.7275, 049°28'40.00020", 000°48'8.19360", 87.0900, 296.3800, 294.5400, 295.6100, 296.9500, 296.2000, 296.7000, 0.2000, 0.1800, 0.0000, 0.1700, 0.1500, 0.0100, -2.0900, 0.3300, 0.0000, 2.6000, -0.1800, 0.0000, 0.1894, 0.1816, 3.2660, 0.1901, 0.1553, 2.5260
14/01/2021 15:38:56, 340828.7283,5482873.9168, 049°28'39.44901", 000°48'9.54108", 49.5664, 340828.7697,5482873.8963, 049°28'39.44838", 000°48'9.54317", 49.5300, 340828.7843,5482873.8687, 049°28'39.44750", 000°48'9.54393", 49.5485, 340799.5236,5482888.9670, 049°28'39.90843", 000°48'8.06900", 87.3556, 340800.1545,5482890.0231, 049°28'39.94320", 000°48'8.09880", 87.3200, 340802.1133,5482891.7275, 049°28'40.00020", 000°48'8.19360", 87.0900, 296.3800, 294.5400, 295.6100, 296.9600, 296.2000, 296.7000, 0.2000, 0.1800, 0.0000, 0.1900, 0.1600, 0.0100, -2.0900, 0.3300, 0.0000, 2.6000, -0.1800, 0.0000, 0.1902, 0.1824, 2.8160, 0.1917, 0.1567, 2.2100
14/01/2021 15:38:57, 340828.7320,5482873.9302, 049°28'39.44944", 000°48'9.54125", 49.5632, 340828.7545,5482873.8908, 049°28'39.44819", 000°48'9.54242", 49.5302, 340828.7843,5482873.8687, 049°28'39.44750", 000°48'9.54393", 49.5385, 340799.5221,5482888.9702, 049°28'39.90853", 000°48'8.06892", 87.3524, 340800.1425,5482890.0235, 049°28'39.94320", 000°48'8.09820", 87.3200, 340802.1133,5482891.7275, 049°28'40.00020", 000°48'8.19360", 87.0800, 296.3600, 294.5300, 295.6200, 296.9600, 296.2000, 296.7000, 0.2000, 0.1800, 0.0000, 0.1900, 0.1600, 0.0100, -2.0900, 0.3300, 0.0000, 2.6100, -0.1800, 0.0000, 0.1910, 0.1827, 2.2890, 0.1924, 0.1573, 1.8520
14/01/2021 15:38:58, 340828.7220,5482873.9107, 049°28'39.44880", 000°48'9.54078", 49.5605, 340828.7584,5482873.8976, 049°28'39.44841", 000°48'9.54260", 49.5302, 340828.7905,5482873.8780, 049°28'39.44781", 000°48'9.54423", 49.5385, 340799.5235,5482888.9725, 049°28'39.90861", 000°48'8.06898", 87.3499, 340800.1425,5482890.0235, 049°28'39.94320", 000°48'8.09820", 87.3200, 340802.1133,5482891.7275, 049°28'40.00020", 000°48'8.19360", 87.0800, 296.3800, 294.5300, 295.6200, 296.9600, 296.2000, 296.7000, 0.2200, 0.1800, 0.0000, 0.2000, 0.1600, 0.0000, -2.0800, 0.3300, 0.0000, 2.6100, -0.1700, 0.0000, 0.1922, 0.1832, 1.5800, 0.1942, 0.1577, 1.1350
14/01/2021 15:38:59, 340828.7370,5482873.9382, 049°28'39.44971", 000°48'9.54148", 49.5554, 340828.7662,5482873.8896, 049°28'39.44816", 000°48'9.54300", 49.5202, 340828.7781,5482873.8571, 049°28'39.44712", 000°48'9.54364", 49.5396, 340799.5266,5482888.9775, 049°28'39.90877", 000°48'8.06913", 87.3445, 340800.1545,5482890.0231, 049°28'39.94320", 000°48'8.09880", 87.3100, 340802.1133,5482891.7275, 049°28'40.00020", 000°48'8.19360", 87.0800, 296.3700, 294.5400, 295.6200, 296.9600, 296.2000, 296.7000, 0.1900, 0.1800, 0.0000, 0.2000, 0.1600, 0.0000, -2.0800, 0.3400, 0.0000, 2.6100, -0.1700, 0.0000, 0.1944, 0.1840, 7.3700, 0.1953, 0.1574, 1.4510
14/01/2021 15:39:00, 340828.7400,5482873.9400, 049°28'39.44977", 000°48'9.54163", 49.5581, 340828.7673,5482873.9157, 049°28'39.44901", 000°48'9.54302", 49.5174, 340828.7886,5482873.8778, 049°28'39.44780", 000°48'9.54413", 49.5372, 340799.5296,5482888.9792, 049°28'39.90883", 000°48'8.06928", 87.3472, 340800.1551,5482890.0416, 049°28'39.94380", 000°48'8.09880", 87.3100, 340802.1133,5482891.7275, 049°28'40.00020", 000°48'8.19360", 87.0800, 296.3700, 294.5400, 295.6300, 296.9700, 296.2000, 296.7000, 0.2200, 0.1900, 0.0000, 0.1900, 0.1600, 0.0000, -2.0800, 0.3400, 0.0000, 2.6100, -0.1700, 0.0000, 0.1970, 0.1838, -4.0400, 0.1968, 0.1564, -9.3500
14/01/2021 15:39:01, 340828.7278,5482873.9244, 049°28'39.44925", 000°48'9.54105", 49.5462, 340828.7676,5482873.9143, 049°28'39.44896", 000°48'9.54304", 49.5183, 340828.7799,5482873.8688, 049°28'39.44750", 000°48'9.54372", 49.5354, 340799.5325,5482888.9780, 049°28'39.90880", 000°48'8.06942", 87.3413, 340800.1551,5482890.0416, 049°28'39.94380", 000°48'8.09880", 87.3100, 340802.1133,5482891.7275, 049°28'40.00020", 000°48'8.19360", 87.0800, 296.3600, 294.5400, 295.6300, 296.9700, 296.2000, 296.7000, 0.2000, 0.1800, 0.0000, 0.2000, 0.1600, 0.0000, -2.0800, 0.3400, 0.0000, 2.6100, -0.1700, 0.0000, 0.1981, 0.1823, -1.4600, 0.1982, 0.1555, -1.9200
14/01/2021 15:39:02, 340828.7411,5482873.9428, 049°28'39.44986", 000°48'9.54168", 49.5509, 340828.7676,5482873.9209, 049°28'39.44918", 000°48'9.54303", 49.5154, 340828.7873,5482873.8791, 049°28'39.44784", 000°48'9.54407", 49.5257, 340799.5319,5482888.9825, 049°28'39.90894", 000°48'8.06939", 87.3407, 340800.1551,5482890.0416, 049°28'39.94380", 000°48'8.09880", 87.3100, 340802.1133,5482891.7275, 049°28'40.00020", 000°48'8.19360", 87.0700, 296.3500, 294.5400, 295.6300, 296.9800, 296.2000, 296.7000, 0.2100, 0.1800, -0.0100, 0.2000, 0.1600, 0.0000, -2.0700, 0.3300, 0.0000, 2.6100, -0.1700, 0.0000, 0.1993, 0.1809, -2.3800, 0.1999, 0.1531, -2.7500
日期/时间字符串的格式正确(例如14/01/2021 16:08:57
)。以下是数据示例:
这里,日期时间是字符串格式。但是,如果选择一个单元格并按F2键,它会将其转换为日期时间格式
我可以使用VBA将每个单元格单独转换为DateTime格式。但是,我在这个数据集中有10000多行,因此is循环花费的时间太长
是否可以转换整个列,而不必在单个单元格中循环?假设您的日期在B2中,在C2类型中:
=Date(RIGHT(LEFT(B2, 10), 4), RIGHT(LEFT(B2, 5), 2), LEFT(B2, 2))
+
Time(RIGHT(LEFT(B2, 13), 2), RIGHT(LEFT(B2, 16), 2), RIGHT(B2, 2))
将其复制到C
列中
解释
我们正在使用Excel中的=日期(年、月、日)
和=时间(小时、分钟、秒)
函数
如果时间是14/01/2021 16:08:57
,LEFT(B2,10)
将为您提供14/01/2021
,RIGHT(LEFT(B2,10),4)
将为您提供2021。使用该方法,我们提取年、月和日期,并将其传递给date
函数
我们使用
时间
函数重复上述操作,并将它们相加。假设您的日期在B2中,在C2中键入以下内容:
=Date(RIGHT(LEFT(B2, 10), 4), RIGHT(LEFT(B2, 5), 2), LEFT(B2, 2))
+
Time(RIGHT(LEFT(B2, 13), 2), RIGHT(LEFT(B2, 16), 2), RIGHT(B2, 2))
将其复制到C
列中
解释
我们正在使用Excel中的=日期(年、月、日)
和=时间(小时、分钟、秒)
函数
如果时间是14/01/2021 16:08:57
,LEFT(B2,10)
将为您提供14/01/2021
,RIGHT(LEFT(B2,10),4)
将为您提供2021。使用该方法,我们提取年、月和日期,并将其传递给date
函数
我们使用
Time
函数重复这一过程,并将它们相加。尝试以下步骤将文本转换为日期。由于我将数据复制到内存中,这比在工作表中执行要快得多
Sub convDate()
Dim vDat As Variant
vDat = Range("A2:A1000")
Dim i As Long
For i = LBound(vDat) To UBound(vDat)
vDat(i, 1) = CDate(vDat(i, 1))
Next
Range("A2:A10000") = vDat
End Sub
尝试以下步骤将文本转换为日期。当我将数据复制到内存中时,这比在工作表中执行要快得多
Sub convDate()
Dim vDat As Variant
vDat = Range("A2:A1000")
Dim i As Long
For i = LBound(vDat) To UBound(vDat)
vDat(i, 1) = CDate(vDat(i, 1))
Next
Range("A2:A10000") = vDat
End Sub
使用TextToColumns时,可以通过FieldInfo参数指定列的数据格式 要指定列为格式为YMD的日期,可以使用xlYMDFormat
Columns("A:A").TextToColumns _
Destination:=Range("A1"), _
DataType:=xlDelimited, _
Space:=False, _
Comma:=True, FieldInfo:=Array(Array(1, xlYMDFormat))
使用TextToColumns时,可以通过FieldInfo参数指定列的数据格式 要指定列为格式为YMD的日期,可以使用xlYMDFormat
Columns("A:A").TextToColumns _
Destination:=Range("A1"), _
DataType:=xlDelimited, _
Space:=False, _
Comma:=True, FieldInfo:=Array(Array(1, xlYMDFormat))
谢谢,@zedfoxus。我试过了,但我希望能把它全部保存在VBA中。Excel知道它是时间和日期,但却很难将它视为正确的类型,这似乎很可笑。为什么公司不能都开始使用Python呢?@GalacticPounder在VBA中,可能更容易。你可以做
CDate(“14/01/2021 16:08:57”)
或其他任何值。可能问题与我的假设有点不同。您是否可以包含一个示例文本数据和您为将其导入Excel而编写的示例VBA?我可以获取这些数据并运行一些测试,以查看如何在Excel中获得正确的日期。我对我的问题进行了一点编辑。要总结更改,我是br在数据文件中,当数据文件进入Excel时,DT是一个字符串。在Excel中,按F2键可以将字符串转换为DT。如何一次阻止更改所有单元格(如果可能,不添加额外的列或插入公式)@GalacticPounder您似乎想更改数据。我不知道如何做。如果您可以共享您的数据文件和您为导入数据而编写的VBA的示例,我可以重新编写VBA,以便正确导入数据。我的答案是添加一个新列并转换您的数据。这只需要很少的工作,您仍然可以获得clean数据。我刚刚实现了你的方法,它正在工作。谢谢你。它有点“黑客”/比我希望的更不稳定,但我想这只是VBA。谢谢,@zedfoxus。我尝试过,但我希望能够将它全部保存在VBA中。Excel知道时间和日期,但却很难让它将其视为正确的类型,这似乎很可笑。为什么所有公司都不能开始使用Python?@GalacticPounder in VBA、 这可能更简单。你可以做CDate(“14/01/2021 16:08:57”)
或其他任何值。可能问题与我的假设有点不同。您是否可以包含一个示例文本数据和您为将其导入Excel而编写的示例VBA?我可以获取这些数据并运行一些测试,以查看如何在Excel中获得正确的日期。我对我的问题进行了一点编辑。要总结更改,我是br在数据文件中,当它进入Excel时,DT是一个字符串。您可以在Excel中按将字符串转换为DT