繁体   English   中英

2 VBA 宏和日期格式的问题

[英]2 Problems with a VBA Macro and Date Formating

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

当我使用宏并切换“。”时使用“/”,第 1 到 12 天已切换为以下格式 DD/MM/YYYY。 但是,实际的月份和日期已经调换了。 目前在四月工作,所以 01.04.2020 已切换到 04/01/2020(阅读为一月四日); 04/02/2020(二月二等……)。 我怎样才能防止这种情况发生,以便一切都保持原样,只有“。” 和“/”的变化。 问题 #2 从第 13 天起,格式看起来是正确的“13/04/2020”,但是当我在 Vlookup 中使用它时,该公式不会返回任何结果。 为了让 Vlookup 工作,我必须将 go 转到我刚刚更改的单元格,然后在第一个数字前面按删除,即使那里没有空格; 为了让 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 

尝试,

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

错误图片

在此处输入图像描述

正确的图像

在此处输入图像描述

这是您的代码解决方案。

我强烈建议阅读并进一步了解如何避免 Excel VBA 中的 Select以改进您的代码并降低运行时错误的风险。

如果您将此代码添加到现有过程的底部(如您的问题所示),它将遍历每个单元格并将其重新格式化为正确的日期值。

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. 完全,并且您的目标范围/单元格将不那么模糊。


我将其重新格式化如下:

注意:我在新工作簿的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时错误的风险。

感谢专栏的文字建议这是我为它所做的工作:

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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM