Страницы: 1
RSS
Макрос по удалению части таблицы
 
Помогите пожалуйста с макросом!

В прилагаемой таблице есть данные, а правее данных формулы, вычисляющие определенные значения на основе этих данных. Данные заполняются построчно, по мере необходимости.
Ищу способ автоматизировать заполнение формул. Наиболее подходящим считаю выделение всей строки, и с помощью крестика автопродление тяну на одну строку, но чтобы осуществлять меньше действий, хочу чтобы неформульная половина строки к моменту автопродления была очищена. То есть выделить строку - протянуть на одну строку черным крестиком - отпустить - макрос по очистке автопродленной строки со столбца B до столбца O.

Красавчики и красавицы помогите!)
 
Вот буквально только что решалась схожая задача...
Код
Sub ДобавлениеСтрокиВКонец()
    Dim tbl As Range
    ' находим последнюю строку данных
    Set tbl = ActiveSheet.[a1].CurrentRegion.Cells(1, 1).CurrentRegion
    Set tbl = tbl.Offset(tbl.Rows.Count - 1).Resize(1)
    ' далее tbl это строка-образец, добавляем новую ниже её
    tbl.Resize(2).FillDown
    On Error Resume Next
    tbl.Offset(1).SpecialCells(xlCellTypeConstants).ClearContents
    On Error GoTo 0
    tbl.Offset(1).Cells(1, 1).Select
End Sub
Только учтите, что ваша "таблица данных" должна быть именно таблицей, без полностью пустых строк или столбцов.
Изменено: AndreTM - 04.08.2017 12:31:32
 
axlgart, еще вариант.
Здесь события отслеживаются на листе, очистка происходит сразу после протягивания на листе.
Добавьте следующий код в Лист1:
Код
Private SelectionRn As Range

' При изменении на листе
Private Sub Worksheet_Change(ByVal Target As Range)
    ' Если изменена вся строка и сохранено предыдущее выделение всей строки - было автозаполнение
    If Target.EntireRow.Address = Target.Address And Not SelectionRn Is Nothing Then
        ' Временно отключим события, чтобы не провоцировать лишние Worksheet_SelectionChange
        Application.EnableEvents = False
        ' Для каждой измененной строки
        For i = 1 To Target.Rows.Count
            ' По умолчанию считаем, что строки одинаковые
            sameValues = True
            ' Игнорируем пустые строки, работаем с заполненными
            If WorksheetFunction.CountA(Intersect([B:O], Target.Rows(i))) > 0 Then
                ' Сравниваем каждую ячейку на совпадение с образцом
                For Each el In Intersect([B:O], Target.Rows(i).Cells)
                    ' Даты и числа при автозаполнении могут измениться, поэтому их не сравниваем
                    If IsNumeric(el) = False And IsDate(el) = False Then
                        ' Если хотя бы одна сравниваемая ячейка отличается, значит считаем строки разными и перейдем к следующей строчке
                        If SelectionRn.Columns(el.Column).Rows(1).Value <> el.Value Then
                            sameValues = False
                            Exit For
                        End If
                    End If
                Next el
                ' Если строки одинаковы, почистим автозаполненное
                If sameValues = True Then
                    Intersect([B:O], Target.Rows(i)).ClearContents
                End If
            End If
        Next i
        Application.EnableEvents = True
    End If
End Sub

' При выделении ячеек на листе
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.EntireRow.Address = Target.Address Then
        ' Если выделена вся строчка - подготовимся.
        
        Set SelectionRn = Target
    ' Если выделена не вся строка, значит в случае последующего изменения было использовано не протягивание всего стобца
    Else: Set SelectionRn = Nothing
    End If
End Sub
In GoTo we trust
 
tolstak, почему макрос работает только на вашем примере, если я удаляю или заменяю верхние данные, то все энд
AndreTM, я не понял как работает макрос от слова совсем. Вставляю его, а он не работает
 
