Страницы: 1
RSS
Какое значение ячейки если удалить содержимое кнопкой Delete ?
 
Здравствуйте.
Удаляю содержимое ячейки кнопкой Delete.
После этого  вот эта строка:
Код
MsgBox "Target.Cells.Value = " & CStr(Target.Value)

Выдаёт ошибку : Type mismatch
Пробовал и так :
Код
MsgBox "Target.Cells.Value = " & CStr(Target.Cells.Value)

Важно отметить , Target - это несколько объединённых ячеек.
 
Проверил.
Не работает именно из-за того что несколько ячеек объединено.
Данный пример что должно быть.
Если поле В1 содержит текст, значение А1 = No, если В1 пусто А1=Yes.
A1 выпадающий список, можно изменить значение если надо.
При удалении содержимое ячейки В1 кнопкой Delete, значение А1 не меняется.
 
Цитата
ttp8 написал:
Удаляю содержимое ячейки кнопкой Delete.
после этого значение ячейки Empty
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ігор Гончаренко
Код
If Target.Cells.Value = Empty Then

Ругается
Изменено: ttp8 - 12.05.2018 19:17:49
 
1. на Empty Вы можете проверить 1 ячейку, а не диапазон сразу
2. MsgBox IsEmpty(Traget.cells(1))

и вообще - пишите конструкции в соответствии с синтаксисом языка и компилятор не будет ругаться.
Изменено: Ігор Гончаренко - 12.05.2018 13:15:25
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
ttp8 написал:
При удалении содержимое ячейки В1 кнопкой Delete, значение А1 не меняется.
в этом виновато Target.Count > 1. при внесении данных Target.Count =1, а при удалении Target.Count =(количеству объединенных ячеек) 3.
 
ttp8, Если Вас тянет работать с объединенными ячейками, и при этом есть возможность обойтись без них, то лучше с ними не связываться.
Вот Ваш пример иллюстрирует одну из причин:
Код
If Target.Cells.Count > 1 Then Exit Sub

При внесении текста в "B1" Target.Cells.Count = 1, а при Delete Target.Cells.Count = 3
Кроме того, если Вы в Worksheet_Change пишете код, который изменяет еще и другие ячейки, то желательно перед изменением "A1", например, написать такую строку:
Код
Application.EnableEvents = False 'отключает события во избежание не нужных срабатываний

По окончании изменений:
Код
Application.EnableEvents = True 'а то потом на событие не реагирует

Код
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim lReply As Long
    Application.EnableEvents = False
    Select Case Target.Address
        Case "$B$1": If Len(Target.Cells.Value) > 0 Then Worksheets("Main").Cells(1, 1).Value = "No"
        Case "$B$2": If Len(Target.Cells.Value) > 0 Then Worksheets("Main").Cells(2, 1).Value = "No"
        Case "$B$1:$D$1": If Len(Target.Cells(1).Value) = 0 Then Worksheets("Main").Cells(1, 1).Value = "Yes"
        Case "$B$2:$D$2": If Len(Target.Cells(1).Value) = 0 Then Worksheets("Main").Cells(2, 1).Value = "Yes"
    End Select
    Application.EnableEvents = True
End Sub
 
V,
Заметил, изменил, не помогает
 
Код
Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target(1), Columns("B")) Is Nothing Then
        If IsEmpty(Target(1)) Then
            Target(1).Previous = "No"
        Else
            If Not IsNumeric(Target(1)) Then
                Target(1).Previous = "Yes"
            Else
                Target(1).Previous = "No"
            End If
        End If
    End If
End Sub
 
AAF,
Спасибо помогло
У меня нет выбора. Приходится работать с объединенными ячейками.
Сделал как вы написали. Помогло.
Почему при условии
Case "$B$1","$B$1:$D$1"    :If Len(Target.Cells.Value) > 0 Then Worksheets("Main").Cells(1, 1).Value = "No"

выражение Len(Target.Cells(1).Value) = 0 не подпадает под Else?

Где то так:
Код
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim lReply As Long
    Application.EnableEvents = False
    Select Case Target.Address
        Case "$B$1","$B$1:$D$1":
               If Len(Target.Cells.Value) > 0 Then 
                      Worksheets("Main").Cells(1, 1).Value = "No"
               Else
                      Worksheets("Main").Cells(1, 1).Value = "Yes"
               End if
        
    End Select
    Application.EnableEvents = True
End Sub
Изменено: ttp8 - 12.05.2018 13:51:36
 
ttp8, Вы видите, как код оформлен у других? Вот и Вы оформляйте аналогично: для этого есть даже специальная кнопка. Найдите её и исправьте своё сообщение.
 
Цитата
ttp8 написал:
выражение Len(Target.Cells(1).Value) = 0 не подпадает под Else
Заостряю внимание: Len(Target.Cells(1).Value)
 
AAF,
Ошибочка, не помогло.
Ругается на :
Код
If Len(Target.Cells.Value) = 0 Then 

Type mismatch
 
RAN,
Спасибо
А если несколько ячеек так проверить, скажем А1 и А2?
Можно код и пояснения.
 
ttp8, а Вы видите разницу между моим и Вашим кодом? :)
В Вашем случае Len(массив) и, как следствие не соответствие типов переменных (Type mismatch)....
 
Вообще-то, мой код проверяет весь столбец В.  :D

PS И проверяет именно на текст. Числа - не текст.
Изменено: RAN - 12.05.2018 14:11:23
 
Цитата
AAF написал:
Заостряю внимание: Len(Target.Cells(1).Value)
Не заметил. Спасибо
 
Цитата
RAN написал:
Вообще-то, мой код проверяет весь столбец В
Он проверяет на значение первой ячейки Target в столбце "B", а ТС, наверное, намекает на предмет проверки всех строк на предмет изменений.
Но это только мое предположение...  :)
Изменено: AAF - 12.05.2018 14:23:43
 
ttp8, можно так
Код
If Target.Text = "" Then
В случае если Target состоит из нескольких ячеек:
- если все они пустые, свойство Text - пустая строка и условие выполняется;
- если они не пустые и содержат одинаковый текст, свойство Text возвращает этот текст и условие не выполняется;
- если ячейки содержат разный текст, свойство Text возвращает значение Null, которое трактуется оператором If как False и условие не выполняется.
Страницы: 1
Наверх