Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.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宏语言环境格式处理日期_Excel_Vba_Date - Fatal编程技术网

使用Excel宏语言环境格式处理日期

使用Excel宏语言环境格式处理日期,excel,vba,date,Excel,Vba,Date,我有一个大型xls文件导出,其中包含一列日期,如下所示: 10-Ott-2019 11-Ott-2019 11-Ott-2019 11-Ott-2019 12-Ott-2019 14-Ott-2019 我需要使用宏将所有月份更改为其编号:即“Ott”(10月)更改为其编号(10) 我希望能收到这个 10-10-2019 11-10-2019 11-10-2019 11-10-2019 12-10-2019 14-10-2019 ... 但不幸的是,excel使用某种单元格自动格式来

我有一个大型xls文件导出,其中包含一列日期,如下所示:

10-Ott-2019
11-Ott-2019
11-Ott-2019
11-Ott-2019
12-Ott-2019
14-Ott-2019
我需要使用宏将所有月份更改为其编号:即“Ott”(10月)更改为其编号(10)

我希望能收到这个

10-10-2019
11-10-2019
11-10-2019
11-10-2019
12-10-2019
14-10-2019

...    
但不幸的是,excel使用某种单元格自动格式来处理数据,并将其返回

 10-10-2019
 10-11-2019
 10-11-2019
 10-11-2019
 10-12-2019
 14-10-2019
基本上,如果日期小于或等于12,则不管发生什么情况,都应将其视为月份号,同时忽略日期为意大利语的系统区域设置

作为补充说明,我不需要将其格式化为日期,它可以是字符串,我会很好,但我不希望excel更改日期

有什么想法吗

我也试过这个宏:

Columns("AC:AC").Select
    Selection.NumberFormat = "dd-mm-yyyy"
    Selection.Replace What:="Ott", Replacement:="10", LookAt:=xlPart, _
    SearchOrder:=xlByRows, MatchCase:=False, FormulaVersion:= _
        xlReplaceFormula2

但是结果是一样的…

您的上一个宏会产生错误

您可以尝试以下宏:

Sub FindAndReplaceAll()
  dim ws as worksheet
  dim fnd as variant
  dim rplc as variant

  
  fnd = "Ott"
  rplc = "10"

  for each ws in ThisWorkbook.Worksheets
    ws.Cells.Replace What:=fnd , Replacement:=rplc , _
    LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase := False, _
    SearchFormat:=False, ReplaceFormat:= False
  next ws
End sub

现在,当然你每个月都需要这样做。这可以通过循环列表来实现,也可以全部更改11次。因为只有两个变量需要更改,所以我建议您执行后一种操作,因为它很可能会更快。

您的上一个宏会产生错误

您可以尝试以下宏:

Sub FindAndReplaceAll()
  dim ws as worksheet
  dim fnd as variant
  dim rplc as variant

  
  fnd = "Ott"
  rplc = "10"

  for each ws in ThisWorkbook.Worksheets
    ws.Cells.Replace What:=fnd , Replacement:=rplc , _
    LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase := False, _
    SearchFormat:=False, ReplaceFormat:= False
  next ws
End sub

现在,当然你每个月都需要这样做。这可以通过循环列表来实现,也可以全部更改11次。因为只有两个变量需要更改,所以我建议您使用后一个变量,因为它可能会更快。

如果您的日期是真实日期而不是字符串,那么这可能会起作用

Sub ReFormat()
    With Application.FindFormat
        .Clear
        .NumberFormat = "dd-mmm-yyyy"
    End With
    With Application.ReplaceFormat
        .Clear
        .NumberFormat = "dd-mm-yyyy"
    End With
    Columns("AC:AC").Replace What:="", Replacement:="", LookAt:=xlWhole, SearchOrder:= _
        xlByRows, MatchCase:=False, SearchFormat:=True, ReplaceFormat:=True
End Sub

如果您的日期是真实的日期而不是字符串,那么这可能会起作用

Sub ReFormat()
    With Application.FindFormat
        .Clear
        .NumberFormat = "dd-mmm-yyyy"
    End With
    With Application.ReplaceFormat
        .Clear
        .NumberFormat = "dd-mm-yyyy"
    End With
    Columns("AC:AC").Replace What:="", Replacement:="", LookAt:=xlWhole, SearchOrder:= _
        xlByRows, MatchCase:=False, SearchFormat:=True, ReplaceFormat:=True
End Sub
试试看

Excel会根据每个数据的格式自动将数据格式应用于单元格。因此,只有正确输入数据值,才能获得正确的结果

 Sub testSeveralMonth()
    Dim myDay() As String
    Dim vDB, vSplit
    Dim i As Long, r As Long, j As Integer
    Dim a, b
    Dim s As String
    
    a = Array("Gen", "Feb", "Mar", "Apr", "Mag", "Giu", "Lug", "Ago", "Set", "Ott", "Nov", "Dic")
    b = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)
    
    vDB = Range("ac1", Range("ac" & Rows.Count).End(xlUp))
    
    r = UBound(vDB, 1)
    ReDim myDay(1 To r, 1 To 1)
    For i = 1 To r
        s = vDB(i, 1)
        For j = 0 To UBound(a)
            s = Replace(s, a(j), b(j))
        Next j
        If IsDate(s) Then
            vSplit = Split(s, "-")
            vDB(i, 1) = DateSerial(vSplit(2), vSplit(1), vSplit(0))
        End If
    Next i
   Range("ac:ac").NumberFormatLocal = "dd-mm-yyyy"
   Range("ac1").Resize(UBound(vDB, 1), UBound(vDB, 2)) = vDB
   
