Знаю про этот вариант, но в идеале очистить, потому как листы копируются из других книг а макросы нет и получается конфуз. Потому я копирую и потом удаляю все ненужное и нерабочее.
Знаю про этот вариант, но в идеале очистить, потому как листы копируются из других книг а макросы нет и получается конфуз. Потому я копирую и потом удаляю все ненужное и нерабочее.skais
Dim oVBComponent As Object, lCountLines As Long Set oVBComponent = ActiveWorkbook.VBProject.VBComponents("Sheet3") With oVBComponent lCountLines = .CodeModule.CountOfLines .CodeModule.DeleteLines 1, lCountLines End With Set oVBComponent = Nothing
[/vba] Однако, теперь не знаю как предусмотреть правильный ввод "Sheet3" или "Лист3" взависимости от локали?
Pelena, Все верно, получилось [vba]
Код
Dim oVBComponent As Object, lCountLines As Long Set oVBComponent = ActiveWorkbook.VBProject.VBComponents("Sheet3") With oVBComponent lCountLines = .CodeModule.CountOfLines .CodeModule.DeleteLines 1, lCountLines End With Set oVBComponent = Nothing
[/vba] Однако, теперь не знаю как предусмотреть правильный ввод "Sheet3" или "Лист3" взависимости от локали?skais
Попробуйте так: Макрос удаляет событие Worksheet_Change со всех листов активной книги [vba]
Код
Sub sheetsCodeModuleClear() Dim oVBComponent As Object, flag As Boolean, startL&, endL& flag = False 'Проверяем, защищен проект или нет If ActiveWorkbook.VBProject.Protection = 1 Then MsgBox "VBProject выбранной книги защищён." & vbCrLf & _ " Компоненты не будут удалены.", vbExclamation, "Отмена выполнения" Exit Sub End If
On Error Resume Next For Each oVBComponent In ActiveWorkbook.VBProject.VBComponents With oVBComponent If .Type = 100 Then startL = 0: endL = 0 flag = False For i = 1 To .CodeModule.CountOfLines If .CodeModule.Lines(i, 1) Like "*Worksheet_Change*" Then startL = i flag = True End If If flag And .CodeModule.Lines(i, 1) = "End Sub" Then endL = i Exit For End If Next i .CodeModule.DeleteLines startL, endL - startL + 1 End If End With Next oVBComponent Set oVBComponent = Nothing End Sub
[/vba]
Или даже так: [vba]
Код
Function sheetCodeModuleClear(shName As String, eventName As String) Dim oVBComponent As Object, flag As Boolean, startL&, endL& flag = False 'Проверяем, защищен проект или нет If ActiveWorkbook.VBProject.Protection = 1 Then MsgBox "VBProject выбранной книги защищён." & vbCrLf & _ " Компоненты не будут удалены.", vbExclamation, "Отмена выполнения" Exit Function End If
On Error Resume Next For Each oVBComponent In ActiveWorkbook.VBProject.VBComponents With oVBComponent If .Type = 100 Then If .Name = ActiveWorkbook.Sheets(shName).CodeName Then startL = 0: endL = 0 flag = False For i = 1 To .CodeModule.CountOfLines If .CodeModule.Lines(i, 1) Like "*" & eventName & "*" Then startL = i flag = True End If If flag And .CodeModule.Lines(i, 1) = "End Sub" Then endL = i Exit For End If Next i .CodeModule.DeleteLines startL, endL - startL + 1 Exit Function End If End If End With Next oVBComponent Set oVBComponent = Nothing End Function
[/vba][vba]
Код
Sub test() sheetCodeModuleClear "Лист1", "Worksheet_Change" End Sub
[/vba]
Попробуйте так: Макрос удаляет событие Worksheet_Change со всех листов активной книги [vba]
Код
Sub sheetsCodeModuleClear() Dim oVBComponent As Object, flag As Boolean, startL&, endL& flag = False 'Проверяем, защищен проект или нет If ActiveWorkbook.VBProject.Protection = 1 Then MsgBox "VBProject выбранной книги защищён." & vbCrLf & _ " Компоненты не будут удалены.", vbExclamation, "Отмена выполнения" Exit Sub End If
On Error Resume Next For Each oVBComponent In ActiveWorkbook.VBProject.VBComponents With oVBComponent If .Type = 100 Then startL = 0: endL = 0 flag = False For i = 1 To .CodeModule.CountOfLines If .CodeModule.Lines(i, 1) Like "*Worksheet_Change*" Then startL = i flag = True End If If flag And .CodeModule.Lines(i, 1) = "End Sub" Then endL = i Exit For End If Next i .CodeModule.DeleteLines startL, endL - startL + 1 End If End With Next oVBComponent Set oVBComponent = Nothing End Sub
[/vba]
Или даже так: [vba]
Код
Function sheetCodeModuleClear(shName As String, eventName As String) Dim oVBComponent As Object, flag As Boolean, startL&, endL& flag = False 'Проверяем, защищен проект или нет If ActiveWorkbook.VBProject.Protection = 1 Then MsgBox "VBProject выбранной книги защищён." & vbCrLf & _ " Компоненты не будут удалены.", vbExclamation, "Отмена выполнения" Exit Function End If
On Error Resume Next For Each oVBComponent In ActiveWorkbook.VBProject.VBComponents With oVBComponent If .Type = 100 Then If .Name = ActiveWorkbook.Sheets(shName).CodeName Then startL = 0: endL = 0 flag = False For i = 1 To .CodeModule.CountOfLines If .CodeModule.Lines(i, 1) Like "*" & eventName & "*" Then startL = i flag = True End If If flag And .CodeModule.Lines(i, 1) = "End Sub" Then endL = i Exit For End If Next i .CodeModule.DeleteLines startL, endL - startL + 1 Exit Function End If End If End With Next oVBComponent Set oVBComponent = Nothing End Function
[/vba][vba]
Код
Sub test() sheetCodeModuleClear "Лист1", "Worksheet_Change" End Sub
как предусмотреть правильный ввод "Sheet3" или "Лист3" взависимости от локали?
А Вы уверены, что это будет всегда лист с 3-й на конце? [vba]
Код
Sub ttt() Dim oVBComponent As Object, lCountLines As Long On Error Resume Next Set oVBComponent = ActiveWorkbook.VBProject.VBComponents("Sheet3") If Err <> 0 Then Set oVBComponent = ActiveWorkbook.VBProject.VBComponents("Лист3") End If On Error GoTo 0
With oVBComponent lCountLines = .CodeModule.CountOfLines .CodeModule.DeleteLines 1, lCountLines End With Set oVBComponent = Nothing End Sub
[/vba]
skais, 2-й вариант смотрели? [vba]
Код
Function sheetCodeModuleClear(shName As String, eventName As String)
[/vba] shName - Имя листа (НЕ кодовое, т.е. то, которое Вы ведите на ярлычке листа в книге)
как предусмотреть правильный ввод "Sheet3" или "Лист3" взависимости от локали?
А Вы уверены, что это будет всегда лист с 3-й на конце? [vba]
Код
Sub ttt() Dim oVBComponent As Object, lCountLines As Long On Error Resume Next Set oVBComponent = ActiveWorkbook.VBProject.VBComponents("Sheet3") If Err <> 0 Then Set oVBComponent = ActiveWorkbook.VBProject.VBComponents("Лист3") End If On Error GoTo 0
With oVBComponent lCountLines = .CodeModule.CountOfLines .CodeModule.DeleteLines 1, lCountLines End With Set oVBComponent = Nothing End Sub
Можно попроще. Вставляем в код функции, в начало после Dim: [vba]
Код
On Error Resume Next Set oVBComponent = ActiveWorkbook.VBProject.VBComponents(shSheets) If Err <> 0 Then Exit Function End If On Error GoTo 0
[/vba] И затем просто вызываем варианты: [vba]
Код
Sub test() sheetCodeModuleClear "Лист3", "Worksheet_Change" sheetCodeModuleClear "Sheets3", "Worksheet_Change" ' для всех листов в книге For Each sh In ActiveWorkbook.Sheets sheetCodeModuleClear sh.Name, "Worksheet_Change" Next End Sub
[/vba]
Можно попроще. Вставляем в код функции, в начало после Dim: [vba]
Код
On Error Resume Next Set oVBComponent = ActiveWorkbook.VBProject.VBComponents(shSheets) If Err <> 0 Then Exit Function End If On Error GoTo 0
[/vba] И затем просто вызываем варианты: [vba]
Код
Sub test() sheetCodeModuleClear "Лист3", "Worksheet_Change" sheetCodeModuleClear "Sheets3", "Worksheet_Change" ' для всех листов в книге For Each sh In ActiveWorkbook.Sheets sheetCodeModuleClear sh.Name, "Worksheet_Change" Next End Sub
RAN я уже объяснял в сообщении #3. Дело в том, что нужно скопировать информацию без всякого функционала в другую книгу и только определенный лист. А то вызов макроса срабатывает а мароса то нет? да и не нужен.
RAN я уже объяснял в сообщении #3. Дело в том, что нужно скопировать информацию без всякого функционала в другую книгу и только определенный лист. А то вызов макроса срабатывает а мароса то нет? да и не нужен.skais
А все это проистекает из желания "скопировать лист одной строчкой" Вы же через ActiveSheet.SaveAs получаете "другую книгу"?
А если просто создать чистую книгу (или открыть нужную,куда вставляем), скопировать в нее только данные с листа (если надо, предварительно создав чистый лист), и потом сохранить ту книгу (под нужным именем, если надо)? Вот тогда точно не будет в этой другой книге никаких лишних данных и кода, и зачищать ничего не придется...
А все это проистекает из желания "скопировать лист одной строчкой" Вы же через ActiveSheet.SaveAs получаете "другую книгу"?
А если просто создать чистую книгу (или открыть нужную,куда вставляем), скопировать в нее только данные с листа (если надо, предварительно создав чистый лист), и потом сохранить ту книгу (под нужным именем, если надо)? Вот тогда точно не будет в этой другой книге никаких лишних данных и кода, и зачищать ничего не придется...AndreTM
Skype: andre.tm.007 Donate: Qiwi: 9517375010
Сообщение отредактировал AndreTM - Вторник, 20.06.2017, 10:34
AndreTM мне нужно сохранить значения, формат, цвета и размеры ячеек и не нужно сохранять макросы, выпадающие списки и прочие элементы, условное форматирование, чтобы не было потом ссылок на первоисточник (чтобы потом не глючило все из-за отсутствия файлов для обновления, отсутствия макросов да и УФ не будет работать так как завязано на другие листы, которые я не копирую). Если научите как это делать, буду премного благодарен!
AndreTM мне нужно сохранить значения, формат, цвета и размеры ячеек и не нужно сохранять макросы, выпадающие списки и прочие элементы, условное форматирование, чтобы не было потом ссылок на первоисточник (чтобы потом не глючило все из-за отсутствия файлов для обновления, отсутствия макросов да и УФ не будет работать так как завязано на другие листы, которые я не копирую). Если научите как это делать, буду премного благодарен!skais
Так я же примерно написал: - создаем новую книгу, записываем ссылку на чистый лист в ней в объектную переменную - в старой книге выделяем нужный диапазон с данными, исполняем .Copy в буфер - в новой книге, на листе (используя переменную - ссылку на него) указываем ячейку, куда вставлять (а лучше весь диапазон нужный), и делаем .PasteSpecial(xlPasteValues) и тут же сразу же .PasteSpecial(xlPasteFormats) - сохраняем и закрываем новую книгу - сбрасываем выделение (оставшееся от .Copy) в рабочем листе, откуда данные брали
Так я же примерно написал: - создаем новую книгу, записываем ссылку на чистый лист в ней в объектную переменную - в старой книге выделяем нужный диапазон с данными, исполняем .Copy в буфер - в новой книге, на листе (используя переменную - ссылку на него) указываем ячейку, куда вставлять (а лучше весь диапазон нужный), и делаем .PasteSpecial(xlPasteValues) и тут же сразу же .PasteSpecial(xlPasteFormats) - сохраняем и закрываем новую книгу - сбрасываем выделение (оставшееся от .Copy) в рабочем листе, откуда данные бралиAndreTM
AndreTM мне нужно сохранить значения, формат, цвета и размеры ячеек и не нужно сохранять макросы, выпадающие списки и прочие элементы, условное форматирование, чтобы не было потом ссылок на первоисточник
Однако происходит копирование УФ и ссылок. Шило на мыло. Количество операций в обоих вариантах сравнимо, все равно приходится перекрашивать макросом ячейки, удалять УФ, у меня еще макрос удалить в событии, а у Вас вместо копирования листа в новую книгу, создавать новый лист, копировать со старого и вставлять в новый. Но все равно спасибо за вариант.
AndreTM мне нужно сохранить значения, формат, цвета и размеры ячеек и не нужно сохранять макросы, выпадающие списки и прочие элементы, условное форматирование, чтобы не было потом ссылок на первоисточник
Однако происходит копирование УФ и ссылок. Шило на мыло. Количество операций в обоих вариантах сравнимо, все равно приходится перекрашивать макросом ячейки, удалять УФ, у меня еще макрос удалить в событии, а у Вас вместо копирования листа в новую книгу, создавать новый лист, копировать со старого и вставлять в новый. Но все равно спасибо за вариант.skais
Сообщение отредактировал skais - Вторник, 20.06.2017, 18:01
у Вас вместо копирования листа в новую книгу, создавать новый лист, копировать со старого и вставлять в новый.
На самом деле, всё очень даже не так. В вашем варианте (ActiveSheet.Copy) - это неявное и создание новой книги, и копирование листа, и копирование ивентов листа, и копирование форматов и Уф и прочего... В моём же (создать новую/открыть существующую книгу - выбрать/создать пустой лист - скопировать ТОЛЬКО значения, причем ТОЛЬКО необходимого диапазона... а можно и вообще обойтись без копипаста через буфер, но это же тема отдельного разговора
На форуме поискать по словам "сохранение листа в другую/отдельную книгу" не пробовали?
у Вас вместо копирования листа в новую книгу, создавать новый лист, копировать со старого и вставлять в новый.
На самом деле, всё очень даже не так. В вашем варианте (ActiveSheet.Copy) - это неявное и создание новой книги, и копирование листа, и копирование ивентов листа, и копирование форматов и Уф и прочего... В моём же (создать новую/открыть существующую книгу - выбрать/создать пустой лист - скопировать ТОЛЬКО значения, причем ТОЛЬКО необходимого диапазона... а можно и вообще обойтись без копипаста через буфер, но это же тема отдельного разговора
На форуме поискать по словам "сохранение листа в другую/отдельную книгу" не пробовали?AndreTM