2 VBA宏和日期格式化的问题。

问题描述 投票:0回答:1

我看了其他帖子,但找不到与我的问题足够相似的内容。希望得到任何帮助。我有一组日期,每天都有,日期的格式如下。DD.MM.YYYY (我住在一个先有日期的国家)。 我需要把数据改成DDMMYYYY。然后,我在Vlookup中使用这些日期作为数据集的一部分,该数据集包含我希望检索的信息。我需要帮助解决以下问题:问题#1

当我使用宏并将". "与""切换时,第1至12天已被切换为以下格式DDMMYYYY。然而,实际的月份和日期已经切换。目前工作在4月,所以01.04.2020已经切换到04012020(读作1月4日);04022020(2月2日,以此类推......)。问题2 从第13天开始,格式看起来是正确的 "13042020",但是当我在Vlookup中使用它时,公式不会带来任何结果。为了让Vlookup工作,我必须进入我刚刚更改的单元格,并在第一个数字前面按删除键,即使那里没有空格;为了让Vlookup工作。

为什么会出现这种情况?我该怎么做才能在替换了". "和""后正确工作?

以下是我的代码

Sub Dates()

Range(Range("G12"), Range("G12").End(xlDown)).Select


Selection.NumberFormat = "dd.mm.yyy"

Selection.Replace What:=".", Replacement:="/", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False

Selection.NumberFormat = "dd/mm/yyy" 

End Sub 
excel vba
1个回答
1
投票

试试。

Sub test()
    Dim vDB, rngDB As Range
    Dim s As Variant
    Dim i As Long

    Set rngDB = Range("G12", Range("G12").End(xlDown))
    vDB = rngDB
    For i = 1 To UBound(vDB, 1)
        s = Split(vDB(i, 1), ".")
        vDB(i, 1) = DateSerial(s(2), s(1), s(0))
    Next i
    rngDB = vDB
    rngDB.NumberFormatLocal = "dd/mm/yyyy"
End Sub

错误图像

enter image description here

正确的图像

enter image description here


0
投票

以下是您的代码的解决方案 照样.

我强烈建议阅读并进一步了解 如何避免在Excel VBA中选择 来改进你的代码,降低运行时出错的风险。

如果你将这段代码添加到你现有的存储过程的底部(如你的问题中所示),它将循环浏览每个单元格,并将其重新格式化为正确的日期值。

Dim myCell As Variant
Dim myRange As Range

Set myRange = Selection

For Each myCell In myRange
    myCell.Value = Format(CDate(myCell), "DD/MM/YYYY")
Next

你可能会发现这个链接也很有用。

寻找最后使用的行的更好方法

如果你考虑到这两个链接中的信息来完善你的代码,你将最终避免了 .SelectSelection. 完全不一样,你的目标rangeecell就不会那么模棱两可了。


我把它重新编排如下。

注意: 我把它写在 Sheet1 的新工作簿,您需要更改该工作簿的 Sheets("...") 参考资料来匹配你的工作表名称。

Sub dates()

Dim myRange As Range
Dim LastRow As Long
Dim myCell As Range

    With ThisWorkbook.Sheets("Sheet1")
        LastRow = .Cells(.Rows.Count, 7).End(xlUp).Row
        Set myRange = Range("G12:G" & LastRow)

        For Each myCell In myRange
            myCell.Value = Replace(myCell, ".", "/")
            myCell.Value = Format(CDate(myCell), "DD/MM/YYYY")
        Next myCell
    End With
End Sub

现在,我们在工作簿上的哪些地方做了修改,这就更清楚了,这有助于提高你和其他人(比如SO上的其他用户)的可读性,同时也减少了歧义和风险。RunTime 错误。


0
投票

谢谢文字转栏目的建议,这是我做的工作。

Sub Dates ()


Dim rg As Range

Set rg = Range("G12").CurrentRegion

    rg.TextToColumns Destination:=Range("H2"), ConsecutiveDelimiter:=True, DataType:=xlDelimited, Other:=True, OtherChar:="."

    lr = ActiveSheet.Cells(Rows.Count, "G").End(xlUp).Row

    Range("K2").Formula = "=DATE(J2,I2,H2)"

    Range("K2").AutoFill Range("K2:K" & lr)
© www.soinside.com 2019 - 2024. All rights reserved.