Страницы: 1
RSS
Простое двойное условие, если активная ячейка пустая
 
Привет умные люди :) . Прошу помочь. Не такому умному мне  :D  нужно доработать простенький код следующего типа:
Код
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 пункте:
Если активная ячейка пустая, то сообщить, что данные проекта удалены
В ином случае выполнять остальные строки кода.

Заранее искренне благодарю!  :)
Изменено: idexter08 - 29.05.2017 21:25:37
 
Вариант
Код
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 - 22.05.2017 21:32:37
Согласие есть продукт при полном непротивлении сторон
 
Цитата
Sanja написал:Вариант
Че то не хочет
Изменено: idexter08 - 22.05.2017 23:48:27
 
Columns(2), опечатка
Согласие есть продукт при полном непротивлении сторон
 
Пхах)) сорян.
Афигенно! Все работает как надо!  8)
Благодарю!
 
Sanja, А если нужно не одну выбранную ячейку, а несколько удалить сразу, то на что нужно заменить ActiveCell?
ActiveRange видимо не бывает в природе)) Я попробовал во всяком случае, не получилось.
Изменено: idexter08 - 22.05.2017 23:48:55
 
Selection

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Спасибо)
 
Т. к. допускается множественный выбор ячеек, то:
1. Для надежности, в начале процедуры, я бы проверял принадлежность ВСЕХ ячеек Selection столбцу "B".
2. Использовать If IsEmpty(Selection) Then... в данном случае нельзя, т. к. в Selection могут оказаться как пустые, так и заполненные ячейки.
Чем шире угол зрения, тем он тупее.
 
Вот реализация Вашего желания в реальности пользуйтесь, тестируйте, могут быть баги писал в блокноте. Логику можно еще более навернуть, возможности VBA позволяют.  :)
Обратите внимание процедура заточена под активное приложение Excel и активный лист (With ActiveWorkbook,  With ActiveSheets)  8)
Код
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
 
Цитата
TSN написал:
Логику можно еще более навернуть
8-0 куда больше? Мне кажется будет достаточно
Скрытый текст
Согласие есть продукт при полном непротивлении сторон
 
Цитата
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
Согласие есть продукт при полном непротивлении сторон
 
Sanja,Спасибо) уже сделал, аналогичным образом, работает))
Страницы: 1
Наверх