我的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
答案 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