Excel VBA If Then Else在计数中的第一个工作表上丢失日期格式

Excel VBA If Then Else在计数中的第一个工作表上丢失日期格式,vba,excel,date,Vba,Excel,Date,我已经编写了一些Excel VBA来为41张工作表添加工作日日期,在“A”列下。日期构建为90天,然后在下面的单元格中有一个“超越mm/dd/yy”文本值。该代码在每个工作日运行(节假日除外),并在以前作为文本单元格的单元格上生成日期。这个过程运行得很好,除了41个工作表中的第一个工作表,其中添加的日期显示为文本,即使它们的“格式”将表示它们是日期。另外40个显示为日期。我已尝试将计算的日期包装为CDate()和DateValue(),两者都是。我来这里的目的是复制上面的单元格,但随后我将得到非

我已经编写了一些Excel VBA来为41张工作表添加工作日日期,在“A”列下。日期构建为90天,然后在下面的单元格中有一个“超越mm/dd/yy”文本值。该代码在每个工作日运行(节假日除外),并在以前作为文本单元格的单元格上生成日期。这个过程运行得很好,除了41个工作表中的第一个工作表,其中添加的日期显示为文本,即使它们的“格式”将表示它们是日期。另外40个显示为日期。我已尝试将计算的日期包装为CDate()和DateValue(),两者都是。我来这里的目的是复制上面的单元格,但随后我将得到非工作日,因为Excel将构建下一个自动填充。我甚至试图重新查看带有问题的一张工作表,并再次滚动查看IF-Then-Else,但是,为“Beyond”文本行定义了一个值,然后重新指定了日期——这产生了相同的结果;因此,我得出结论,这个问题可能与我如何编写IF-Then-Else部分有关

谢谢你的建议~

Dim count As Integer
Sheets("ABCD").Activate


For count = 1 To 41


'***************************************************************************    ********************
'Inserts Dates for weekdays, until 90 days out, then a "Beyond       MM/DD/YY"     value for the last date
'***********************************************************************************************

Dim ThisSheet As String

'turn off auto formula calculation
Application.Calculation = xlManual

Range("A1").Activate

'find the current "Beyond" date cell
Columns("A:A").Select
Selection.Find(What:="Beyond", After:=ActiveCell, LookIn:=xlFormulas, _
        LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
        MatchCase:=False, SearchFormat:=False).Activate

Range("A" & ActiveCell.Row).Select

'Add business days to column(A:A) until the next business day would be 91 days or greater
Do Until ((Weekday(Range("A" & ActiveCell.Row - 1)) = 6) And _
(DateAdd("w", 3, Range("A" & ActiveCell.Row - 1))) >= (DateAdd("d", 91, Date))) Or _
((Weekday(Range("A" & ActiveCell.Row - 1)) <> 6) And _
(DateAdd("d", 1, Range("A" & ActiveCell.Row - 1))) >= (DateAdd("d", 91, Date)))

    If Weekday(Range("A" & ActiveCell.Row - 1)) = 6 Then
        ActiveCell.NumberFormat = "m/d/yyyy"
        ActiveCell.Value = DateValue(DateAdd("w", 3, Range("A" & (ActiveCell.Row - 1))))
        Selection.NumberFormat = "m/d/yyyy"

    ElseIf Weekday(Range("A" & ActiveCell.Row - 1)) = 7 Then
            ActiveCell.NumberFormat = "m/d/yyyy"
            ActiveCell.Value = DateValue(DateAdd("w", 2, Range("A" & (ActiveCell.Row - 1))))
            ActiveCell.Select
            Selection.NumberFormat = "m/d/yyyy"

    Else: ActiveCell.NumberFormat = "m/d/yyyy"
            ActiveCell.Value = DateValue(DateAdd("w", 1, Range("A" & (ActiveCell.Row - 1))))
            ActiveCell.Select
            Selection.NumberFormat = "m/d/yyyy"

    End If

    Selection.Offset(1, 0).Activate

Loop


'Add in the "Beyond" date, to column(A:A)
ActiveCell.Value = "Beyond " & Format((DateAdd("d", 90, Date)), "mm/dd/yy")

