Вместо Delete
вы можете использовать Clear
или, если вы хотите сохранить форматирование ниже последней строки, вы можете использовать ClearContents
.
Option Explicit
Sub DelRows()
Const cSheet As Variant = "Sheet1" ' Worksheet Name/Index
Const cColumn As Variant = "G" ' Cirteria Column Letter/Number
Dim lastR As Long ' Last Row
With ThisWorkbook.Worksheets(cSheet)
lastR = .Cells(.Rows.Count, cColumn).End(xlUp).Row
.Range(.Cells(lastR + 1, 1), .Cells(.Rows.Count, 1)).EntireRow.Delete
End With
End Sub
PostSharp, который является aftercompiler, делает что-то подобное тому, что Вы описываете, с помощью атрибутов для маркировки инжекционных точек в коде, единственная разница - то, что он делает это во время компиляции.
Но можно также сделать это во времени выполнения не путем изменения тел метода, а при помощи классов, полученных из ContextBoundObject, который является классом .NET, который позволяет Вам прервать все вызовы, выполненные против него. Вот статья MSDN Magazine, описывающая, как сделать использование AOP ContextBoundObject. (Проверьте аспекты в часть .NET статьи),
И как третья опция можно использовать динамическую генерацию кода (Отражение. Испустите или CodeDom) в сочетании с атрибутами и виртуальными методами для динамичной генерации производных классов, где можно ввести код, но это - самый болезненный способ сделать это.
Править:
Существует дальше опция использовать .NET неуправляемый профильный API для прерывания луга JIT метода и тел метода замены перед лугом JIT. Эта техника успешно используется JustMock (Telerik) для насмешки, статические методы, не виртуальные методы и даже запечатанные классы.
Вы не можете изменить существующий метод во времени выполнения, но можно создать один с Кодом DOM на лету и выполнить это. Или, Вы могли concat вместе строки кода, и компилировать его в памяти и выполнять это.
Я сделал последнего сам (приложение, которое я позволил пользовательскому коду C#, который был скомпилирован и выполнился в памяти, времени выполнения).
Несколько подобный вопрос задали ранее (хорошо, таким образом, мое решение было несколько аналогично). PostSharp был уже упомянут, но существует также эта очень применимая статья LinFu о CodeProject, который я нашел интересным при исследовании проблемы.
Если Вы надеетесь добавлять аспекты пред или отправлять вызов, смотреть на PostSharp: http://www.postsharp.org/
Вы планируете сделать это для произвольных типов? Я предположил бы не, учитывая, что Вы собираетесь украсить методы атрибутом.
Учитывая, что, я думал бы, что лучший подход должен будет определить абстрактные методы в суперклассе для Ваших типов. Метод на суперклассе может содержать шаблонный код метода и делегировать к конкретным реализациям через абстрактные методы для поведения отдельного типа того метода.
Вообще говоря, хотя, если Вы не входите, создают файлы кода и компиляцию динамических блоков во времени выполнения, что Вы надеетесь делать, не может быть сделан. Существуют, вероятно, намного более практические принципы OO и шаблоны, которые можно использовать для достижения близко к тому же результату.