А как удалить у активного листа содержимое его модуля? Написал макрос, который создаёт лист (если его нет) и заносит в его модуль определённый код. При повторном прогоне макроса, надо, чтобы если лист уже есть, этот модуль в него заносился в конце выполнения макроса, т.е. в начале модуль надо очистить. Не подскажете как?
А как удалить у активного листа содержимое его модуля? Написал макрос, который создаёт лист (если его нет) и заносит в его модуль определённый код. При повторном прогоне макроса, надо, чтобы если лист уже есть, этот модуль в него заносился в конце выполнения макроса, т.е. в начале модуль надо очистить. Не подскажете как?superpsih
Sub ClearCodeModule() Set CodeMod = ThisWorkbook.VBProject.VBComponents(ActiveSheet.CodeName).CodeModule CodeMod.DeleteLines 1, CodeMod.CountOfLines End Sub
[/vba]
[vba]
Код
Sub ClearCodeModule() Set CodeMod = ThisWorkbook.VBProject.VBComponents(ActiveSheet.CodeName).CodeModule CodeMod.DeleteLines 1, CodeMod.CountOfLines End Sub
[/vba] Потом с первого листа копирует на второй информацию в определённом порядке, преобразовывая её. Потом, после того как второй лист заполнен (и он активирован), вставляю модуль в лист (делать это надо в самом конце кода, т.к. этот модуль отслеживает сделанные изменения) с помощью кода: [vba]
Код
Sheets("Ëèñò2").Select Set CodeMod = ActiveWorkbook.VBProject.VBComponents(ActiveSheet.CodeName).CodeModule s = _ "Option Explicit" & vbNewLine & _ "Dim vValue" & vbNewLine & _ "Private Sub Worksheet_Change(ByVal Target As Range)" & vbNewLine & _ "If Target.count > 1 Then Exit Sub" & vbNewLine & _ "If Target <> vValue Then Target.Interior.Color = -4142" & vbNewLine & _ "End Sub" & vbNewLine & _ "Private Sub Worksheet_SelectionChange(ByVal Target As Range)" & vbNewLine & _ "If Target.count = 1 Then vValue = Target" & vbNewLine & _ "End Sub" & vbNewLine
With CodeMod .InsertLines .CountOfLines + 1, s End With
[/vba] Макрос при запуске выдаёт ошибку №9, останавливаясь на строке [vba]
Код
Set CodeMod = ActiveWorkbook.VBProject.VBComponents(ActiveSheet.CodeName).CodeModule
[/vba] При этом, если после остановки макроса, удалить второй лист и запустить его заново, то он отрабатывает без ошибок. В чём может быть проблема? (макрос находится в другой книге, отличной от той, в которой добавляется лист с модулем).
Написал макрос, который создаёт лист [vba]
Код
Sheets.Add After:=Sheets(Sheets.Count)
[/vba] Потом с первого листа копирует на второй информацию в определённом порядке, преобразовывая её. Потом, после того как второй лист заполнен (и он активирован), вставляю модуль в лист (делать это надо в самом конце кода, т.к. этот модуль отслеживает сделанные изменения) с помощью кода: [vba]
Код
Sheets("Ëèñò2").Select Set CodeMod = ActiveWorkbook.VBProject.VBComponents(ActiveSheet.CodeName).CodeModule s = _ "Option Explicit" & vbNewLine & _ "Dim vValue" & vbNewLine & _ "Private Sub Worksheet_Change(ByVal Target As Range)" & vbNewLine & _ "If Target.count > 1 Then Exit Sub" & vbNewLine & _ "If Target <> vValue Then Target.Interior.Color = -4142" & vbNewLine & _ "End Sub" & vbNewLine & _ "Private Sub Worksheet_SelectionChange(ByVal Target As Range)" & vbNewLine & _ "If Target.count = 1 Then vValue = Target" & vbNewLine & _ "End Sub" & vbNewLine
With CodeMod .InsertLines .CountOfLines + 1, s End With
[/vba] Макрос при запуске выдаёт ошибку №9, останавливаясь на строке [vba]
Код
Set CodeMod = ActiveWorkbook.VBProject.VBComponents(ActiveSheet.CodeName).CodeModule
[/vba] При этом, если после остановки макроса, удалить второй лист и запустить его заново, то он отрабатывает без ошибок. В чём может быть проблема? (макрос находится в другой книге, отличной от той, в которой добавляется лист с модулем).superpsih
Sub copy_sh() Dim sh As Worksheet Application.EnableEvents = False ActiveSheet.Copy After:=Sheets(Sheets.Count) Set sh = ActiveSheet sh.Cells.Delete sh.Range("A1").Formula = "=2*2" MsgBox sh.Range("A1").Formula Application.EnableEvents = True End Sub
[/vba] и никаких [vba]
Код
ThisWorkbook.VBProject.VBComponents
[/vba]
[vba]
Код
Sub copy_sh() Dim sh As Worksheet Application.EnableEvents = False ActiveSheet.Copy After:=Sheets(Sheets.Count) Set sh = ActiveSheet sh.Cells.Delete sh.Range("A1").Formula = "=2*2" MsgBox sh.Range("A1").Formula Application.EnableEvents = True End Sub
Может я и не прав, но, почему-то, мне кажется, что весь ваш код - попытка снять штаны через голову. [vba]
Код
Sub copy_sh() Dim sh As Worksheet Application.EnableEvents = False ' отключаем обработку события ActiveSheet.Copy After:=Sheets(Sheets.Count) ' копируем лист вместе с кодом Set sh = ActiveSheet sh.Cells.Delete ' делаем лист девственно чистым sh.Range("A1").Formula = "=2*2" ' "Потом с первого листа копирует на второй информацию в определённом порядке, преобразовывая её." MsgBox sh.Range("A1").Formula ' "Потом с первого листа копирует на второй информацию в определённом порядке, преобразовывая её." Application.EnableEvents = True ' включаем обработку события End Sub
[/vba] А если лист существует, все тоже самое, но без копирования листа.
Может я и не прав, но, почему-то, мне кажется, что весь ваш код - попытка снять штаны через голову. [vba]
Код
Sub copy_sh() Dim sh As Worksheet Application.EnableEvents = False ' отключаем обработку события ActiveSheet.Copy After:=Sheets(Sheets.Count) ' копируем лист вместе с кодом Set sh = ActiveSheet sh.Cells.Delete ' делаем лист девственно чистым sh.Range("A1").Formula = "=2*2" ' "Потом с первого листа копирует на второй информацию в определённом порядке, преобразовывая её." MsgBox sh.Range("A1").Formula ' "Потом с первого листа копирует на второй информацию в определённом порядке, преобразовывая её." Application.EnableEvents = True ' включаем обработку события End Sub
[/vba] А если лист существует, все тоже самое, но без копирования листа.RAN
Спасибо. Теперь идею я понял. Но не совсем подходит в моём случае, поскольку макрос в модуле листа должен появиться в нём после того, как лист заполнен - иначе, он тоже будет включаться во время заполнения листа, что не хорошо.
Спасибо. Теперь идею я понял. Но не совсем подходит в моём случае, поскольку макрос в модуле листа должен появиться в нём после того, как лист заполнен - иначе, он тоже будет включаться во время заполнения листа, что не хорошо.superpsih
Начал делать. Поскольку макрос находится в отдельной книге, лист с модулем надо копировать в книгу, над которой производятся манипуляции. Выдаёт ошибку на строке: [vba]
[/vba] Причина - несоответствие числа строк и столбцов в книге с макросом и в книге temp (в книге с макросом строк 1048576, а в книге temp (она формируется сторонней программой) их 65536). Можно ли как-то изменить число строк и столбцов, чтобы размер листов был одинаковым?
Начал делать. Поскольку макрос находится в отдельной книге, лист с модулем надо копировать в книгу, над которой производятся манипуляции. Выдаёт ошибку на строке: [vba]
[/vba] Причина - несоответствие числа строк и столбцов в книге с макросом и в книге temp (в книге с макросом строк 1048576, а в книге temp (она формируется сторонней программой) их 65536). Можно ли как-то изменить число строк и столбцов, чтобы размер листов был одинаковым?superpsih
Сообщение отредактировал superpsih - Суббота, 03.10.2015, 12:38