Range("A1").Select
'*****************************************************************************************


'****************************************************************
'Copies down formulas to the last date or "Beyond MM/DD/YYYY" row
'****************************************************************

'Set LastRow Value for end of desired formula range
LTCashSheet_LastRow = Range("A" & Rows.count).End(xlUp).Row

'Set LastRow Value for beginning formulas to copy down
LTCashSheet_BegCopyRange = Range("B" & Rows.count).End(xlUp).Row

    Range("B" & LTCashSheet_BegCopyRange & ":N" & LTCashSheet_BegCopyRange).Select
    Selection.AutoFill Destination:=Range("B" & LTCashSheet_BegCopyRange & ":N" & LTCashSheet_LastRow), Type:=xlFillDefault
    Range("B" & LTCashSheet_BegCopyRange & ":N" & LTCashSheet_LastRow).Select

Columns("A:A").AutoFit
'****************************************************************


'****************************************************************
'Hide Rows 11 through rows prior to today's date row*************
'****************************************************************
Set TheRng = Range("A1", Range("A" & Rows.count).End(xlUp))
CurrDtRow = TheRng.Find(What:=Date, LookAt:=xlWhole).Row
    Rows("11:" & (CurrDtRow - 2)).Select
    Selection.EntireRow.Hidden = True

Range("A1").Select
'****************************************************************


'Go to next sheet and repeat, through 'count'********************
ActiveSheet.Next.Select