End Sub
例如一个月

Sub test()
    Dim myDay() As String
    Dim vDB, vSplit
    Dim i As Long, r As Long
    
    vDB = Range("ac1", Range("ac" & Rows.Count).End(xlUp))
    
    r = UBound(vDB, 1)
    ReDim myDay(1 To r, 1 To 1)
    For i = 1 To r
        myDay(i, 1) = Replace(vDB(i, 1), "Ott", 10)
        If IsDate(myDay(i, 1)) Then
            vSplit = Split(myDay(i, 1), "-")
            vDB(i, 1) = DateSerial(vSplit(2), vSplit(1), vSplit(0))
        End If
    Next i
   Range("ac1").Resize(UBound(vDB, 1), UBound(vDB, 2)) = vDB
   Range("ac:ac").NumberFormatLocal = "dd-mm-yyyy"
End Sub

结果图像 错误代码
错误图像 试试看

Excel会根据每个数据的格式自动将数据格式应用于单元格。因此,只有正确输入数据值,才能获得正确的结果

 Sub testSeveralMonth()
    Dim myDay() As String
    Dim vDB, vSplit
    Dim i As Long, r As Long, j As Integer
    Dim a, b
    Dim s As String
    
    a = Array("Gen", "Feb", "Mar", "Apr", "Mag", "Giu", "Lug", "Ago", "Set", "Ott", "Nov", "Dic")
    b = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)
    
    vDB = Range("ac1", Range("ac" & Rows.Count).End(xlUp))
    
    r = UBound(vDB, 1)
    ReDim myDay(1 To r, 1 To 1)
    For i = 1 To r
        s = vDB(i, 1)
        For j = 0 To UBound(a)
            s = Replace(s, a(j), b(j))
        Next j
        If IsDate(s) Then
            vSplit = Split(s, "-")
            vDB(i, 1) = DateSerial(vSplit(2), vSplit(1), vSplit(0))
        End If
    Next i
   Range("ac:ac").NumberFormatLocal = "dd-mm-yyyy"
   Range("ac1").Resize(UBound(vDB, 1), UBound(vDB, 2)) = vDB
   
End Sub
例如一个月

Sub test()
    Dim myDay() As String
    Dim vDB, vSplit
    Dim i As Long, r As Long
    
    vDB = Range("ac1", Range("ac" & Rows.Count).End(xlUp))
    
    r = UBound(vDB, 1)
    ReDim myDay(1 To r, 1 To 1)
    For i = 1 To r
        myDay(i, 1) = Replace(vDB(i, 1), "Ott", 10)
        If IsDate(myDay(i, 1)) Then
            vSplit = Split(myDay(i, 1), "-")
            vDB(i, 1) = DateSerial(vSplit(2), vSplit(1), vSplit(0))
        End If
    Next i
   Range("ac1").Resize(UBound(vDB, 1), UBound(vDB, 2)) = vDB
   Range("ac:ac").NumberFormatLocal = "dd-mm-yyyy"
End Sub

结果图像 错误代码
错误图像

您是否尝试过
ReplaceFormat:=True
?是的,它无法解决问题。您可以在此处下载我试图解决的xlsx,它除了显示问题的列AC(此文件中不包含宏)外,其余均为空:您尝试过
ReplaceFormat:=True
?是,它不能解决问题您可以在这里下载我试图修复的xlsx,它除了显示问题的列AC(此文件中不包含宏)之外都是空的:出现运行时错误“1004”。然而,上面发布的代码对我起到了作用。这一个有效,但并不能解决问题,因为我仍然收到错误的日期,一些天被切换到了月份,反之亦然,出现了运行时间错误“1004”。然而,上面发布的代码帮了我的忙。这一个有效,但并没有解决问题,因为我仍然收到一些日期被改为月份,反之亦然。我认为你集中了问题,不幸的是,你的代码在这一行给出了运行时错误9“下标超出范围(错误9)”:vDB(I,1)=DateSerial(vSplit(2),vSplit(1),vSplit(0))。还有,我如何在所有月份进行复制?@DavideC,如果你想在多个月内工作,你可以创建一个循环,在几个月内替换字母和数字。@DavideC,我编辑了几个月的答案。我认为造成错误的原因不仅是10月份的数据,而且是几个月后的数据,所以似乎是因为无法处理而发生了错误。非常感谢您的帮助,脚本现在可以工作了。数据是安全的,但是excel打印dd-01-yyyy,dd-02-yyyy等等这是我测试它的模板文件:我认为您集中了问题,不幸的是,您的代码在这一行上给出了运行时错误9“下标超出范围(错误9)”:vDB(I,1)=DateSerial(vSplit(2),vSplit(1),vSplit(0))。还有,我如何在所有月份进行复制?@DavideC,如果你想在多个月内工作,你可以创建一个循环,在几个月内替换字母和数字。@DavideC,我编辑了几个月的答案。我认为错误的原因不仅是10月份的数据,而且是几个月内的数据,因此似乎是因为无法处理而发生了错误。非常感谢您的帮助,脚本现在可以正常工作。数据是安全的,但excel打印dd-01-yyyy、dd-02-yyyy等。这是我测试它的模板文件: