首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Excel宏螺丝操纵日期

用Excel宏螺丝操纵日期
EN

Stack Overflow用户
提问于 2020-07-03 11:22:41
回答 3查看 116关注 0票数 0

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

代码语言:javascript
复制
10-Ott-2019
11-Ott-2019
11-Ott-2019
11-Ott-2019
12-Ott-2019
14-Ott-2019

我需要使用宏将所有月份更改为它们的编号:"Ott“(10月)到它的编号(10)

代码语言:javascript
复制
Columns("AC:AC").Select
    Selection.Replace What:="Ott", Replacement:="10", LookAt:=xlPart, _
    SearchOrder:=xlByRows, MatchCase:=False, FormulaVersion:= _
        xlReplaceFormula2

我希望能收到这个

代码语言:javascript
复制
10-10-2019
11-10-2019
11-10-2019
11-10-2019
12-10-2019
14-10-2019

...    

但是不幸的是,excel用某种单元格自动格式来螺丝数据,并返回以下内容

代码语言:javascript
复制
 10-10-2019
 10-11-2019
 10-11-2019
 10-11-2019
 10-12-2019
 14-10-2019

基本上,如果一天较小或等于12 excel,就把它当作一个月号,不管发生什么,它也会忽略系统的地区设置与日期是意大利语。

另外,我不需要将它格式化为日期,它可能是一个字符串,我会很好,但我不希望excel更改日期。

有什么想法吗?

我也尝试过这个宏:

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

但结果是一样的。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-07-03 15:36:45

试试看

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

代码语言:javascript
复制
 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

示例一个月

代码语言:javascript
复制
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

结果图像

错误码

代码语言:javascript
复制
Sub test2()
    Dim myDay() As String
    Dim vDB
    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
       vDB(i, 1) = Replace(vDB(i, 1), "Ott", 10)
    Next i
    Range("ac1").Resize(UBound(vDB, 1), UBound(vDB, 2)) = vDB
    Range("ac:ac").NumberFormatLocal = "dd-mm-yyyy"
End Sub

误差图像

票数 1
EN

Stack Overflow用户

发布于 2020-07-03 13:21:54

如果您的日期是真正的日期而不是字符串,则此操作可能有效。

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2020-07-03 11:43:03

最后一个宏会产生错误。

您可以尝试宏如下所示:

代码语言:javascript
复制
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次。由于这只是两个变量的变化,我建议做后一个,因为它很可能会更快。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62714383

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档