Страницы: 1
RSS
Сохранение форматов, формул и пересчет порядковых номеров строк таблицы при добавлении новой строки макросом
 

Добрый день.
Попытался прикрутить макросы добавления и удаления строк в таблице.
Вроде, ничего сложного.

Код
Sub Кнопка4_Щелчок()
    Application.ScreenUpdating = False
    If Application.Intersect(ActiveCell, ActiveSheet.UsedRange) Is Nothing _
        Or ActiveCell.Row < 10 Then
            MsgBox "Активная строка вне таблицы"
    Else
        Rows(ActiveCell.Row).Insert
        Rows(ActiveCell.Row + 1).Copy Rows(ActiveCell.Row)
    End If
       Rows(ActiveCell.Row + 1).ClearContents
       Application.ScreenUpdating = True
 End Sub

Код
Sub Кнопка5_Щелчок()
    Application.ScreenUpdating = False
    If Application.Intersect(ActiveCell, ActiveSheet.UsedRange) Is Nothing _
        Or ActiveCell.Row < 10 Then
            MsgBox "Активная строка вне таблицы"
    Else
        Rows(ActiveCell.Row).Delete
    End If
    Application.ScreenUpdating = True
 End Sub

Проблема в том, что, при добавлении строка зачищается целиком, а, нужно сохранить форматы, а в определенных столбцах и формулы. Кроме того, пересчитать порядковые номера в столбце B.

Соответственно, при удалении строки, так же, пересчитать порядковые номера и формулы.

Помогите, пожалуйста, дописать код.

Таблицу не выкладываю, т.к., очень тяжелая. Но, если для понимания проблемы, нужно выложить фрагмент, вырежу.

С уважением,

Олег

 
Еще один момент. Подскажите, как в определенном диапазоне добавленной строки снять защиту с ячеек?
 
range(cells(r,1), cells(r,10)).locked = False
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
Ігор Гончаренко написал:
range(cells(r,1), cells(r,10)).locked = False
Увы, ругается на эту команду.
 
Ну, что же. Форум Планеты, как всегда не разочаровал.  
 
Цитата
grand68 написал:
Подскажите, как в определенном диапазоне добавленной строки
конечно ругнется если r там равно 0
а если r = № добавленой Вами строки, то будет снята блокировка в первых 10 ячейках строки r
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
Ігор Гончаренко написал:
конечно ругнется если r там равно 0а если r = № добавленой Вами строки, то будет снята блокировка в первых 10 ячейках строки r
Строка может быть добавлена в любом месте  таблицы. На данный момент, макрос заканчивается тем, что зачищает строку добавленную ниже активной.
Я и прошу помочь восстановить в добавленной строке (ее единственный адрес то, что она ниже активной) формулы, форматы и снять защиту с ячеек этой строки с 4 по 9 столбец.
Отдельно все коды для этих действий я сам нашел. Проблема в том, что я ни разу не программист и не понимаю, как их прикрутить, именно, к вновь появившейся строке в любом месте таблицы.
 
Цитата
grand68 написал:
как их прикрутить, именно, к вновь появившейся строке в любом месте таблицы
чуть-чуть хотя бы подумать, поприкидывать варианты и вместо r в коде Игоря поставить ActiveCell.Row + 1
Цитата
grand68 написал:
нужно сохранить форматы, а в определенных столбцах и формулы
одному Вам известно что это за определенные столбцы. Но в общем виде это примерно так:
Код
Sub Кнопка4_Щелчок()
    Application.ScreenUpdating = False
    If Application.Intersect(ActiveCell, ActiveSheet.UsedRange) Is Nothing _
        Or ActiveCell.Row < 10 Then
            MsgBox "Активная строка вне таблицы"
    Else
        Rows(ActiveCell.Row).Insert
        Rows(ActiveCell.Row + 1).Copy Rows(ActiveCell.Row)
    End If
       Cells(ActiveCell.Row + 1,1).Value = empty 'очищаем ячейку первого столбца от значений и формул, оставляя при этом форматы
       Cells(ActiveCell.Row + 1,4).Value = empty 'очищаем ячейку 4-го столбца от значений и формул, оставляя при этом форматы
       'и т.д. по аналогии
       range(cells(ActiveCell.Row + 1,4), cells(ActiveCell.Row + 1,9)).locked = False
       Application.ScreenUpdating = True
 End Sub

