Привет умные люди . Прошу помочь. Не такому умному мне нужно доработать простенький код следующего типа:
Код
Sub Удалить_проект()
If IsEmpty(ActiveCell) = True Then
MsgBox "Данные о проектах полностью удалены", 64
Else
Dim xx
xx = MsgBox("Данные этого проекта будут полностью удалены. Продолжить?", vbYesNo)
If xx = 7 Then: Exit Sub 'если нет, то не выполнять макрос
If xx = 6 Then: 'если да, то:
Selection.Value = Empty 'поскольку ячейка связанна с исходным кодом листа, то вся трока проекта с даннми будет очищена
End If
End Sub
1) Сейчас макрос действует так: Если активная ячейка пустая, то сообщить, что данные проекта удалены В ином случае выполнять остальные строки кода.
2) А нужно чтобы было так: Проверить находится ли активная ячейка в колонке B, если нет, то: Вывести сообщение "Выберете ячейку с названием проекта в колонке B и повторите действие еще раз". Если да, то: И вот тут мы продолжаем то, что описано 1 пункте: Если активная ячейка пустая, то сообщить, что данные проекта удалены В ином случае выполнять остальные строки кода.
Sub Удалить_проект()
If Not Intersect(ActiveCell, Columns(2)) Is Nothing Then
If IsEmpty(ActiveCell.Value) Then
MsgBox "Данные о проектах полностью удалены", 64
Else
If MsgBox("Данные этого проекта будут полностью удалены. Продолжить?", vbYesNo) = vbYes Then ActiveCell.Value = Empty
End If
Else
MsgBox "Выберете ячейку с названием проекта в колонке B и повторите действие еще раз", vbExclamation + vbOKOnly
End If
End Sub
Sanja, А если нужно не одну выбранную ячейку, а несколько удалить сразу, то на что нужно заменить ActiveCell? ActiveRange видимо не бывает в природе)) Я попробовал во всяком случае, не получилось.
Т. к. допускается множественный выбор ячеек, то: 1. Для надежности, в начале процедуры, я бы проверял принадлежность ВСЕХ ячеек Selection столбцу "B". 2. Использовать If IsEmpty(Selection) Then... в данном случае нельзя, т. к. в Selection могут оказаться как пустые, так и заполненные ячейки.
Вот реализация Вашего желания в реальности пользуйтесь, тестируйте, могут быть баги писал в блокноте. Логику можно еще более навернуть, возможности VBA позволяют. Обратите внимание процедура заточена под активное приложение Excel и активный лист (With ActiveWorkbook,With ActiveSheets)
Код
Sub Удалить_проект_Несколько()
Dim Vl, intCount As Long, intTest
With ActiveWorkbook
With ActiveSheets
If Intersect(ActiveCell, Columns(2)) Is Nothing Then ''' Если выделение вне столбца "Б"
MsgBox "Выберете ячейку с названием проекта в колонке B и повторите действие еще раз", 48
Else
For Each Vl In Selection ''' Анализ количества выделенных ячеек только столбца "Б"
intCount = intCount + 1
If Not IsEmpty(Vl.Value) And Vl.Column = 2 Then intTest = intTest + 1
Next
Select Case intCount
Case Is = 1 ''' стандартная обработка одной ячейки
Select Case intTest
Case Is = 0: MsgBox "Данные о проектах полностью удалены", 64
Case Else
If MsgBox("Данные этого проекта будут полностью удалены. Продолжить?", 4) = 6 Then ActiveCell.Value = Empty
End Select
Case Else ''' расширенная обработка нескольких ячеек
Select Case intTest
Case Is = 0: MsgBox "Данные о проектах полностью удалены", 64
Case Else
If MsgBox("Общее количество выделенных ячеек проектов колонки Б составило " & intTest & "штук. Продолжить?", 4) = 6 Then
For Each Vl In Selection ''' Удаляем выделенные ячейки только столбца "Б"
If Not IsEmpty(Vl.Value) And Vl.Column = 2 Then Vl.Value = Empty
Next
End If
End Select
End Select
End If
End With
End With
End Sub
Sub Удалить_проект_Несколько()
Dim cl As Range
Dim rngProject As Range
Dim strProject As String
If Intersect(Selection, Columns(2)).Count <> 0 Then
For Each cl In Intersect(Selection, Columns(2)).Cells
If Not IsEmpty(cl) Then
If Not rngProject Is Nothing Then
Set rngProject = Union(rngProject, cl)
strProject = strProject & vbCrLf & cl.Value
Else
Set rngProject = cl
strProject = cl.Value
End If
End If
Next
If Not IsEmpty(strProject) Then
If MsgBox("Данные о проектах:" & vbCrLf & _
strProject & vbCrLf & "будут полностью удалены! Продолжить?", _
vbCritical + vbYesNo, "Внимание!") = vbYes Then rngProject.ClearContents
Else
MsgBox "Данные о проектах полностью удалены", 64
End If
Else
MsgBox "Выберете ячейку(диапазон) с названием проекта в колонке B и повторите действие еще раз", 48
End If
End Sub
Согласие есть продукт при полном непротивлении сторон
SAS888 написал: 2. Использовать If IsEmpty(Selection) Then... в данном случае нельзя, т. к. в Selection могут оказаться как пустые, так и заполненные ячейки.
Тем не менее работает нормально (даже если выделять одновременно и пустые и непустые), но спасибо))
TSN, спасибо) Скажите, а если я хочу очистить не только активную ячейку, а еще несколько конкретных ячеек этой строки, то как мне реализовать и их очистку при нажатии Yes? Я прошу прощения за наглость, просто пришел к выводу повесить манипуляции все на кнопки(макросы с шорт катами назначенными мной), и если раньше после очистки этой ячейки остальные в этой строке (-ах, если удаляю сразу несколько проектов (соответственно строк)) удалялись сами, благодаря прописанному коду в исходном тексте листа, то сейчас я решил завязать все в одно макросе и прикрепить его к шорт кату и кнопке. Попытки присобачить сюда код с исходного текста, который позволял очищать остальные ячейки в строке по логике "если пусто, то...", не увенчались успехом.
То есть с учетом всех условий выше: если выбранный диапазон (то есть даже не одна ячейка может быть, то бишь selection) принадлежит к столбцу B (и тут можно даже опустить условие, если я выберу пустую ячейку, пес с ней, не страшно), то: 1) очистить выбранный диапазон 2) очистить соответствующие этому дипазону ячейки в столбцах A, C, E, G, I и K То есть, я выбрал например диапазон B13:B25, макрос посмотрел, что главное условие выполнено и ячейки выделены только в столбце B (если нет, то пусть выводит сообщение "Выберете ячейку(диапазон) в колонке B и повторите действие еще раз"), он меня спрашивает "Данные этого проекта будут полностью удалены. Продолжить?" и если я жму да, то очищаются не только B13:B25, но и те же диапазоны в столбцах A, C, E, G, I и K
Sub Удалить_проект_Несколько()
Dim cl As Range
Dim rngProject As Range
Dim strProject As String
If Intersect(Selection, Columns(2)).Count <> 0 Then
For Each cl In Intersect(Selection, Columns(2)).Cells
If Not IsEmpty(cl) Then
If Not rngProject Is Nothing Then
Set rngProject = Union(rngProject, cl, cl.Offset(, -1), cl.Offset(, 1), cl.Offset(, 3), cl.Offset(, 5), cl.Offset(, 7), cl.Offset(, 9))
strProject = strProject & vbCrLf & cl.Value
Else
Set rngProject = Union(cl, cl.Offset(, -1), cl.Offset(, 1), cl.Offset(, 3), cl.Offset(, 5), cl.Offset(, 7), cl.Offset(, 9))
strProject = cl.Value
End If
End If
Next
If Not IsEmpty(strProject) Then
If MsgBox("Данные о проектах:" & vbCrLf & _
strProject & vbCrLf & "будут полностью удалены! Продолжить?", _
vbCritical + vbYesNo, "Внимание!") = vbYes Then rngProject.ClearContents
Else
MsgBox "Данные о проектах полностью удалены", 64
End If
Else
MsgBox "Выберете ячейку(диапазон) с названием проекта в колонке B и повторите действие еще раз", 48
End If
End Sub
Согласие есть продукт при полном непротивлении сторон