Страницы: 1
RSS
Исключить удаление данных ячейки MsgBox
 
здравствуйте
макрос с MsgBox сделал но дает ошибку
исключаю через MsgBox  Selection.Cut -вырезание через контексное меню  ActiveCell.FormulaR1C1 = "" - очищение ячейки через меню Selection.Delete = True  удаление через меню  клавишу Application.OnKey "{BACKSPACE}" клавишу Application.OnKey "{DELETE}"  но красным светится строка   в чем ошибка ?
Код
  Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Selection.Cut = True Or ActiveCell.FormulaR1C1 = "" Or Selection.Delete = True Or Application.OnKey "{BACKSPACE}" Or Application.OnKey "{DELETE}" Then
Select Case MsgBox("Вы точно хотите удалить данные из ячейки ?", 33, "Удаление данных")
Case 1 ' Ок
ActiveCell.Value = ""
Case 2 ' Отмена
End Select
End If
End Sub
 
Где Вы такой синтаксис увидели? Напишите лучше ЧТО Вы хотите сделать, а не КАК Вы это пытаетесь реализовать
Согласие есть продукт при полном непротивлении сторон
 
что хочу при попытке удаления содержимого активной ячейки  (можно же 5 способами - вырезать через конт меню,стереть через конт меню, удалить через конт меню, клавишей BACKSPACE, клавишей DELETE) чтоб выскакивал MsgBox("Вы точно хотите удалить данные из ячейки)
Изменено: uptc - 21.02.2017 19:06:40
 
Изучайте: Работа с диалогами
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Без особых изысков и проверок
Код
Dim oldTarget
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
    If Target.Count = 1 Then
        If Target = Empty Then
            If MsgBox("Вы точно хотите удалить данные из ячейки ?", 33, "Удаление данных") <> vbOK Then Target = oldTarget
        End If
    End If
Application.EnableEvents = True
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    oldTarget = Target.Value
End Sub
Согласие есть продукт при полном непротивлении сторон
 
а что я неправильно сделал с MsgBox не понял   - честно говоря сделал с помощью MsgBox Generator из вашего кода не понял как сделать если нет (отмена) переход к следующему макросу ?
If MsgBox("Вы точно хотите удалить данные из ячейки ?", 33, "Удаление данных") <> vbОтмена Then   так чтоли
Изменено: uptc - 21.02.2017 19:44:11
 
а вроде понял
If MsgBox("Вы точно хотите удалить данные из ячейки ?", 33, "Удаление данных") = vbOK  так чтоли
 
Цитата
uptc написал:если нет (отмена) переход к следующему макросу ?
Код
.......            
If MsgBox("Вы точно хотите удалить данные из ячейки ?", 33, "Удаление данных") <> vbOK Then
   Target = oldTarget
    Call Следующий_макрос
End If
.......
Согласие есть продукт при полном непротивлении сторон
 
не получается для пробы так сделал независимо от кнопок ОК и ОТМЕНА  все равно ttttt и на вырезание не работает Selection.Cut запутался полностью
Код
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(ActiveCell, Range("D1:D50")) Is Nothing Then
If Target.Cells.Count > 1 Then Exit Sub
Application.EnableEvents = False
    If Target.Count = 1 Then
        If Target = Empty Then
            If MsgBox("Вы точно хотите удалить данные из ячейки ?", 33, "Удаление данных") <> vbOK Then Target = oldTarget
            Target = oldTarget
           ' Call Следующий_макрос
           ActiveCell.Value = "tttttt"    
End If
     End If
Application.EnableEvents = True
  End If
End Sub
 
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    oldTarget = Target.Value
End Sub

Изменено: uptc - 21.02.2017 20:17:50
 
блин, вот даже ссылку дал - там прям пример именно с Select Case и переменной, отвечающей за результат выбора в MsgBox. Неужели так трудно было под свои условия подстроить?
Код
retval = MsgBox("Вы точно хотите удалить данные из ячейки ?", 33, "Удаление данных")
select case retval
case vbOk
'одно действие
case vbCancel
'другое действие
end select
и пихаете сколько нужно условий. И все они на виду и упорядочены. Ну и из Ваших пояснений совершенно неясно когда и по какому условию Вы собрались запускать свой другой макрос. Поясните хотя бы. А то так помогать невозможно, не зная что надо.
Может так, кто его знает:
Код
If MsgBox("Вы точно хотите удалить данные из ячейки ?", 33, "Удаление данных") <> vbOK Then
Target = oldTarget
Else
           Call Следующий_макрос
           ActiveCell.Value = "tttttt"
End if
Изменено: The_Prist - 21.02.2017 20:22:11
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
не работает как надо с Private Sub Worksheet_SelectionChange и Private Sub Worksheet_Change

может проще както отменить клавиши  BACKSPACE,  DELETE и контексное меню Selection.Cut 'вырезать
ActiveCell.FormulaR1C1 = ""  'очистить содержимое  Selection.Delete 'удалить
Код
If Not Intersect(ActiveCell, Range("D1:D50")) Is Nothing Then
If Target.Cells.Count > 1 Then Exit Sub
Application.EnableEvents = False
retval = MsgBox("Вы точно хотите удалить данные из ячейки ?", 33, "Удаление данных")
Select Case retval
Case vbOK
ActiveCell.Value = "" 'одно действие
Case vbCancel
ActiveCell.Value = ActiveCell.Value 'другое действие
End Select
Application.EnableEvents = True
End If
End Sub
Изменено: uptc - 21.02.2017 20:47:18
 
Цитата
uptc написал: не работает как надо
для начала скажите как надо. Потому что сейчас по судя по коду при нажатии Ок очищается активная ячейка(почему, кстати, активная, а не Target?), а при нажатии Отмена - значение активной ячейки приравнивается к значению активной ячейки...Видимо, формулу затираете? Или что?
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
да все просто думал
что хотел    при  таких условиях  в активных  ячейках в D1 D50  
условия такие если делаю в активной ячейке
Selection.Cut 'вырезать (в контексном меню)
ActiveCell.FormulaR1C1 = ""  'очистить содержимое (в контексном меню)
Selection.Delete 'удалить (в контексном меню)
пытаюсь удалить клавиша Application.OnKey "{BACKSPACE}"
пытаюсь удалить клавиша Application.OnKey {DELETE}

вызывалось MsgBox("Вы точно хотите удалить данные из ячейки ?", 33, "Удаление данных")
если ОК то удаляется те active.cell = ""

если нет или отмена то данные сохраняются active.cell = active.cell
те просто вызвать  MsgBox при действии в активной ячейке
Selection.Cut 'вырезать (в контексном меню)
ActiveCell.FormulaR1C1 = ""  'очистить содержимое (в контексном меню)
Selection.Delete 'удалить (в контексном меню)
пытаюсь удалить клавиша Application.OnKey "{BACKSPACE}"
пытаюсь удалить клавиша Application.OnKey {DELETE}

MsgBox("Вы точно хотите удалить данные из ячейки ?", 33, "Удаление данных")

я сначала перечислил условия  и потом действия но не получилось
Код
Private Sub Worksheet_SelectionChange(ByVal Target As Range)If Selection.Cut = True Or ActiveCell.FormulaR1C1 = "" Or Selection.Delete = True Or Application.OnKey "{BACKSPACE}" Or Application.OnKey "{DELETE}" Then
Select Case MsgBox("Вы точно хотите удалить данные из ячейки ?", 33, "Удаление данных")
Case 1 ' Ок
ActiveCell.Value = ""
Case 2 ' Отмена
End Select
End If
End Sub
Изменено: uptc - 22.02.2017 12:51:52
 
Цитата
uptc написал: да все просто думал
Цитата
uptc написал:
Selection.Cut 'вырезать (в контексном меню)
событие не отслеживается
Цитата
uptc написал: ActiveCell.FormulaR1C1 = ""  'очистить содержимое (в контексном меню)
проблем нет
Цитата
uptc написал: Selection.Delete 'удалить (в контексном меню)
событие не отслеживается. или отслеживается с большим трудом
Цитата
uptc написал: пытаюсь удалить клавиша Application.OnKey "{BACKSPACE}"
пытаюсь удалить клавиша Application.OnKey {DELETE}
вообще непонятно, о чем это?
Вы сначала кашу из головы разложите по тарелкам, и разбирайтесь с каждой по очереди.
а
Цитата
Искключить удаление данных ячейки MsgBox
стоит здесь на самом первом (с конца, месте)
 
да вроде нет никакой каши   если правый клик на активной ячейке и выбираешь в контексном меню
'вырезать   'очистить содержимое  'удалить
то MsgBox("Вы точно хотите удалить данные из ячейки ?", 33, "Удаление данных")
или клавиши BACKSPACE или DELETE на активной ячейке
то MsgBox("Вы точно хотите удалить данные из ячейки ?", 33, "Удаление данных")

5 условий получается
если да в MsgBox то полностью очищается ячейка   если нет в MsgBox то активная ячейка не изменяется
может путанно обьясняю что надо ...
Изменено: uptc - 22.02.2017 12:52:32
 
Цитата
uptc написал:
5 условий получается
Тогда Вам стоит посмотреть не в сторону MsgBox, а UserForm, на которой будет или ListBox или ComboBox с нужными позициями.
 
те просто не получится типа ? Может сформулировать вопрос по другому ? -редактирование ячейки через MsgBox или защита от редактирования ячейки + MsgBox ?
Код
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Selection.Cut = True Or ActiveCell.FormulaR1C1 = "" Or Selection.Delete = True Or Application.OnKey "{BACKSPACE}" Or Application.OnKey "{DELETE}" Then
Select Case MsgBox("Вы точно хотите удалить данные из ячейки ?", 33, "Удаление данных")
Case 1 ' Ок
ActiveCell.Value = ""
Case 2 ' Отмена
End Select
End If
End Sub


Изменено: uptc - 21.02.2017 22:55:25
 
Цитата
uptc написал: Selection.Delete = True
нет такого. Delete - это метод без возвращаемого значения.
Цитата
uptc написал: Application.OnKey "{BACKSPACE}"
тоже метод. И он ничего не отслеживает(если Вы полагали, что это отслеживание нажатия клавиши Backspace) - он назначает свой макрос на эту клавишу. В Вашем случае, т.к. после не идет никакого имени макроса - отменяет назначение клавиш. С DELETE тоже самое.
Вы хоть справку открывайте прежде чем что-то в код пихать. А то чушь понаписали и хотите, чтобы она работала.

Если связать воедино то, что Вы описали, то для начала Вам надо понять, что действие "вырезать" не отслеживается. Действие Delete отслеживается, но лишь на уровне "значение ячейки изменилось". Грубо говоря Вы без танцев с бубном не поймете - то ли удалили, то ли скопировали туда пустую ячейку, то ли просто затерли в режиме редактирования. По сути Вы увидите лишь то, что значение ячейки стало пустым.
Поэтому приведенные Вам еще ранее коды более чем подходят. От меня - последняя попытка понять:
Код
if Target.Value = "" and oldTarget <> Target.Value then 'если ячейка вдруг стала пустая(была очищена, заменена на пустую и т.д.)
If MsgBox("Вы точно хотите удалить данные из ячейки ?", 33, "Удаление данных") <> vbOK Then '
    Target = oldTarget
Else
    'делаем чего-то фиг знает чего
    'Call Следующий_макрос
    'ActiveCell.Value = "tttttt"
End if
End If
В противном случае - сидите и учите синтаксис или заказывайте код с подробным описанием желаемого. Потому что пока, очевидно, никто не понимает Ваших хотелок.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Ну а синтаксис и азы VBA в любом случае учите, если дальше планируете коды писать. Без азов так и будете тыкаться.
А еще неплохо бы стремиться систематизировать свои мысли и выстраивать логику поведения создаваемых кодов. Чтобы любой глянул на пояснение или схему - и сразу понял, чего надо. Если не научитесь - коды не "попрут". Как в случае Выше - непонятно что должно быть причиной вызывания кода, непонятно зачем MsgBox и какова его конкретная роль, почему несколько действий, когда в кнопках MsgBox их всего две, а значит вариантов тоже не более двух. И все в этом духе...
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
The_Prist написал:
заказывайте код с подробным описанием желаемого
uptc!
Абсолютно идеальное предложение для Вас!
Преждевременная оптимизация - корень всех зол в программировании (Дональд Кнут).
 
Благодарю  Prist и Sanja за ваш кусок кода ! - именно это и было нужно  Bce получилось как надо
Код
Dim oldTarget
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("D1:D100")) Is Nothing Then
If Target.Cells.Count > 1 Then Exit Sub
If Target.Value = "" And oldTarget <> Target.Value Then 'если ячейка вдруг стала пустая(была очищена, заменена на пустую и т.д.)
If MsgBox("Вы точно хотите удалить данные из ячейки ?", 33, "Удаление данных") <> vbOK Then
    Target = oldTarget
Else
    ActiveCell.Select
End If
End If
End If
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Intersect(Target, Range("D1:D100")) Is Nothing Then
    oldTarget = Target.Value
End If
End Sub
Изменено: uptc - 23.02.2017 05:30:08
Страницы: 1
Наверх