Next count
Dim计数为整数
工作表(“ABCD”)。激活
对于计数=1到41
'***************************************************************************    ********************
'插入工作日的日期,直到90天之后,然后为最后一个日期插入一个“超出MM/DD/YY”值
'***********************************************************************************************
把这张纸调暗成线
'关闭自动公式计算
Application.Calculation=xlManual
范围(“A1”)。激活
'查找当前“超出”日期单元格
列(“A:A”)。选择
Selection.Find(What:=“Beyond”,After:=ActiveCell,LookIn:=xlFormulas_
查看:=xlPart,搜索顺序:=xlByRows,搜索方向:=xlNext_
匹配案例:=False,搜索格式:=False)。激活
范围(“A”&ActiveCell.Row)。选择
'将工作日添加到(A:A)列中,直到下一个工作日为91天或更长
直到((工作日(范围(“A”&ActiveCell.Row-1))=6)和_
(DateAdd(“w”,3,Range(“A”&ActiveCell.Row-1))>=(DateAdd(“d”,91,Date)))或_
((工作日(范围(“A”&ActiveCell.Row-1))6)和_
(DateAdd(“d”,1,Range(“A”&ActiveCell.Row-1))>=(DateAdd(“d”,91,Date)))
如果工作日(范围(“A”&ActiveCell.Row-1))=6,则
ActiveCell.NumberFormat=“m/d/yyyy”
ActiveCell.Value=DateValue(DateAdd(“w”,3,Range(“A”)和(ActiveCell.Row-1)))
Selection.NumberFormat=“m/d/yyyy”
ElseIf Weekday(范围(“A”&ActiveCell.Row-1))=7,然后
ActiveCell.NumberFormat=“m/d/yyyy”
Value=DateValue(DateAdd(“w”,2,Range(“A”)和(ActiveCell.Row-1)))
ActiveCell。选择
Selection.NumberFormat=“m/d/yyyy”
其他:ActiveCell.NumberFormat=“m/d/yyyy”
ActiveCell.Value=DateValue(DateAdd(“w”,1,Range(“A”)和(ActiveCell.Row-1)))
ActiveCell。选择
Selection.NumberFormat=“m/d/yyyy”
如果结束
选择。偏移(1,0)。激活
环
'将“超出”日期添加到(A:A)列中
ActiveCell.Value=“Beyond”&格式((DateAdd(“d”,90,Date)),“mm/dd/yy”)
范围(“A1”)。选择
'*****************************************************************************************
'****************************************************************
'将公式向下复制到最后一个日期或“超过MM/DD/YYYY”行
'****************************************************************
'为所需公式范围的结尾设置LastRow值
LTCASHEET_LastRow=范围(“A”和Rows.count).End(xlUp).Row
'设置要向下复制的开始公式的LastRow值
LTCASHEET_BegCopyRange=范围(“B”和Rows.count).End(xlUp).Row
范围(“B”和LTCASHEET\u BegCopyRange&“:N”和LTCASHEET\u BegCopyRange)。选择
Selection.AutoFill目标:=范围(“B”和LTCASHEET\u BegCopyRange&“:N”和LTCASHEET\u LastRow),类型:=xlFillDefault
范围(“B”和LTCASHEET\u BegCopyRange&“:N”和LTCASHEET\u LastRow)。选择
列(“A:A”)。自动拟合
'****************************************************************
'****************************************************************
'隐藏今天日期行之前的第11行到第11行*************
'****************************************************************
设置范围(“A1”,范围(“A”和行数)。结束(xlUp))
CurrDtRow=TheRng.Find(What:=Date,LookAt:=xlother).Row
行(“11:&(CurrDtRow-2))。选择
Selection.EntireRow.Hidden=True
范围(“A1”)。选择
'****************************************************************
'转到下一张纸并重复,直到'计数'********************
ActiveSheet.Next.Select
下一次计数

我从中找到了有用的信息。我没有在IF-THEN-ELSE中整合解决方案以防止上述情况发生;但是,我能够使用函数添加一些清理,并将代码应用到“Beyond”值正上方的单元格,这些单元格是字符串和日期的奇怪混合体。我很乐意去,但是,如果你认为我应该走另一条路,请随意评论

谢谢大家!

Function CellContentCanBeInterpretedAsADate(cell As Range) As Boolean
    Dim d As Date
    On Error Resume Next
    d = CDate(cell.Value)
    If Err.Number <> 0 Then
        CellContentCanBeInterpretedAsADate = False
    Else
        CellContentCanBeInterpretedAsADate = True
    End If
    On Error GoTo 0
End Function

Sub FixDtFrmtWithFnctn()

Dim cell As Range
Dim cvalue As Double

Sheets("NCE1").Select

Set TheRng4 = Range("A1", Range("A" & Rows.count).End(xlUp))
DtFrmtFixRow = TheRng4.Find(What:=("Beyond"), LookAt:=xlPart).Row

Set cell = Range("A" & (DtFrmtFixRow - 1))

If CellContentCanBeInterpretedAsADate(cell) Then
    cvalue = CDate(cell.Value)
    cell.Value = cvalue
    cell.NumberFormat = "m/d/yyyy"
Else
    cell.NumberFormat = "General"
End If

Set cell = Range("A" & (DtFrmtFixRow - 2))

If CellContentCanBeInterpretedAsADate(cell) Then
    cvalue = CDate(cell.Value)
    cell.Value = cvalue
    cell.NumberFormat = "m/d/yyyy"
Else
    cell.NumberFormat = "General"
End If

Set cell = Range("A" & (DtFrmtFixRow - 3))

If CellContentCanBeInterpretedAsADate(cell) Then
    cvalue = CDate(cell.Value)
    cell.Value = cvalue
    cell.NumberFormat = "m/d/yyyy"
Else
    cell.NumberFormat = "General"
End If

End Sub
函数CellContentCanBeInterpretedAsADate(单元格作为范围)作为布尔值
日期
出错时继续下一步
d=CDate(单元格值)
如果错误号为0,则
CellContentCanBeInterpretedAsade=假
其他的
CellContentCanbeInterpretedAsade=真
如果结束
错误转到0
端函数
子固定DTFRMTWITHFNCTN()
暗淡单元格作为范围
将C值设置为双精度
表格(“NCE1”)。选择
设置Rng4=范围(“A1”,范围(“A”和行数)。结束(xlUp))
DtFrmtFixRow=TheRng4.Find(What:=(“Beyond”),LookAt:=xlPart.Row
设置单元格=范围(“A”和(DtFrmtFixRow-1))
如果CellContents可以解释为Sadate(cell),则
cvalue=CDate(单元格值)
单元格值=C值
cell.NumberFormat=“m/d/yyyy”
其他的
cell.NumberFormat=“常规”
如果结束
设置单元格=范围(“A”和(DtFrmtFixRow-2))
如果CellContentCanBeInterp