VBA If / Then与ActiveCell问题

时间:2017-01-05 21:44:38

标签: excel vba excel-vba excel-2013

我的VBA收到错误,并且不明白原因:

我尝试在活动工作簿中的activecell不符合条件时显示MsgBox。

这是我的一小段代码:

If ActiveWorkbook.ActiveCell <> ActiveCell.NumberFormat = "mm/dd/yyyy hh:mm:ss" Then MsgBox "Please Enter a Date"

我收到的错误是:

Run-time error '438':
Object doesn't support this property or method.

有没有人知道为什么会这样?

修改

目前,我们的工作簿中有一个宏,可以在分析师点击空单元格时自动记录NOW()的时间。他们可以返回并更改这个日期(因为有时他们需要),但有时他们忘记添加MM / DD / YYYY格式,只有hh:mm:ss,这对我们来说并没有帮助# 39;重新尝试使用这些单元格从不同的日期中减去。我希望分析师需要确保他们刚更改的单元格格式为&#39; mm / dd / yyyy hh:mm:ss&#39;

示例: 这是我到目前为止的一些示例代码:

    Option Explicit

Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
'
' TimeStamp Macro
'
Dim AutoTime
    AutoTime = True  'set to False to stop auto date/time insertion on mouse click

    If (AutoTime And ActiveCell = "" And ActiveCell.Column > 6 And ActiveCell.Column < 17 And ActiveCell.Row > 3) Then
         ActiveCell.FormulaR1C1 = "=NOW()"
         Selection.Copy
         Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
         Selection.NumberFormat = "hh:mm:ss"
    End Sub

我与之合作的人提供了哪些。当分析师点击它时,如果单元格为空,它会在NOW()中进入活动单元格。

所以,

G                       H                    I
1/5/2017  

变为

G                       H                    I
1/5/2017      1/5/2017 09:30:00 A.M. 

现在分析师可以再次单击I,单元格将返回NOW()。

问题:

有时分析师会改变这些时间,尤其是在不需要NOW()功能的情况下。他们不做的是包括&#39; 2017年1月5日&#39;在前面,所以现在我有

G                       H                         I
1/5/2017      1/5/2017 09:30:00 A.M.        10:45:00 A.M.

我希望当我手动更改的范围内的任何单元格不包含&#39; mm / dd / yyyy时,会出现一个消息框。因为excel不喜欢I1 - H1

2 个答案:

答案 0 :(得分:4)

因为ActiveWorkbook中没有ActiveCell属性。

ActiveCell是应用程序属性,它将始终在ActiveWorkbook上。

  If Not IsDate(ActiveCell) Or ActiveCell.NumberFormat <> "mm/dd/yyyy hh:mm:ss" Then
        MsgBox "Enter date!"
    End If

检查ActiveCell是否包含Valide Date + Time而不是1900作为日期:

Sub TEST()

    If Not IsEmpty(ActiveCell) Then
        If Not Application.Evaluate("=AND(YEAR(" & ActiveCell.Value2 & ") >=2016,MOD(" & ActiveCell.Value2 & ",2))") Then
            MsgBox "Not a valid date time!!"
        End If
    End If

End Sub

2016年之前的任何日期都将被标记。任何只有日期和没有时间的条目也是如此。

答案 1 :(得分:1)

将您的界限分解为其组件

If ActiveWorkbook.ActiveCell <> ActiveCell.NumberFormat = "mm/dd/yyyy hh:mm:ss" Then MsgBox "Please Enter a Date"

Excel首先要做的是查找ActiveCell对象的ActiveWorkbook属性。该属性不存在,因此您会收到错误。

但是让我们假装它(并且您刚刚使用了ActiveCell),然后发生的第二件事是它将ActiveCell的默认Value属性与{{1 }} ActiveCell属性。这两个值不太可能相同,因此对NumberFormat的测试将为<>

接下来,使用字符串“mm / dd / yyyy hh:mm:ss”对True进行比较。即使您没有收到“类型不匹配”错误,也会返回True

根据您对问题的评论,您想要的是:

False

如何格式化单元格不应影响日期是否有效,它只会影响单元格的值显示

测试输入值有效性的功能需要进入If ActiveCell.Value2 < 1 Then MsgBox "Please Enter a Date" 事件而不是Change事件,因此我建议您将代码更改为:

SelectionChange