какое правильное условие if для моего файла excel? - PullRequest
0 голосов
/ 14 января 2019

Я хочу, чтобы определенные ячейки функционировали двойным щелчком, и если эта ячейка находится в первом столбце, а строка больше 12.

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

    If Target.Columns = 1 And Target.Row >= 12 Then
        dateVariable = CalendarForm.GetDate
        Target = dateVariable
    End If

End Sub

но кажется, что условие, которое я упомянул, не является правильным. Потому что код работает без этого условия правильно.

Ответы [ 3 ]

0 голосов
/ 14 января 2019

В дополнение к ответу BigBen ...

Range.Columns возвращает Range, представляющий столбцы в указанном диапазоне (здесь Target). Проверяя If Target.Columns = 1, вы выполняете неявный вызов члена по умолчанию для возвращенного объекта Range, то есть If Target.Columns.[_Defaut] = 1, что приводит к Target.Columns.Value, который является двумерным массивом вариантов, который нельзя сравнить с 1 буквальный.

Таким образом, вы получаете ошибку несоответствие типов ошибка, потому что VBA не может сравнивать двухмерный вариантный массив с целочисленным литералом и успешно оценивать результат.

Требуется Range.Column (единственное число), которое возвращает номер столбца для самой левой ячейки в указанном Range.

0 голосов
/ 14 января 2019

Поскольку я не могу комментировать ответ @ Матье (пока недостаточно репутации), вам также следует проверить, выбрана ли у вас только одна ячейка. Это может быть не очень полезно в случае события двойного щелчка, но будет время, когда вы будете повторно использовать этот код для другого намерения (возможно, для события Worksheet_SelectionChange), когда это событие может быть вызвано множественным выбором , В этом случае значение Column вернет самый левый столбец. Если он соответствует критериям .Column =1, тогда весь ваш выбор будет заполнен датой, которая может расстроить вас, если вы потеряете данные в своей таблице.

Итак, не забудьте просто добавить And Target.Count = 1 к вашему If утверждению.

PS: Хорошая практика - заставить IDE VBA требовать явного объявления переменной , я удивлен, что Матье не указал на это. Кроме того, использование переменной dateVariable необязательно. Просто используйте Target = CalendarForm.GetDate или даже лучше: Target.Value = CalendarForm.GetDate

0 голосов
/ 14 января 2019

Вы хотите Target.Column, а не .Columns.

Из документации:

  • Range.Column свойство:

    Возвращает число первого столбца в первой области в указанном диапазоне.

  • Range.Columns свойство:

    Возвращает объект Range , представляющий столбцы в указанном диапазоне.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...