Имеется макрос, который сохраняет лист в отдельный файл без формул, только со значениям. [vba]
Код
Sub SaveActiveSheet() On Error Resume Next
Dim Sh As Worksheet: Set Sh = ActiveSheet If Sh Is Nothing Then Exit Sub SU False: DA False NewFileName = GetNewFileName If Len(NewFileName) > 0 Then Sh.Copy ActiveWorkbook.ActiveSheet.Cells.Copy ActiveWorkbook.ActiveSheet.Cells.PasteSpecial xlPasteValuesAndNumberFormats ActiveWorkbook.SaveAs NewFileName ActiveWorkbook.Close False End If SU True: DA True: Set Sh = Nothing End Sub
Sub SU(ByVal Update_Screen As Boolean): Application.ScreenUpdating = Update_Screen: End Sub Sub DA(ByVal Display_Alerts As Boolean): Application.DisplayAlerts = Display_Alerts: End Sub
Function GetNewFileName() As String GetNewFileName = "": InitialFileName = "c:\": NewFileExt = ".xlsx" GetNewFileName = Application.GetSaveAsFilename(InitialFileName, _ "Листы Excel (*" & NewFileExt & "),", , _ "Введите имя файоа", "Сохранить лист") If VarType(GetNewFileName) = vbBoolean Then GetNewFileName = "": Exit Function If GetNewFileName = "False" Or GetNewFileName = "Ложь" Then GetNewFileName = "" End Function
[/vba] Суть проблемы - Когда клацаю на кнопку аля "Сохранить ваш заказ...", то Ексель виснет. Открывает мне еще 2 дополнительные вкладки на панели задач и думает думает думает. Как только формулу убираю, макрос сохранения листа тут же начинает работать без зависания Ексель. Как решить данную проблему?
Я вырезал лист из прайса, где возникает проблема. Файл можно скачать тут, так как он весит 150кб Делаю все в 2010 Екселе.
Прошу помочь понять в чем проблема и как ее решить. Спасибо большое!
День добрый.
Имеется проблема, причину которой понять не могу.
Проблема возникает, если лист защищен (даже если поставлены все галочки).
Есть формула в ячейке М3 в файле, скачать который можно по линку ниже, вида
Имеется макрос, который сохраняет лист в отдельный файл без формул, только со значениям. [vba]
Код
Sub SaveActiveSheet() On Error Resume Next
Dim Sh As Worksheet: Set Sh = ActiveSheet If Sh Is Nothing Then Exit Sub SU False: DA False NewFileName = GetNewFileName If Len(NewFileName) > 0 Then Sh.Copy ActiveWorkbook.ActiveSheet.Cells.Copy ActiveWorkbook.ActiveSheet.Cells.PasteSpecial xlPasteValuesAndNumberFormats ActiveWorkbook.SaveAs NewFileName ActiveWorkbook.Close False End If SU True: DA True: Set Sh = Nothing End Sub
Sub SU(ByVal Update_Screen As Boolean): Application.ScreenUpdating = Update_Screen: End Sub Sub DA(ByVal Display_Alerts As Boolean): Application.DisplayAlerts = Display_Alerts: End Sub
Function GetNewFileName() As String GetNewFileName = "": InitialFileName = "c:\": NewFileExt = ".xlsx" GetNewFileName = Application.GetSaveAsFilename(InitialFileName, _ "Листы Excel (*" & NewFileExt & "),", , _ "Введите имя файоа", "Сохранить лист") If VarType(GetNewFileName) = vbBoolean Then GetNewFileName = "": Exit Function If GetNewFileName = "False" Or GetNewFileName = "Ложь" Then GetNewFileName = "" End Function
[/vba] Суть проблемы - Когда клацаю на кнопку аля "Сохранить ваш заказ...", то Ексель виснет. Открывает мне еще 2 дополнительные вкладки на панели задач и думает думает думает. Как только формулу убираю, макрос сохранения листа тут же начинает работать без зависания Ексель. Как решить данную проблему?
Я вырезал лист из прайса, где возникает проблема. Файл можно скачать тут, так как он весит 150кб Делаю все в 2010 Екселе.
Прошу помочь понять в чем проблема и как ее решить. Спасибо большое!bear_ukraine
Сообщение отредактировал bear_ukraine - Вторник, 09.12.2014, 21:52
If Len(NewFileName) > 0 Then Sh.Copy ActiveWorkbook.ActiveSheet.Cells.Copy ActiveWorkbook.ActiveSheet.Cells.PasteSpecial xlPasteValuesAndNumberFormats ActiveWorkbook.SaveAs NewFileName ActiveWorkbook.Close False End If
[/vba]
Sh.Copy - ясно... ActiveWorkbook.ActiveSheet.Cells.Copy - НЕ ясно... что ты тут копируешь?
Амм... уточняющий вопрос: [vba]
Код
If Len(NewFileName) > 0 Then Sh.Copy ActiveWorkbook.ActiveSheet.Cells.Copy ActiveWorkbook.ActiveSheet.Cells.PasteSpecial xlPasteValuesAndNumberFormats ActiveWorkbook.SaveAs NewFileName ActiveWorkbook.Close False End If
[/vba]
Sh.Copy - ясно... ActiveWorkbook.ActiveSheet.Cells.Copy - НЕ ясно... что ты тут копируешь?Travelstar
Сообщение отредактировал Travelstar - Вторник, 09.12.2014, 21:53
Так же пробовал этот макрос, найденные на просторах инета [vba]
Код
Sub СохранитьЛистВФайл() On Error Resume Next ' название подпапки, в которую по-умолчанию будет предложено сохранить файл Const REPORTS_FOLDER = "Отчёты\" ' создаём папку для файла, если её ещё нет MkDir ThisWorkbook.Path & "\" & REPORTS_FOLDER ' выбираем стартовую папку ChDrive Left(ThisWorkbook.Path, 1): ChDir ThisWorkbook.Path & "\" & REPORTS_FOLDER
' вывод диалогового окна для запроса имени сохраняемого файла Filename = Application.GetSaveAsFilename("отчёт.xls", "Отчёты Excel (*.xls),", , _ "Введите имя файла для сохраняемого отчёта", "Сохранить") ' если пользователь отказался от выбора имени файла - отменяем сохранение листа в файл If VarType(Filename) = vbBoolean Then Exit Sub
' копируем активный лист (при этом создаётся новая книга) Err.Clear: ActiveSheet.Copy: DoEvents If Err Then Exit Sub ' произошла какая-то ошибка при попытке копирования листа
' убеждаемся, что активной книгой является копия листа If ActiveWorkbook.Worksheets.Count = 1 And ActiveWorkbook.Path = "" Then ' сохраняем файл под заданным именем в формате Excel 2003 ActiveWorkbook.SaveAs Filename, xlWorkbookNormal
' закрываем сохранённый файл ' (удалите следующую строку, если закрывать созданный файл не требуется) ActiveWorkbook.Close False End If End Sub
[/vba] Картина все та же - виснет Ексель.
Так же пробовал этот макрос, найденные на просторах инета [vba]
Код
Sub СохранитьЛистВФайл() On Error Resume Next ' название подпапки, в которую по-умолчанию будет предложено сохранить файл Const REPORTS_FOLDER = "Отчёты\" ' создаём папку для файла, если её ещё нет MkDir ThisWorkbook.Path & "\" & REPORTS_FOLDER ' выбираем стартовую папку ChDrive Left(ThisWorkbook.Path, 1): ChDir ThisWorkbook.Path & "\" & REPORTS_FOLDER
' вывод диалогового окна для запроса имени сохраняемого файла Filename = Application.GetSaveAsFilename("отчёт.xls", "Отчёты Excel (*.xls),", , _ "Введите имя файла для сохраняемого отчёта", "Сохранить") ' если пользователь отказался от выбора имени файла - отменяем сохранение листа в файл If VarType(Filename) = vbBoolean Then Exit Sub
' копируем активный лист (при этом создаётся новая книга) Err.Clear: ActiveSheet.Copy: DoEvents If Err Then Exit Sub ' произошла какая-то ошибка при попытке копирования листа
' убеждаемся, что активной книгой является копия листа If ActiveWorkbook.Worksheets.Count = 1 And ActiveWorkbook.Path = "" Then ' сохраняем файл под заданным именем в формате Excel 2003 ActiveWorkbook.SaveAs Filename, xlWorkbookNormal
' закрываем сохранённый файл ' (удалите следующую строку, если закрывать созданный файл не требуется) ActiveWorkbook.Close False End If End Sub
[/vba] Картина все та же - виснет Ексель.bear_ukraine
.cells.copy - копирует полностью все ячейки на листе
В том файле, что для скачивания, там до 300ой строки увешано все формулами. Я не могу сделать прайс на макросах - макросы работают только у 10% клиентов. Я бы и с кнопкой не заморачивался, но начальство хочет, чтоб кнопка была.
Хочу еще раз обратить внимание, что проблема возникает именно в режиме защиты листа (даже если все галочки поставить). Как только защиту снимаешь, все работает.
.cells.copy - копирует полностью все ячейки на листе
В том файле, что для скачивания, там до 300ой строки увешано все формулами. Я не могу сделать прайс на макросах - макросы работают только у 10% клиентов. Я бы и с кнопкой не заморачивался, но начальство хочет, чтоб кнопка была.
Хочу еще раз обратить внимание, что проблема возникает именно в режиме защиты листа (даже если все галочки поставить). Как только защиту снимаешь, все работает.bear_ukraine
Сообщение отредактировал bear_ukraine - Вторник, 09.12.2014, 22:06
Если вы хотите заменить все формулы на значения - то нужно макросом снять защиту с листа - заменить все формулы на значения - потом поставить защиту обратно [vba]
Если вы хотите заменить все формулы на значения - то нужно макросом снять защиту с листа - заменить все формулы на значения - потом поставить защиту обратно [vba]
SLAVICK, спасибо, работает. Т.е. как я понимаю, логика работы следующая: 1. Берется оригинальный лист и при нажатии на кнопку с макросом на этом оригинальном листе меняются ячейки с формулами на сами значения. 2. Потом копируются значения с измененного оригинального листа в новый файл. ?
Если вы хотите заменить все формулы на значения - то нужно макросом снять защиту с листа - заменить все формулы на значения - потом поставить защиту обратно
По моему не правильное утверждение - если убрать эту 1 формулу, то все начинает работать на защищенном листе, при том что там еще остается кучу разных формул. Значит проблема в другом.
SLAVICK, спасибо, работает. Т.е. как я понимаю, логика работы следующая: 1. Берется оригинальный лист и при нажатии на кнопку с макросом на этом оригинальном листе меняются ячейки с формулами на сами значения. 2. Потом копируются значения с измененного оригинального листа в новый файл. ?
Если вы хотите заменить все формулы на значения - то нужно макросом снять защиту с листа - заменить все формулы на значения - потом поставить защиту обратно
По моему не правильное утверждение - если убрать эту 1 формулу, то все начинает работать на защищенном листе, при том что там еще остается кучу разных формул. Значит проблема в другом.bear_ukraine
Сообщение отредактировал bear_ukraine - Вторник, 09.12.2014, 22:39
почти Сначала копируется лист в новую книгу (со всеми его формулами и свойствами) Потом на копии "убиваются" формулы потом сохраняется копия листа. Оригинал при этом остается нетронутым
Поскольку Вы решили защитить лист - многие действия с ним запрещены - поэтому макрос и зависал
ActiveWorkbook.ActiveSheet.Cells.Copy = копия всех ячеек листа ActiveWorkbook.ActiveSheet.Cells.PasteSpecial xlPasteValuesAndNumberFormats = вставка скопированных ячеек как значения и форматы Т.е. Вы копируете ВСЕ ячейки на листе и заменяете ВСЕ формулы значениями
почти Сначала копируется лист в новую книгу (со всеми его формулами и свойствами) Потом на копии "убиваются" формулы потом сохраняется копия листа. Оригинал при этом остается нетронутым
Поскольку Вы решили защитить лист - многие действия с ним запрещены - поэтому макрос и зависал
ActiveWorkbook.ActiveSheet.Cells.Copy = копия всех ячеек листа ActiveWorkbook.ActiveSheet.Cells.PasteSpecial xlPasteValuesAndNumberFormats = вставка скопированных ячеек как значения и форматы Т.е. Вы копируете ВСЕ ячейки на листе и заменяете ВСЕ формулы значениями SLAVICK
Иногда все проще чем кажется с первого взгляда.
Сообщение отредактировал SLAVICK - Вторник, 09.12.2014, 22:45
Поскольку Вы решили защитить лист - многие действия с ним запрещены - поэтому макрос и зависал
Но если убрать формулу из ячейки М3, а все остальные формулы оставить, то макрос на защищенном листе все равно работает) Или формула формуле рознь (хоть меня и берут смутные сомнения что это так)?
Поскольку Вы решили защитить лист - многие действия с ним запрещены - поэтому макрос и зависал
Но если убрать формулу из ячейки М3, а все остальные формулы оставить, то макрос на защищенном листе все равно работает) Или формула формуле рознь (хоть меня и берут смутные сомнения что это так)? bear_ukraine
Сообщение отредактировал bear_ukraine - Вторник, 09.12.2014, 22:45
[/vba] Это касается всех формул. Пока на листе есть защищенные ячейки - макрос будет выдавать ошибку. Чтобы не выдавал два пути - их я уже описал: 1. снять защиту - удалить формулы - поставить защиту 2. не трогать ничего на листе(т.е. не заменять формулы) ... т.е. удалить 2е строки
Формулы формулам не рознь - а вот есть "защищаемые ячейки" и нет. - см. свойства ячейки
Если Вы хотите оставить формулы как есть - просто удалите строки [vba]
[/vba] Это касается всех формул. Пока на листе есть защищенные ячейки - макрос будет выдавать ошибку. Чтобы не выдавал два пути - их я уже описал: 1. снять защиту - удалить формулы - поставить защиту 2. не трогать ничего на листе(т.е. не заменять формулы) ... т.е. удалить 2е строки
Формулы формулам не рознь - а вот есть "защищаемые ячейки" и нет. - см. свойства ячейки SLAVICK
Иногда все проще чем кажется с первого взгляда.
Сообщение отредактировал SLAVICK - Вторник, 09.12.2014, 22:51
Только что еще раз протестил. Видимо действительно я ошибся в своем утверждении, что если убрать 1 формулу, то макрос работает со всеми остальными формулами (видимо когда ранее тестил, забывал ставить защиту перед запуском макроса).
Только что еще раз протестил. Видимо действительно я ошибся в своем утверждении, что если убрать 1 формулу, то макрос работает со всеми остальными формулами (видимо когда ранее тестил, забывал ставить защиту перед запуском макроса).bear_ukraine