Я, вроде бы, там и там как раз и говорил про это. А корректировка... Ну, откорректируйте: - .InitialFileName = iPath в вашем варианте излишен. И, мне кажется, что при одиночном сохранении - подстановка имени файла в диалог более логична - .DisplayAlerts - желательно отключать/включать тогда, когда необходимо подавить сообщения, а не на всё время процедуры - Sheets(Sh.Name). <=> Sh. (не забывайте - Sheets() относится к ActiveWorkbook., так что использование коллекции без указания родителя - чревато) - Попробуйте избавиться от использования ActiveWorkbook. - Процедура массового сохранения может быть с параметром, как раз и определяющим этот ваш "конкретный" лист (или устанавливающий его на ActiveSheet) - Процедуру сохранения одного листа можно заменить на функцию с параметрами, возврат - сохраненное имя; и тогда её можно будет использовать в процедуре массового сохранения, которая будет заключаться только в переборе нужных листов - "Очистку" листа копии тоже можно сделать параметрической - ввести ещё один параметр функции, который будет определять, что именно нужно очистить на листе - И плиз, не надо месседжбоксов! А если очень надо - то просто вызовы процедур оборачиваются в дополнительный интерактив. Ведь ваше сообщение неинформативно - вы же правильность копирования нигде не проверяете.
Я, вроде бы, там и там как раз и говорил про это. А корректировка... Ну, откорректируйте: - .InitialFileName = iPath в вашем варианте излишен. И, мне кажется, что при одиночном сохранении - подстановка имени файла в диалог более логична - .DisplayAlerts - желательно отключать/включать тогда, когда необходимо подавить сообщения, а не на всё время процедуры - Sheets(Sh.Name). <=> Sh. (не забывайте - Sheets() относится к ActiveWorkbook., так что использование коллекции без указания родителя - чревато) - Попробуйте избавиться от использования ActiveWorkbook. - Процедура массового сохранения может быть с параметром, как раз и определяющим этот ваш "конкретный" лист (или устанавливающий его на ActiveSheet) - Процедуру сохранения одного листа можно заменить на функцию с параметрами, возврат - сохраненное имя; и тогда её можно будет использовать в процедуре массового сохранения, которая будет заключаться только в переборе нужных листов - "Очистку" листа копии тоже можно сделать параметрической - ввести ещё один параметр функции, который будет определять, что именно нужно очистить на листе - И плиз, не надо месседжбоксов! А если очень надо - то просто вызовы процедур оборачиваются в дополнительный интерактив. Ведь ваше сообщение неинформативно - вы же правильность копирования нигде не проверяете.AndreTM
Skype: andre.tm.007 Donate: Qiwi: 9517375010
Сообщение отредактировал AndreTM - Вторник, 29.10.2013, 02:50
В этом методе (когда копируется один лист через .Copy без параметров) - никак. Впрочем, я же показывал: сразу после копирования - назначаем ActiveWorkbook объектной переменной. И дальше работаем исключительно с ней. В других же случаях - методы возвращают ссылку на книгу, например: [vba]
Код
Set NewWB = Workbooks.Add
[/vba]
В этом методе (когда копируется один лист через .Copy без параметров) - никак. Впрочем, я же показывал: сразу после копирования - назначаем ActiveWorkbook объектной переменной. И дальше работаем исключительно с ней. В других же случаях - методы возвращают ссылку на книгу, например: [vba]
Андрей, я не себя имел ввиду. Ибо данный пример сделан на моем уровне познания VBA. И пример по теме может быть не только мой. Так что, предлагайте свои варианты.
Андрей, я не себя имел ввиду. Ибо данный пример сделан на моем уровне познания VBA. И пример по теме может быть не только мой. Так что, предлагайте свои варианты.Wasilich
Private Sub Save_as() 10 With Application.FileDialog(msoFileDialogSaveAs) 20 .InitialFileName = ThisWorkbook.Path & "\" & "Сравнение" 30 If .Show = 0 Then Exit Sub 40 ThisWorkbook.ActiveSheet.Copy 50 Application.DisplayAlerts = False 60 .Execute 70 Application.DisplayAlerts = True 80 End With 90 ActiveWorkbook.Close False End Sub
[/vba]
Wasilic, вариант для 1 листа [vba]
Код
Private Sub Save_as() 10 With Application.FileDialog(msoFileDialogSaveAs) 20 .InitialFileName = ThisWorkbook.Path & "\" & "Сравнение" 30 If .Show = 0 Then Exit Sub 40 ThisWorkbook.ActiveSheet.Copy 50 Application.DisplayAlerts = False 60 .Execute 70 Application.DisplayAlerts = True 80 End With 90 ActiveWorkbook.Close False End Sub
Private Sub Save_as() With Application.FileDialog(msoFileDialogSaveAs) .InitialFileName = ThisWorkbook.Path & "\" & "Сравнение" If .Show = 0 Then Exit Sub ThisWorkbook.ActiveSheet.Copy Application.DisplayAlerts = False .Execute Application.DisplayAlerts = True End With ActiveWorkbook.Close False End Sub
[/vba]
Любой каприз ....
Вариант для 1 листа [vba]
Код
Private Sub Save_as() With Application.FileDialog(msoFileDialogSaveAs) .InitialFileName = ThisWorkbook.Path & "\" & "Сравнение" If .Show = 0 Then Exit Sub ThisWorkbook.ActiveSheet.Copy Application.DisplayAlerts = False .Execute Application.DisplayAlerts = True End With ActiveWorkbook.Close False End Sub
Файл качать надо, а по коду сразу может быть понятно - не то.
Это нам с тобой просто, посмотрел и понятно. А тем кто знает, что "никто не знает" - сложновато будет. А, в фале оно уже как бы и работает. ИМХО. Wasilich
В приложении еще один простенький вариант сохранения. Изначальный код мне скинул antal10, переделал под свои нужды.
[vba]
Код
Private Sub SaveSheets_Click() Dim Fname As String Application.ScreenUpdating = False Fname = ThisWorkbook.Path & "\" & Sheets("Sheet1").Range("A1").Value & " " & Range("B1").Text & ".xls" 'тут название файла состоит из названия фирмы и нр. счета Sheets(Array("Sheet1", "Sheet2")).Copy 'указываем листы, которые хотим оставить Sheets("Sheet1").Shapes("SaveSheets").Delete 'удаляем ненужные кнопки (в моем случае у меня есть кнопки, которые должны остаться) With ActiveWorkbook Application.DisplayAlerts = False .SaveAs Filename:=Fname Application.ScreenUpdating = True Application.DisplayAlerts = True '.Close End With Workbooks("Book_Save.xls").Close 0 End Sub
[/vba]
П.С. Только вот никак не получается сделать так, чтобы модуль (функция) тоже копировался в новую книгу. Там у меня сумма прописью. Можно в принципе и значение только копировать, не обязательно с модулем - как проще. Если не сложно help подскажите!)
Всем добрый.
В приложении еще один простенький вариант сохранения. Изначальный код мне скинул antal10, переделал под свои нужды.
[vba]
Код
Private Sub SaveSheets_Click() Dim Fname As String Application.ScreenUpdating = False Fname = ThisWorkbook.Path & "\" & Sheets("Sheet1").Range("A1").Value & " " & Range("B1").Text & ".xls" 'тут название файла состоит из названия фирмы и нр. счета Sheets(Array("Sheet1", "Sheet2")).Copy 'указываем листы, которые хотим оставить Sheets("Sheet1").Shapes("SaveSheets").Delete 'удаляем ненужные кнопки (в моем случае у меня есть кнопки, которые должны остаться) With ActiveWorkbook Application.DisplayAlerts = False .SaveAs Filename:=Fname Application.ScreenUpdating = True Application.DisplayAlerts = True '.Close End With Workbooks("Book_Save.xls").Close 0 End Sub
[/vba]
П.С. Только вот никак не получается сделать так, чтобы модуль (функция) тоже копировался в новую книгу. Там у меня сумма прописью. Можно в принципе и значение только копировать, не обязательно с модулем - как проще. Если не сложно help подскажите!)DAKRAY
Прошу вашей помощи! Подскажите как изменить код таким образом, что бы был прописан конкретный адрес для сохранения нового файла, а не ручной выбор. За ранее спасибо!
Прошу вашей помощи! Подскажите как изменить код таким образом, что бы был прописан конкретный адрес для сохранения нового файла, а не ручной выбор. За ранее спасибо!shebelme
Не претендую ни на что, просто я делаю так (возможно кому-то пригодится идея)
[vba]
Код
'сохранить лист в отдельном файле 'sSheetName - имя сохраняемого листа (если такого нет - ни чего не делается) 'sNewFileName - имя файла (если не задано - берется имя листа) 'sNewPath - куда сохраняем, если не задано, в текущую 'sRngDelList - если надо указываем диапазоны столбцов для удаления 'bDelFurmula - если указано - удаляем формулы и ссылки 'sSubRun - если нужна дополнительная обработка - укажим нужную процедуру Function fnSheetsSave(ByVal sSheetName As String, _ Optional ByVal sNewFileName As String = "", _ Optional ByVal sNewPath As String = "", _ Optional ByVal sRngDelList As String = "", _ Optional ByVal bDelFurmula As Boolean = False, _ Optional ByVal sSubRun As String = "") As Boolean
Dim sFullFileName As String, arDelCol, iI As Integer, sCol As String Dim strPS As String: strPS = Application.PathSeparator
fnSheetsSave = False
If Not fnSheetsIsExist(sSheetName) Then Exit Function
TRC.Pop "fnSheetsSave" TRC.INFO "Сохранение листа в отдельную книгу", eColorBloc
If sNewFileName = "" Then sNewFileName = sSheetName
mChkPath: 'проверим и если что, сформируем путь If sNewPath = "" Then sNewPath = ActiveWorkbook.path & strPS Else If Right(sNewPath, 1) <> strPS Then sNewPath = sNewPath & strPS If Not fnPathIsExists(sNewPath) Then sNewPath = "" GoTo mChkPath End If End If
'создаем полный путь к новому файлу sFullFileName = sNewPath & sNewFileName & IIf(fnGetFileExt(sNewFileName) = "", ".xls", "")
'возможен долгий процесс, поэтому 'дадим возможность поработать другим DoEvents
On Error Resume Next 'создаем копию листа... 'создается новая книга и она становится активной ThisWorkbook.Sheets(sSheetName).Copy TRC.NOERROR "Лист скопирован в новую книгу (" & sSheetName & ")" If TRC.IFERROR("ОШИБКА копирования листа (" & sSheetName & ") %1") Then GoTo lEXITfnSheetsSave 'после возможно долгого процесса 'дадим возможность поработать другим DoEvents
Application.ScreenUpdating = False
If bDelFurmula = True Then 'убираем ссылки и формулы ActiveSheet.Range("A1").CurrentRegion.Value = ActiveSheet.Range("A1").CurrentRegion.Value TRC.INFO "Формулы удалены" End If
'однозначно убираем перенос по словам ActiveSheet.Range("A1").CurrentRegion.WrapText = False
'если указаны столбцы на удаление - удалим их If sRngDelList <> "" Then arDelCol = Split(sRngDelList, " ") For iI = 0 To UBound(arDelCol) sCol = arDelCol(iI) ActiveSheet.Range(sCol).Delete Next iI TRC.INFO "Столбцы удалены (" & sRngDelList & ")" End If
'если указана дополнительная функция для обработки - выполним ее If sSubRun <> "" Then Application.Run sSubRun TRC.INFO "Функция дополнительной обработки выполнена (" & sSubRun & ")" End If
'сохраняем файл со всеми изменениями ActiveWorkbook.SaveCopyAs sFullFileName ActiveWorkbook.Close SaveChanges:=False TRC.NOERROR "Новая книга сохранена (" & sFullFileName & ")" If TRC.IFERROR("ОШИБКА! Книга не сохранена (" & sFullFileName & ") %1") Then GoTo lEXITfnSheetsSave
fnSheetsSave = True
lEXITfnSheetsSave:
Application.ScreenUpdating = True
TRC.Push
End Function
[/vba]
Не претендую ни на что, просто я делаю так (возможно кому-то пригодится идея)
[vba]
Код
'сохранить лист в отдельном файле 'sSheetName - имя сохраняемого листа (если такого нет - ни чего не делается) 'sNewFileName - имя файла (если не задано - берется имя листа) 'sNewPath - куда сохраняем, если не задано, в текущую 'sRngDelList - если надо указываем диапазоны столбцов для удаления 'bDelFurmula - если указано - удаляем формулы и ссылки 'sSubRun - если нужна дополнительная обработка - укажим нужную процедуру Function fnSheetsSave(ByVal sSheetName As String, _ Optional ByVal sNewFileName As String = "", _ Optional ByVal sNewPath As String = "", _ Optional ByVal sRngDelList As String = "", _ Optional ByVal bDelFurmula As Boolean = False, _ Optional ByVal sSubRun As String = "") As Boolean
Dim sFullFileName As String, arDelCol, iI As Integer, sCol As String Dim strPS As String: strPS = Application.PathSeparator
fnSheetsSave = False
If Not fnSheetsIsExist(sSheetName) Then Exit Function
TRC.Pop "fnSheetsSave" TRC.INFO "Сохранение листа в отдельную книгу", eColorBloc
If sNewFileName = "" Then sNewFileName = sSheetName
mChkPath: 'проверим и если что, сформируем путь If sNewPath = "" Then sNewPath = ActiveWorkbook.path & strPS Else If Right(sNewPath, 1) <> strPS Then sNewPath = sNewPath & strPS If Not fnPathIsExists(sNewPath) Then sNewPath = "" GoTo mChkPath End If End If
'создаем полный путь к новому файлу sFullFileName = sNewPath & sNewFileName & IIf(fnGetFileExt(sNewFileName) = "", ".xls", "")
'возможен долгий процесс, поэтому 'дадим возможность поработать другим DoEvents
On Error Resume Next 'создаем копию листа... 'создается новая книга и она становится активной ThisWorkbook.Sheets(sSheetName).Copy TRC.NOERROR "Лист скопирован в новую книгу (" & sSheetName & ")" If TRC.IFERROR("ОШИБКА копирования листа (" & sSheetName & ") %1") Then GoTo lEXITfnSheetsSave 'после возможно долгого процесса 'дадим возможность поработать другим DoEvents
Application.ScreenUpdating = False
If bDelFurmula = True Then 'убираем ссылки и формулы ActiveSheet.Range("A1").CurrentRegion.Value = ActiveSheet.Range("A1").CurrentRegion.Value TRC.INFO "Формулы удалены" End If
'однозначно убираем перенос по словам ActiveSheet.Range("A1").CurrentRegion.WrapText = False
'если указаны столбцы на удаление - удалим их If sRngDelList <> "" Then arDelCol = Split(sRngDelList, " ") For iI = 0 To UBound(arDelCol) sCol = arDelCol(iI) ActiveSheet.Range(sCol).Delete Next iI TRC.INFO "Столбцы удалены (" & sRngDelList & ")" End If
'если указана дополнительная функция для обработки - выполним ее If sSubRun <> "" Then Application.Run sSubRun TRC.INFO "Функция дополнительной обработки выполнена (" & sSubRun & ")" End If
'сохраняем файл со всеми изменениями ActiveWorkbook.SaveCopyAs sFullFileName ActiveWorkbook.Close SaveChanges:=False TRC.NOERROR "Новая книга сохранена (" & sFullFileName & ")" If TRC.IFERROR("ОШИБКА! Книга не сохранена (" & sFullFileName & ") %1") Then GoTo lEXITfnSheetsSave
Private Sub Save_as() 10 With Application.FileDialog(msoFileDialogSaveAs) 20 .InitialFileName = ThisWorkbook.Path & "\" & "Сравнение" 30 If .Show = 0 Then Exit Sub 40 ThisWorkbook.ActiveSheet.Copy 50 Application.DisplayAlerts = False 60 .Execute 70 Application.DisplayAlerts = True 80 End With 90 ActiveWorkbook.Close False End Sub
Пригодился идеально ваш код. Спасибо.
Попытался из него сделать надстройку. Чтобы добавить ссылку на макрос в панель быстрого запуска эксель. Сохранив его в формате надстройки. В этом случае не работает, только из этого же файла. Подскажите пожалуйста как его сделать для надстройки.
В нём имя изменил, для того чтобы формировал имя из ячеек на листе.
[vba]
Код
Sub Save_as() 10 With Application.FileDialog(msoFileDialogSaveAs) 20 .InitialFileName = [b3] & " " & [b8] 30 If .Show = 0 Then Exit Sub 40 ThisWorkbook.ActiveSheet.Copy 50 Application.DisplayAlerts = False 60 .Execute 70 Application.DisplayAlerts = True 80 End With 90 ActiveWorkbook.Close False End Sub
Private Sub Save_as() 10 With Application.FileDialog(msoFileDialogSaveAs) 20 .InitialFileName = ThisWorkbook.Path & "\" & "Сравнение" 30 If .Show = 0 Then Exit Sub 40 ThisWorkbook.ActiveSheet.Copy 50 Application.DisplayAlerts = False 60 .Execute 70 Application.DisplayAlerts = True 80 End With 90 ActiveWorkbook.Close False End Sub
Пригодился идеально ваш код. Спасибо.
Попытался из него сделать надстройку. Чтобы добавить ссылку на макрос в панель быстрого запуска эксель. Сохранив его в формате надстройки. В этом случае не работает, только из этого же файла. Подскажите пожалуйста как его сделать для надстройки.
В нём имя изменил, для того чтобы формировал имя из ячеек на листе.
[vba]
Код
Sub Save_as() 10 With Application.FileDialog(msoFileDialogSaveAs) 20 .InitialFileName = [b3] & " " & [b8] 30 If .Show = 0 Then Exit Sub 40 ThisWorkbook.ActiveSheet.Copy 50 Application.DisplayAlerts = False 60 .Execute 70 Application.DisplayAlerts = True 80 End With 90 ActiveWorkbook.Close False End Sub
[/vba]
[moder]Оформляйте коды тегами Кнопка #[/moder]kbcgv
Сообщение отредактировал DJ_Marker_MC - Суббота, 10.01.2015, 16:28