Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel VBA:将整列的字符串转换为日期时间_Excel_Vba_Datetime - Fatal编程技术网

Excel 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 .

我正在使用VBA将时间戳数据导入电子表格

我正在使用以下代码导入它:

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