ячейки с формулами при этом затрагивать смысла нет, т.к. их значения зависят от значения других ячеек.
Плюс все это можно было узнать через грамотную запись макроса. когда Вы нажимаете "Очистить все"(ClearContents) - то все и очищаете. Но если это меню на панели раскрыть - там появятся другие варианты, вроде: Очистить форматы, Очистить содержимое(это как раз удаление значений и формул без очистки форматов). Или просто выделить нужные ячейки и нажать Del(при активной записи макроса, конечно).
Изменено: Дмитрий(The_Prist) Щербаков - 08.08.2019 10:23:39
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
В общем, получилось так.
Может, кому пригодится.
Наверное, можно оптимизировать, не знаю...
Код
Sub Кнопка4_Щелчок()
    Application.ScreenUpdating = False
    If Application.Intersect(ActiveCell, ActiveSheet.UsedRange) Is Nothing _
        Or ActiveCell.Row < 9 Then
            MsgBox "Активная строка вне таблицы"
    Else
        Rows(ActiveCell.Row).Insert
        Rows(ActiveCell.Row + 1).Copy Rows(ActiveCell.Row)
    End If
       Cells(ActiveCell.Row + 1, 3).Value = Empty 'очищаем ячейку 3-го столбца от значений и формул, оставляя при этом форматы и т.д. по аналогии
       Cells(ActiveCell.Row + 1, 4).Value = Empty
       Cells(ActiveCell.Row + 1, 5).Value = Empty
       Cells(ActiveCell.Row + 1, 6).Value = Empty
       Cells(ActiveCell.Row + 1, 7).Value = Empty
       Cells(ActiveCell.Row + 1, 8).Value = Empty
       Cells(ActiveCell.Row + 1, 9).Value = Empty
       Cells(ActiveCell.Row + 1, 11).Value = Empty
       Cells(ActiveCell.Row + 1, 12).Value = Empty
       Cells(ActiveCell.Row + 1, 13).Value = Empty
       Cells(ActiveCell.Row + 1, 15).Value = Empty
       Cells(ActiveCell.Row + 1, 16).Value = Empty
       Cells(ActiveCell.Row + 1, 17).Value = Empty
       Cells(ActiveCell.Row + 1, 18).Value = Empty
       Cells(ActiveCell.Row + 1, 19).Value = Empty
       Cells(ActiveCell.Row + 1, 20).Value = Empty
       Cells(ActiveCell.Row + 1, 21).Value = Empty
       Cells(ActiveCell.Row + 1, 4).Locked = False 'снимаем блокировку с ячейки 4-го столбца и т.д. по аналогии
       Cells(ActiveCell.Row + 1, 5).Locked = False
       Cells(ActiveCell.Row + 1, 6).Locked = False
       Cells(ActiveCell.Row + 1, 7).Locked = False
       Cells(ActiveCell.Row + 1, 8).Locked = False
       Cells(ActiveCell.Row + 1, 9).Locked = False
    Application.ScreenUpdating = True
End Sub
Изменено: grand68 - 08.08.2019 10:58:42
 
Цитата
grand68 написал:
Наверное, можно оптимизировать
часть оптимизированного Вам привели изначально :) А в целом:
Код
       Cells(ActiveCell.Row + 1, 3).Resize(,10).Value = Empty 'очищаем 10 столбцов, начиная с ячейки 3-го столбца
       Cells(ActiveCell.Row + 1, 15).Resize(,7).Value = Empty
       range(cells(ActiveCell.Row + 1,4), cells(ActiveCell.Row + 1,9)).locked = False 'снимаем блокировку с ячеек от 4-го столбца до 9-го
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
grand68 написал:
Строка может быть добавлена в любом месте  таблицы.
а R - это и есть в любом месте твблицы
и очень грустно если Вы этого не понимаете (достаточно было присвоить R =ActiveCell.Row+1)
Изменено: Ігор Гончаренко - 08.08.2019 11:20:11
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
Страницы: 1
Наверх