axlgart,
Попробуйте следующим образом изменить код:
Код
Private Sub Worksheet_Change(ByVal Target As Range)
'В случае ошибки обязательно возобновляем реагирование на события листа
On Error GoTo end1:
    ' Если изменена вся строка и сохранено предыдущее выделение всей строки - было автозаполнение

и
Код
        Next i
    End If
end1:
    Application.EnableEvents = True
End Sub

В приложении - файл с изменениями.
In GoTo we trust
 
tolstak,вы предлагаете прямо отличные решения моей проблемы, но я никак не могу понять почему не работает как надо. Если я ввожу абракадабру (пробую) все отлично работает, но как только начиню вводить мена реальных людей, как все, ничего не работает
 
Может лучше будет все действие повесить на кнопку? (я это в одной из тем увидел): автозаполнение последней строки, очистить автопродленную строку со столбца B до столбца O - снять выделение со строки, выделить ячейку в соответствующей строке колонки В. Поможете?
Изменено: axlgart - 04.08.2017 18:43:59
 
axlgart, держите.
Код
Sub autofill()
    Dim lastRow As Range
    Set lastRow = [A:A].Rows(Rows.Count - 1).End(xlUp).EntireRow
    lastRow.autofill Destination:=Range(lastRow, lastRow.Offset(1, 0)), Type:=xlFillDefault
    Intersect([B:O], lastRow.Offset(1, 0)).ClearContents
    Intersect([B:B], lastRow.Offset(1, 0)).Select
    ' Левитирующая кнопка, если не нравится - удалить строчку кода
    ActiveSheet.Shapes.Range("Plus 1").Top = lastRow.Offset(1, 0).Top + lastRow.Offset(1, 0).Height + 10
End Sub
Изменено: tolstak - 04.08.2017 21:05:15 (Не прописал выделение ячейки, исправлено)
In GoTo we trust
 
tolstak, супер и отлично!! Прям спасибо

Если не трудно, поясните плиз, как работает и что означает каждая строка кода, ведь он стал намного меньше, проще и работоспособнее, а значит смогу уяснить))
 
axlgart,
Код
Sub autofill()
    ' Объявляем переменную
    Dim lastRow As Range
    ' Определяем последнюю строку. Она - Первая не пустая, начиная с конца листа. Выделим весь столбец
    Set lastRow = [A:A].Rows(Rows.Count - 1).End(xlUp).EntireRow
    ' Заполняем последней строчкой ее и на одну ниже
    lastRow.autofill Destination:=Range(lastRow, lastRow.Offset(1, 0)), Type:=xlFillDefault
    ' Очистим пересечение столбцов с [B по O] cо строчкой ниже на одну чем ранее определенная последняя
    Intersect([B:O], lastRow.Offset(1, 0)).ClearContents
    ' И выделим пересечение со столбцом B
    Intersect([B:B], lastRow.Offset(1, 0)).Select
    
    ' Левитирующая кнопка, если не нравится - удалить строчку кода
    ' Подтянем кнопку под последний элемент
    ActiveSheet.Shapes.Range("Plus 1").Top = lastRow.Offset(1, 0).Top + lastRow.Offset(1, 0).Height + 10
End Sub
In GoTo we trust
 
tolstak, спасибо, а модуль 2?
 
axlgart, смело игнорируйте и удаляйте)
В расчете не участвует, записывал макро-рекордером в процессе составления макроса, забыл удалить)
In GoTo we trust
 
tolstak, левитирующая кнопка - супер, но мне не нравится как она выглядит;)

Пробовал назначить на нее другую фигуру, но тоже не получается, то ошибку VBA выдает, то она перестает с текстом левитировать. Сможете помочь?
 
axlgart, можно по другому достучаться до кнопки:
Код
ActiveSheet.Shapes(1)

В приложении - сделал "редизайн")
In GoTo we trust
Страницы: 1
Читают тему
Наверх