我有一个大型xls文件导出,其中包含一个日期列,如下所示:
10-Ott-2019
11-Ott-2019
11-Ott-2019
11-Ott-2019
12-Ott-2019
14-Ott-2019我需要使用宏将所有月份更改为它们的编号:"Ott“(10月)到它的编号(10)
Columns("AC:AC").Select
Selection.Replace What:="Ott", Replacement:="10", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, FormulaVersion:= _
xlReplaceFormula2我希望能收到这个
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,就把它当作一个月号,不管发生什么,它也会忽略系统的地区设置与日期是意大利语。
另外,我不需要将它格式化为日期,它可能是一个字符串,我会很好,但我不希望excel更改日期。
有什么想法吗?
我也尝试过这个宏:
Columns("AC:AC").Select
Selection.NumberFormat = "dd-mm-yyyy"
Selection.Replace What:="Ott", Replacement:="10", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, FormulaVersion:= _
xlReplaceFormula2但结果是一样的。
发布于 2020-07-03 15:36:45
试试看
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结果图像

错误码
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误差图像

发布于 2020-07-03 13:21:54
如果您的日期是真正的日期而不是字符串,则此操作可能有效。
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发布于 2020-07-03 11:43:03
最后一个宏会产生错误。
您可以尝试宏如下所示:
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次。由于这只是两个变量的变化,我建议做后一个,因为它很可能会更快。
https://stackoverflow.com/questions/62714383
复制相似问题