gpt4 book ai didi

excel - 将文本转换为日期适用于一个系统,但不适用于其他系统

转载 作者:行者123 更新时间:2023-12-04 20:48:47 26 4
gpt4 key购买 nike

我创建了一个宏 Excel 文件来对一些数据进行排序并做一些 Vlookup具有相同数据的功能。
该宏在我的系统中运行良好。我与同事共享的同一宏也使用相同的数据集,但最终结果不正确,或与我的结果不匹配。
请问我们如何解决这个问题?
数据集相当大。那里有将近 200k 行。
他们没有收到任何错误。宏正在运行完整的代码,系统也没有任何错误,但最终报告不匹配或不正确。
不匹配仅出现在日期区域。有日期列mm/dd/yyyy格式化为文本。
我曾经将此文本格式的日期转换为日期,然后我必须从列中删除所有 future 的日期。
仅此功能对其他人无法正常工作。其余部分都清楚了。但这在我的系统中运行良好。
下面是我用来将文本日期转换为数字日期并删除 future 日期然后将可用日期更改为旧格式的代码

    Private Sub TermDateRemove()

Dim CellValue, OldFrmtDate As String
Dim y, Tday As Date
Dim EmpTerDate As Range
Dim EmpTerDatePos As Integer
Sheets("Emp Data").Activate
LR = Worksheets("Emp Data").UsedRange.Rows.count
LC = Worksheets("Emp Data").UsedRange.Columns.count

If ActiveSheet.AutoFilterMode = True Then
ActiveSheet.AutoFilterMode = False
End If

Set EmpTerDate = Sheets("Emp Data").Range("1:1").Find("Employee Termination Date", , xlValues, xlWhole, , , False, , False)
EmpTerDatePos = EmpTerDate.Column

txt2clm (EmpTerDatePos) 'Calling text to column function

Tday = Format(Date, "dd/mm/yy")
With Worksheets("Emp Data")
.Range("1:1").AutoFilter Field:=EmpTerDatePos, Criteria1:=">" & Tday, Operator:=xlFilterValues
End With
If ActiveSheet.AutoFilter.Range.Columns(1).SpecialCells(xlCellTypeVisible).count > 1 Then
With Worksheets("Emp Data")
.Range(.Cells(2, EmpTerDatePos), .Cells(LR, EmpTerDatePos)).SpecialCells(xlCellTypeVisible).Cells.Value = ""
End With
End If
If ActiveSheet.AutoFilterMode = True Then
ActiveSheet.AutoFilterMode = False
End If

Columns(EmpTerDatePos).NumberFormat = "@"

For Each cell In Sheets("EMP DATA").UsedRange.Columns(EmpTerDatePos).Cells
CellValue = cell.Value
If CellValue = "Employee Termination Date" Then
'do nothing
ElseIf CellValue <> "" And CellValue <> "Employee Termination Date" Then
CVtoDate = Format(CellValue, "mm/dd/yyyy")
OldFrmtDate = Replace(CVtoDate, "-", "/")
cell.Value = OldFrmtDate
End If
Next

Workbooks("Employee Data").Save
End Sub
- - -功能 - - -
    Function txt2clm(cc As Long) As Long

'Text to column for changing the date into numeric format
Columns(cc).Select
Selection.TextToColumns Destination:=Range(ActiveSheet.Cells(1, cc), ActiveSheet.Cells(1, cc)), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
Semicolon:=False, Comma:=False, Space:=False, Other:=False, FieldInfo _
:=Array(1, 3), TrailingMinusNumbers:=True
End Function

最佳答案

转换 String (看起来像约会)dd/mm/yy通过 / 将其拆分为多个部分,将其转换为实数/数字日期并使用 DateSerial .

Dim Cell As Range
For Each cell In Sheets("Emp Data").UsedRange.Columns(EmpTerDatePos).Cells
Dim CellValue As String
CellValue = cell.Value

If CellValue <> vbNullString And CellValue <> "Employee Termination Date" Then
Dim SplitDate As String
SplitDate = Split(CellValue, "/")

Dim DayFromDate As Integer
DayFromDate = CInt(SplitDate(1))

Dim MonthFromDate As Integer
MonthFromDate = CInt(SplitDate(0))

Dim YearFromDate As Integer
YearFromDate = CInt(SplitDate(2))

Dim NumDate As Date
NumDate = DateSerial(YearFromDate, MonthFromDate, DayFromDate)
cell.Value = NumDate
End If
Next
还要确保你不使用 String作为过滤条件,这可能会再次在其他计算机上失败。切勿使用 Strings日期。
连你 Dim Tday As Date Format函数返回 String然后隐式转换为数字 Date变量 Tday = Format(Date, "dd/mm/yy") .这意味着 Excel 必须猜测 String来自 Format函数是 dd/mm/yymm/dd/yy .即使您指定了,VBA 也不够聪明,无法使用该信息来解释该字符串。
所以你要做的是:
Dim Tday As Date
Tday = Date

With Worksheets("Emp Data")
.Range("1:1").AutoFilter Field:=EmpTerDatePos, Criteria1:=">" & CDbl(Tday), Operator:=xlFilterValues
End With
这里我们转换日期 Tday变成 Double使用 CDbl(Tday) .所有数字日期/时间都由 Double 类型的数字表示.因此我们使用 Double作为标准。这与您的代码一样可靠得多,并且适用于任何县本地化。
最后但同样重要的是尽量避免 ActiveSheet以及像 Worksheets("Emp Data") 这样的显式引用因此,当您的工作表未激活时,代码甚至可以工作。

关于excel - 将文本转换为日期适用于一个系统,但不适用于其他系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70951411/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com