0

编辑:VBA 代码现在可以工作了。只是和 .currentregion 让我搞砸了

我有一个问题,希望这只是我这边的一些愚蠢的错误。我有一个数据集,我每天至少获得一次,日期不被识别为日期,而是作为普通文本。我想用 VBA 宏将此列更改为最新。我现在写的代码,只是给了我一个错误信息,我不知道出了什么问题。

这是文件的样子,我不知道如何附加文件......

在此处输入图像描述

这是我的代码

Sub Test()

Dim rg As Range
Set rg = Range("B2:B4")
rg.TextToColumns Destination:=Range("B2:B5"), ConsecutiveDelimiter:=True, DataType:=xlDelimited, Space:=True, FieldInfo:=Array(Array(1, 5))

End Sub

任何建议代码可能有什么问题或我如何使它工作?当我在 Excel 本身的文本到列中执行此操作时,日期格式为 YMD。这是更大的 VBA 的一部分,因此将其作为 VBA 执行要比每次需要时手动执行要容易得多。

4

2 回答 2

0

在 Excel 中,我将使用以下内容,假设 ERIKA 的日期在 B2 中:

=DATE(LEFT(B2,4),MID(B2,5,2),RIGHT(B2,2))

在 VBA 中,在一个函数中,我会使用:

Function TextToDate(txt As String) As Date
TextToDate = DateSerial(Left(txt, 4), Mid(txt, 5, 2), Right(txt, 2))
End Function
于 2021-10-06T11:37:00.690 回答
0

我建议将所有数据加载到一个数组中,然后运行“迁移”。使用数组处理数据比直接处理单元格要快得多。

或者,您也可以使用公式。


Option Explicit

Public Sub migrateDate()
Dim ws As Worksheet: Set ws = ActiveSheet   'adjust to your needs
Dim rgDates As Range
Set rgDates = ws.Range("B2:B5")  'adjust to your needs, use explicit .Range referencing the worksheet you want to work on - not an implicit Range!!!

Dim arrDates As Variant
arrDates = rgDates.Value

Dim i As Long
Dim strDate As String, year As Long, month As Long, day As Long

For i = 1 To UBound(arrDates, 1)
    strDate = arrDates(i, 1)
    If LenB(strDate) > 0 Then
        If IsNumeric(strDate) And Len(strDate) = 8 Then
            year = Left(strDate, 4)
            month = Mid(strDate, 5, 2)
            day = Right(strDate, 2)
        End If
        arrDates(i, 1) = DateSerial(year, month, day)
    End If
Next

rgDates.Value = arrDates

End Sub
于 2021-10-06T11:37:16.150 回答