2017-01-05 2 views
-2

Я получаю ошибку с моей VBA и не понимаю, почему:VBA If/Then с ActiveCell вопрос

Я пытаюсь сделать MsgBox появляется, когда ActiveCell в активной книге не удовлетворяет критерии.

вот моя короткая строка кода:

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. 

Кто-нибудь есть идея о том, почему это произошло?

EDIT:

В настоящее время мы имеем макрос в наших книгах, которые автоматически записывает время NOW(), когда аналитик нажимает на пустую ячейку. Они могут вернуться и изменить эту дату (потому что иногда им это нужно), но иногда они забывают добавить в формате MM/DD/YYYY и просто иметь hh: mm: ss, что не помогает, когда мы пытаемся используйте эти ячейки для вычитания из разных дат. Я хочу, чтобы аналитику требуется, чтобы убедиться, что клетка, они просто изменили в формате «мм/дд/гггг чч: мм: сс»

SAMPLE: Вот некоторые примеры кода я до сих пор:

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 

С кем я работаю с предоставленным. Что он вводит в СЕЙЧАС() в активную ячейку, когда аналитик нажимает ее, если ячейка пуста.

Так,

G      H     I 
1/5/2017 

становится,

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

Теперь аналитик может снова нажмите I, а ячейка будет возвращать NOW().

Вопрос:

Иногда аналитик изменить эти времена, особенно когда функция NOW() не требуется. То, что они не делают это, включают «1/5/2017» впереди, так что теперь у меня есть

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

Я хочу, чтобы окно сообщения появляются, когда какой-либо из ячеек в моем диапазоне, что они изменили вручную Безразлично 't include' mm/dd/yyyy ', потому что excel не нравится I1 - H1

+2

Вашего логическое выражение невероятно трудно разобрать, * если * это действительно вообще. И если он действителен, он, вероятно, не оценивает то, что, по вашему мнению, должно. Ниже приведено предположение о том, что именно вы пытаетесь оценить. –

+0

Кол-во подробностей – DukeLuke

+1

Почему формат ячейки влияет на вычитание? Формат просто говорит, как он должен отображаться **, а не то, что является базовым номером в ячейке. Это похоже на то, что они только что ввели время, а не дату и время. – YowE3K

ответ

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 дату + время и не 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 года будет помечен. так и любая запись с указанием даты и времени.

+0

Это решит проблему с ошибкой, но она не работает должным образом. Фактический формат ячеек: hh: mm: ss, но базовое число - mm/dd/yyyy hh: mm: ss. Это может вызвать проблему, потому что формат «пользовательский» не является датой, а MsgBox появляется на любой ячейке, даже если они находятся в формате mm/dd/yyyy hh: mm: ss формат – DukeLuke

+0

«обычай» не дата, wht ты имеешь в виду? Для дат (и времени или обоих) базовыми значениями всегда являются числа, ничего больше, просто цифры. – cyboashu

1

Сломать линию вниз на компоненты

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

Первое, что Excel делает это искать ActiveCell свойство ActiveWorkbook объекта. Это свойство не существует, поэтому вы получаете свою ошибку.

Но давайте представим, что он делает (и что вы только что использовали ActiveCell), то второе, что происходит в том, что он сравнивает ActiveCell «s по умолчанию Value свойство с ActiveCell» s NumberFormat собственности. Эти два значения вряд ли будут одинаковыми, поэтому тест для <> будет True.

Далее, сравнение True выполнено со строкой «мм/дд/гггг чч: мм: сс». Даже если вы не получите ошибку «несоответствие типа», это вернет False.


на основе ваших комментариев на вопрос, что вы хотите:

If ActiveCell.Value2 < 1 Then MsgBox "Please Enter a Date" 

Как ячейка отформатирована не должна влиять на ли дата является действительным или нет, это влияет только на клетки значение показано.


функциональность для проверки достоверности введенных значений необходимо перейти в Change события, а не SelectionChange события, поэтому я рекомендовал бы изменить свой код:

Option Explicit 
Private Const AutoTime As Boolean = True 'set to False to stop auto date/time insertion on mouse click 

Private Sub Worksheet_Change(ByVal Target As Range) 
    If Not AutoTime Then 
     Exit Sub 
    End If 
    Application.EnableEvents = False 
    Dim c As Range 
    For Each c In Target 
     If c.Value <> "" And c.Column > 6 And c.Column < 17 And c.Row > 3 Then 
      If Not IsNumeric(c.Value2) Then 
       MsgBox "Cell " & c.Address & " - Please enter a valid date/time" 
      ElseIf c.Value2 < 1 Then 
       MsgBox "Cell " & c.Address & " - Please enter the date as well as the time" 
      End If 
     End If 
    Next 
    Application.EnableEvents = True 
End Sub 

Private Sub Worksheet_SelectionChange(ByVal Target As Range) 
' 
' TimeStamp Macro 
' 
    If Not AutoTime Then 
     Exit Sub 
    End If 
    Application.EnableEvents = False 
    Dim c As Range 
    For Each c In Target 
     If c.Value = "" And c.Column > 6 And c.Column < 17 And c.Row > 3 Then 
      c.Value = Now() 
      c.NumberFormat = "hh:mm:ss" 
     End If 
    Next 
    Application.EnableEvents = True 
End Sub 
+0

Это, похоже, не то, что я ожидаю. Приносим извинения за путаницу ... Я включу образец – DukeLuke

+0

. На основании ваших данных примера столбец I содержит '0.447916666666667', поэтому' ActiveCell.Value2' будет меньше 1, поэтому должен отображаться 'MsgBox'. – YowE3K

+0

Я возвращаю этот ответ, нет ничего плохого в этом. – KyloRen

Смежные вопросы